# Uploading New Gradle Version for CI to CIPD

We store multiple Gradle version packages on CIPD for use on CI. For more information read the internal
docs [here](https://goto.google.com/luci-cipd).

Some links in the instructions below are Google-internal.

## Steps

### Request Access to CIPD

1. Request temporary write access to upload packages to CIPD
   via https://goto.google.com/flutter-luci-cipd#requesting-write-read-access-to-cipd-packages.

2. Wait about 5-30 minutes for access rights to sync. To check if your rights have synced, see if
   you are a member of this
   group [here](https://chrome-infra-auth.appspot.com/auth/groups/google%2Fflutter-cipd-writers@twosync.google.com).

### Identify the New Gradle Version

3. Identify the new Gradle Version to include in the upload script. From the dev folder run:
   ```sh
   git grep "distributionUrl" | sed -E 's/.*\/gradle-([0-9.]+[^.]*)\.zip.*/\1/'
   ```
   For REPLACEME versions check the ModuleTest versions
   [here](https://github.com/flutter/flutter/blob/master/dev/devicelab/bin/tasks/build_android_host_app_with_module_aar.dart#L449-L456).

4. Update the versions array with these new versions in the generate_gradle_cipd_packages.dart script. Gradle distributions in the dev folder should only use the 'bin' distribution type.

### Upload to CIPD

5. To run CIPD commands, please run this command:

    ```sh
    cipd auth-login
    ```

6. Dry run the generate_gradle_cipd_packages.dart script from the root of
   the flutter checkout:

    ```sh
    dart run engine/src/flutter/tools/gradle/generate_gradle_cipd_packages.dart --dry-run
    ```

7. Ensure everything looks correct fo the dry run.

   Note: Please check you have the correct name, tags, package structure before uploading to CIPD
   because deleting the package on CIPD is difficult.

8. Run without `--dry-run`

9. Check to see if your new Gradle version has successfully uploaded to CIPD by clicking on the
   relevant dir [here](https://chrome-infra-packages.appspot.com/p/flutter/gradle_dists).

### Troubleshooting CIPD (Optional)

If you accidentally uploaded the incorrect package to CIPD, you can delete the tag using these
instructions [here](https://goto.google.com/flutter-luci-playbook#remove-duplicated-cipd-tags).
Then, re-upload the correct Gradle version package to CIPD.
