| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| # This workflow will update apache beam master branch with next release version |
| # and cut release branch for current development version. |
| |
| # To learn more about GitHub Actions in Apache Beam check the CI.md |
| |
| # Workflow used after https://github.com/apache/beam/commit/4183e747becebd18becee5fff547af365910fc9c |
| # If help is needed debugging issues, you can view the cut_release_branch.sh and start_snapshot_build.sh scripts at that commit |
| # for guidance on how to do this manually. |
| # (https://github.com/apache/beam/blob/4183e747becebd18becee5fff547af365910fc9c/release/src/main/scripts/cut_release_branch.sh and |
| # https://github.com/apache/beam/blob/4183e747becebd18becee5fff547af365910fc9c/release/src/main/scripts/start_snapshot_build.sh). |
| name: Cut Release Branch |
| on: |
| workflow_dispatch: |
| inputs: |
| RELEASE_VERSION: |
| description: Beam version of current release |
| required: true |
| default: '2.XX.0' |
| NEXT_VERSION: |
| description: Next release version |
| required: true |
| default: '2.XX.0' |
| JENKINS_USERNAME: |
| description: Username of the current Jenkins user. Used to update mass_comment.py with all Jenkins jobs. |
| required: true |
| JENKINS_TOKEN: |
| description: API Token for the current Jenkins user. Can be generated at https://ci-beam.apache.org/user/<user>/configure |
| required: true |
| |
| permissions: |
| contents: write |
| |
| jobs: |
| update_master: |
| runs-on: ubuntu-latest |
| env: |
| MASTER_BRANCH: master |
| NEXT_RELEASE: ${{ github.event.inputs.NEXT_VERSION }} |
| SCRIPT_DIR: ./release/src/main/scripts |
| steps: |
| - name: Mask Jenkins token |
| run: | |
| echo "::add-mask::$JENKINS_TOKEN" |
| env: |
| JENKINS_TOKEN: ${{ github.event.inputs.JENKINS_TOKEN }} |
| - name: Validate Next Version |
| run: | |
| if [[ $NEXT_RELEASE =~ ([0-9]+\.[0-9]+\.[0-9]+) ]]; then |
| echo "NEXT_VERSION_IN_BASE_BRANCH=${BASH_REMATCH[1]}" >> $GITHUB_ENV |
| else |
| echo "The input for NEXT_RELEASE does not match a valid format [0-9]+\.[0-9]+\.[0-9]+" |
| exit 1 |
| fi |
| - name: Check out code |
| uses: actions/checkout@v3 |
| - name: Set git config |
| run: | |
| git config user.name $GITHUB_ACTOR |
| git config user.email actions@"$RUNNER_NAME".local |
| - name: Install xmllint |
| run: sudo apt-get install -y libxml2-utils |
| - name: Update mass_comment.py with new Jenkins jobs |
| run: | |
| rm release/src/main/scripts/jenkins_jobs.txt |
| for obj in $(curl https://ci-beam.apache.org/api/json | jq '.jobs[]' -c); do |
| echo $obj |
| url=$(echo $obj | jq '.url' -r || echo "") |
| name=$(echo $obj | jq '.name' -r || echo "") |
| if [ "$url" != "" ] && [ "$name" != "" ]; then |
| curl --user $JENKINS_USERNAME:$JENKINS_TOKEN $url/config.xml > /tmp/config.xml |
| |
| if [ "$(xmllint --xpath 'string(//disabled)' /tmp/config.xml)" = "true" ]; then |
| echo "SKIPPING $url - disabled" |
| else |
| phrase=$(xmllint --xpath 'string(//triggers/org.jenkinsci.plugins.ghprb.GhprbTrigger/triggerPhrase)' /tmp/config.xml) |
| if [ "$phrase" != "" ]; then |
| echo "Appending ${phrase},${name}" |
| echo "${phrase},${name}" >> /tmp/result |
| fi |
| fi |
| |
| rm /tmp/config.xml |
| fi |
| done |
| |
| cat /tmp/result | sort | uniq | grep -i -E 'precommit|postcommit|validates|vr|example|test|gradle build' | grep -v -i -E 'load|perf|website' >> release/src/main/scripts/jenkins_jobs.txt |
| env: |
| JENKINS_USERNAME: ${{ github.event.inputs.JENKINS_USERNAME }} |
| JENKINS_TOKEN: ${{ github.event.inputs.JENKINS_TOKEN }} |
| - name: Update master branch |
| run: | |
| bash "${SCRIPT_DIR}/set_version.sh" "${NEXT_VERSION_IN_BASE_BRANCH}" |
| echo "==============Update master branch as following================" |
| git diff |
| echo "===============================================================" |
| - name: Commit and Push to master branch files with Next Version |
| run: | |
| git add * |
| git commit -m "Moving to ${NEXT_VERSION_IN_BASE_BRANCH}-SNAPSHOT on master branch." |
| git push origin ${MASTER_BRANCH} |
| |
| update_release_branch: |
| needs: update_master |
| runs-on: ubuntu-latest |
| env: |
| RELEASE: ${{ github.event.inputs.RELEASE_VERSION }} |
| steps: |
| - name: Validate Release Version |
| run: | |
| if [[ ${RELEASE} =~ ([0-9]+\.[0-9]+\.[0-9]+) ]]; then |
| echo "RELEASE_VERSION=${BASH_REMATCH[1]}" >> $GITHUB_ENV |
| echo "RELEASE_BRANCH=release-${RELEASE}" >> $GITHUB_ENV |
| else |
| echo "The input for RELEASE does not match a valid format [0-9]+\.[0-9]+\.[0-9]+" |
| exit 1 |
| fi |
| - name: Check out code |
| uses: actions/checkout@v3 |
| - name: Set git config |
| run: | |
| git config user.name $GITHUB_ACTOR |
| git config user.email actions@"$RUNNER_NAME".local |
| - name: Checkout to release branch |
| run: | |
| git checkout -b ${RELEASE_BRANCH} |
| echo "==================Current working branch=======================" |
| echo ${RELEASE_BRANCH} |
| echo "===============================================================" |
| - name: Update release version for dataflow runner |
| run: | |
| sed -i -e "s/'beam-master-.*'/'${RELEASE}'/g" \ |
| runners/google-cloud-dataflow-java/build.gradle |
| echo "===============Update release branch as following==============" |
| git diff |
| echo "===============================================================" |
| - name: Commit and Push to release branch |
| run: | |
| git add runners/google-cloud-dataflow-java/build.gradle |
| git commit -m "Set Dataflow container to release version." |
| git push --set-upstream origin ${RELEASE_BRANCH} |
| |
| start_snapshot_build: |
| needs: update_master |
| runs-on: ubuntu-latest |
| env: |
| REMOTE_NAME: remote_repo |
| REMOTE_URL: ${{ github.server_url }}/${{ github.repository }} |
| BRANCH_NAME: snapshot_build-${{ github.event.inputs.RELEASE_VERSION }} |
| steps: |
| - name: Install Hub |
| run: | |
| cd ~ |
| wget https://github.com/github/hub/releases/download/v2.14.2/hub-linux-amd64-2.14.2.tgz |
| tar zvxvf hub-linux-amd64-2.14.2.tgz |
| sudo ./hub-linux-amd64-2.14.2/install |
| echo "eval "$(hub alias -s)"" >> ~/.bashrc |
| - uses: actions/checkout@v3 |
| - name: Set git config |
| run: | |
| git config user.name $GITHUB_ACTOR |
| git config user.email actions@"$RUNNER_NAME".local |
| - name: Create Snapshot Branch |
| run: | |
| git remote add ${REMOTE_NAME} ${REMOTE_URL} |
| git checkout -b ${BRANCH_NAME} |
| touch empty_file.txt |
| git add -A |
| git commit -m "Add empty file in order to create PR" |
| git push -f ${REMOTE_NAME} |
| - name: Create Pull Request |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| run: | |
| hub pull-request -F- <<<"[DO NOT MERGE]Start snapshot build for release process |
| |
| |
| Run Gradle Publish" |
| |
| echo "NOTE: If there is no jenkins job started, please comment generated PR with: Run Gradle Publish" |
| echo "Things remained you need to do manually after build successful:" |
| echo "1. Close this generated PR in github website." |
| echo "2. Delete your remote branch ${BRANCH_NAME} form your beam repo in github website." |