Skip to content

Cut Release Branch

Cut Release Branch #9

# 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
CREATE_RELEASE_BRANCH:
description: Whether to cut the release branch. You shouldnt skip this unless it has already been completed successfully (yes/no)
required: true
default: 'yes'
permissions:
contents: write
pull-requests: write
jobs:
update_release_branch:
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@v4
- 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}
if: ${{github.event.inputs.CREATE_RELEASE_BRANCH == 'yes'}}
update_master:
needs: update_release_branch
runs-on: ubuntu-latest
env:
MASTER_BRANCH: master
NEXT_RELEASE: ${{ github.event.inputs.NEXT_VERSION }}
SCRIPT_DIR: ./release/src/main/scripts
RELEASE: ${{ github.event.inputs.RELEASE_VERSION }}
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@v4
- 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' | 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 .asf.yaml to protect new release branch from force push
run: |
sed -i -e "s/master: {}/master: {}\n release-${RELEASE}: {}/g" .asf.yaml
- 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 add .asf.yaml
git commit -m "Moving to ${NEXT_VERSION_IN_BASE_BRANCH}-SNAPSHOT on master branch."
git push origin ${MASTER_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 }}
RELEASE_BRANCH: release-${{ 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@v4
- 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.json
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 -b apache:${RELEASE_BRANCH} -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."