blob: 6414501f1808e93ee2f8398e4d6cf7eed728b51c [file] [log] [blame]
name: finalize_release
# Workflow added after https://github.com/apache/beam/commit/4183e747becebd18becee5fff547af365910fc9c
# If help is needed debugging issues, you can view the release guide at that commit for guidance on how to do this manually.
# (https://github.com/apache/beam/blob/4183e747becebd18becee5fff547af365910fc9c/website/www/site/content/en/contribute/release-guide.md)
on:
workflow_dispatch:
inputs:
RELEASE:
description: Beam version of current release (e.g. 2.XX.0)
required: true
default: '2.XX.0'
RC:
description: Integer RC version for the release that we'd like to finalize (e.g. 3 for RC3)
required: true
PYPI_API_TOKEN:
description: PyPi API token to perform the PyPi upload with
required: false
PUSH_DOCKER_ARTIFACTS:
description: Whether to push SDK docker images to docker hub Apache organization. Should be yes unless you've already completed this step.
required: true
default: 'no'
PUBLISH_PYTHON_ARTIFACTS:
description: Whether to publish the python artifacts into PyPi. Should be yes unless you've already completed this step.
required: true
default: 'no'
TAG_RELEASE:
description: Whether to tag the release on GitHub. Should be yes unless you've already completed this step.
required: true
default: 'no'
env:
DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
permissions:
contents: write
pull-requests: write
jobs:
push_docker_artifacts:
if: ${{github.event.inputs.PUSH_DOCKER_ARTIFACTS == 'yes'}}
runs-on: [self-hosted, ubuntu-20.04, main]
steps:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Publish to Docker
env:
RELEASE: "${{ github.event.inputs.RELEASE }}"
RC_NUM: "${{ github.event.inputs.RC }}"
RC_VERSION: "rc${{ github.event.inputs.RC }}"
run: |
echo "Publish SDK docker images to Docker Hub."
echo "================Pull RC Containers from DockerHub==========="
IMAGES=$(docker search apache/beam --format "{{.Name}}" --limit 100)
KNOWN_IMAGES=()
echo "We are using ${RC_VERSION} to push docker images for ${RELEASE}."
while read IMAGE; do
# Try pull verified RC from dockerhub.
if docker pull "${IMAGE}:${RELEASE}${RC_VERSION}" 2>/dev/null ; then
KNOWN_IMAGES+=( $IMAGE )
fi
done < <(echo "${IMAGES}")
echo "================Confirming Release and RC version==========="
echo "Publishing the following images:"
# Sort by name for easy examination
IFS=$'\n' KNOWN_IMAGES=($(sort <<<"${KNOWN_IMAGES[*]}"))
unset IFS
printf "%s\n" ${KNOWN_IMAGES[@]}
for IMAGE in "${KNOWN_IMAGES[@]}"; do
# Perform a carbon copy of ${RC_VERSION} to dockerhub with a new tag as ${RELEASE}.
docker buildx imagetools create --tag "${IMAGE}:${RELEASE}" "${IMAGE}:${RELEASE}${RC_VERSION}"
# Perform a carbon copy of ${RC_VERSION} to dockerhub with a new tag as latest.
docker buildx imagetools create --tag "${IMAGE}:latest" "${IMAGE}:${RELEASE}"
done
publish_python_artifacts:
if: ${{github.event.inputs.PUBLISH_PYTHON_ARTIFACTS == 'yes'}}
runs-on: [self-hosted, ubuntu-20.04, main]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Mask PyPi password
run: |
# Workaround for Actions bug - https://github.com/actions/runner/issues/643
PYPI_PASSWORD=$(jq -r '.inputs.PYPI_PASSWORD' $GITHUB_EVENT_PATH)
echo "::add-mask::$PYPI_PASSWORD"
- name: Validate PyPi id/password
run: |
# Workaround for Actions bug - https://github.com/actions/runner/issues/643
PYPI_API_TOKEN=$(jq -r '.inputs.PYPI_API_TOKEN' $GITHUB_EVENT_PATH)
echo "::add-mask::$PYPI_API_TOKEN"
if [ "$PYPI_API_TOKEN" == "" ]
then
echo "Must provide a PyPi password to publish artifacts to PyPi"
exit 1
fi
- name: Setup environment
uses: ./.github/actions/setup-environment-action
with:
python-version: 3.11
disable-cache: true
- name: Install dependencies
run: |
pip install python-dateutil
pip install requests
pip install twine
- name: Deploy to Pypi
env:
RELEASE: "${{ github.event.inputs.RELEASE }}"
run: |
wget -e robots=off -r --no-parent -A tar.gz,whl "https://dist.apache.org/repos/dist/dev/beam/${RELEASE}/python"
cd "dist.apache.org/repos/dist/dev/beam/${RELEASE}/python/"
echo "Will upload the following files to PyPI:"
ls
twine upload * -u __token__ -p "${{ github.event.inputs.PYPI_API_TOKEN }}"
push_git_tags:
if: ${{github.event.inputs.TAG_RELEASE == 'yes'}}
runs-on: [self-hosted, ubuntu-20.04, main]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set git config
run: |
git config user.name $GITHUB_ACTOR
git config user.email actions@"$RUNNER_NAME".local
- name: Import GPG key
id: import_gpg
uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
- name: Push tags
env:
VERSION_TAG: "v${{ github.event.inputs.RELEASE }}"
RC_TAG: "v${{ github.event.inputs.RELEASE }}-RC${{ github.event.inputs.RC }}"
POST_RELEASE_BRANCH: "release-${{ github.event.inputs.RELEASE }}-postrelease"
run: |
# Ensure local tags are in sync. If there's a mismatch, it will tell you.
git fetch --all --tags --prune
# If the tag exists, a commit number is produced, otherwise there's an error.
git rev-list $RC_TAG -n 1
# Tag for Go SDK
git tag "sdks/$VERSION_TAG" "$RC_TAG"^{} -m "Tagging release" --local-user="${{steps.import_gpg.outputs.name}}"
git push https://github.com/apache/beam "sdks/$VERSION_TAG"
# Tag for repo root.
git tag "$VERSION_TAG" "$RC_TAG"^{} -m "Tagging release" --local-user="${{steps.import_gpg.outputs.name}}"
git push https://github.com/apache/beam "$VERSION_TAG"
git checkout -b "$POST_RELEASE_BRANCH" "$VERSION_TAG"
git push https://github.com/apache/beam "$POST_RELEASE_BRANCH"
update_master:
needs: push_git_tags
runs-on: ubuntu-latest
env:
POST_RELEASE_BRANCH: "release-${{ github.event.inputs.RELEASE }}-postrelease"
steps:
- 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: Update .asf.yaml to protect new postrelease branch from force push
run: |
sed -i -e "s/master: {}/master: {}\n ${POST_RELEASE_BRANCH}: {}/g" .asf.yaml
- name: Commit and Push to master branch files with Next Version
run: |
git add .asf.yaml
git commit -m "Adding ${POST_RELEASE_BRANCH} to protected branches in .asf.yaml"
git push origin ${MASTER_BRANCH}