name: Update OTP Patch Versions for Bazel Based Workflows on: schedule: - cron: '0 3 * * *' workflow_dispatch: jobs: update-toolchains: name: Update OTP Versions runs-on: ubuntu-20.04 strategy: max-parallel: 1 fail-fast: false matrix: erlang_version: - "24.3" - "25.0" - "25.1" - "25.2" - "25.3" - "26.0" include: - erlang_version: "24.3" name: '24' branch: v3.10.x labels: "" - erlang_version: "25.0" name: '25_0' branch: main labels: | backport-v3.12.x backport-v3.11.x - erlang_version: "25.1" name: '25_1' branch: main labels: | backport-v3.12.x backport-v3.11.x backport-v3.10.x - erlang_version: "25.2" name: '25_2' branch: main labels: | backport-v3.12.x backport-v3.11.x backport-v3.10.x - erlang_version: "25.3" name: '25_3' branch: main labels: | backport-v3.12.x backport-v3.11.x backport-v3.10.x - erlang_version: "26.0" name: '26' branch: main labels: | backport-v3.12.x backport-v3.11.x timeout-minutes: 10 env: branch: bump-otp-${{ matrix.erlang_version }} steps: - name: CHECKOUT REPOSITORY uses: actions/checkout@v3 with: ref: ${{ matrix.branch }} - name: FAIL IF THE PR ALREADY EXISTS id: check-for-branch run: | set +e if git ls-remote --exit-code --heads origin ${{ env.branch }}; then echo "Branch ${{ env.branch }} already exits" exit 1 fi - name: DETERMINE LATEST PATCH & SHA id: fetch-version run: | TAG_NAME=$(curl -s GET https://api.github.com/repos/erlang/otp/tags?per_page=100 \ | jq -r 'map(select(.name | contains("OTP-${{ matrix.erlang_version }}"))) | first | .name') VERSION=${TAG_NAME#OTP-} if [[ -z "${VERSION}" ]]; then echo "Failed to determine latest VERSION for OTP-${{ matrix.erlang_version }}" exit 1 fi ARCHIVE_RBE_URL="https://github.com/erlang/otp/releases/download/${TAG_NAME}/otp_src_${VERSION}.tar.gz" wget --continue --quiet --output-document="/tmp/otp_src_${VERSION}.tar.gz" "${ARCHIVE_RBE_URL}" SHA="$(shasum -a 256 "/tmp/otp_src_${VERSION}.tar.gz" | awk '{print $1}')" if [[ -z "${SHA}" ]]; then echo "Failed to determine SHA for ${TAG_NAME}" exit 1 fi ARCHIVE_OCI_URL="https://github.com/erlang/otp/archive/OTP-${VERSION}.tar.gz" wget --continue --quiet --output-document="/tmp/OTP-${VERSION}.tar.gz" "${ARCHIVE_OCI_URL}" SHA2="$(shasum -a 256 "/tmp/OTP-${VERSION}.tar.gz" | awk '{print $1}')" if [[ -z "${SHA2}" ]]; then echo "Failed to determine SHA2 for ${TAG_NAME}" exit 1 fi echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT echo "SHA=${SHA}" >> $GITHUB_OUTPUT echo "SHA2=${SHA2}" >> $GITHUB_OUTPUT - name: MODIFY VERSION FILE run: | sudo npm install --global --silent @bazel/buildozer OLD_SHA="$(cat MODULE.bazel | buildozer 'print sha256' -:${{ matrix.name }})" OLD_VERSION="$(cat MODULE.bazel | buildozer 'print version' -:${{ matrix.name }})" echo "$(cat MODULE.bazel | buildozer 'set sha256 "${{ steps.fetch-version.outputs.SHA }}"' -:${{ matrix.name }})" > MODULE.bazel echo "$(cat MODULE.bazel | buildozer 'set version "${{ steps.fetch-version.outputs.VERSION }}"' -:${{ matrix.name }})" > MODULE.bazel echo "$(cat WORKSPACE | buildozer 'set downloaded_file_path "OTP-${{ steps.fetch-version.outputs.VERSION }}.tar.gz"' -:otp_src_${{ matrix.name }})" > WORKSPACE echo "$(cat WORKSPACE | buildozer 'set urls ["https://github.com/erlang/otp/archive/OTP-${{ steps.fetch-version.outputs.VERSION }}.tar.gz"]' -:otp_src_${{ matrix.name }})" > WORKSPACE echo "$(cat WORKSPACE | buildozer 'set sha256 "${{ steps.fetch-version.outputs.SHA2 }}"' -:otp_src_${{ matrix.name }})" > WORKSPACE cat << EOF > replacer.mjs import { readFile, writeFile } from 'node:fs/promises'; let [_node, _script, s, p, r] = process.argv; let source = await readFile(s, 'utf-8'); let pattern = await readFile(p, 'utf-8'); let replacement = await readFile(r, 'utf-8'); if (!source.includes(pattern)) process.exit(1); let updated = source.replace(pattern, replacement); await writeFile(s, updated); EOF cat << EOF > old.txt internal_erlang_from_github_release( name = "${{ matrix.name }}", sha256 = "${OLD_SHA}", version = "${OLD_VERSION}", ), EOF cat << EOF > new.txt internal_erlang_from_github_release( name = "${{ matrix.name }}", sha256 = "${{ steps.fetch-version.outputs.SHA }}", version = "${{ steps.fetch-version.outputs.VERSION }}", ), EOF node replacer.mjs WORKSPACE old.txt new.txt rm replacer.mjs old.txt new.txt set -x git diff - name: CREATE PULL REQUEST uses: peter-evans/create-pull-request@v5.0.1 with: token: ${{ secrets.REPO_SCOPED_TOKEN }} committer: GitHub author: GitHub title: Adopt otp ${{ steps.fetch-version.outputs.VERSION }} body: > Automated changes created by ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} using the [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action in the ${{ github.workflow }} workflow. commit-message: | Adopt otp ${{ steps.fetch-version.outputs.VERSION }} labels: ${{ matrix.labels }} branch: ${{ env.branch }} delete-branch: true