Skip to content

Commit

Permalink
Move release logic to a new workflow
Browse files Browse the repository at this point in the history
- remove steps creating the GitHub release from "build.yaml" workflow.
- add steps to tag the main branch with the version tag after an
  automerge in the "build.yaml" workflow.
- create a new GitHub Action for handling GitHub release on new tags on
  main.
- modify the python script handling the release to be able to get the
  release body directly.

fixes #380
  • Loading branch information
mgoerens committed Jul 25, 2023
1 parent 75e9e31 commit 27389ad
Show file tree
Hide file tree
Showing 7 changed files with 137 additions and 57 deletions.
35 changes: 21 additions & 14 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
name: Build, Test and Release
name: Build, Test, Automerge and Tag

# This workflow runs on all PR that are targetting the main branch.
#
# It runs the test suite. If the PR is a release PR, it automerges and tags the main branch with
# the corresonding new version. Finally, it retags the container image with latest.

on:
pull_request_target:
Expand Down Expand Up @@ -118,7 +123,7 @@ jobs:
id: create-tarfile
working-directory: ./chart-verifier
run: |
# check if release file only is included in PR
# create test tarball for the tests
ve1/bin/tar-file --release="test"
Expand Down Expand Up @@ -187,7 +192,7 @@ jobs:
- name: Approve PR
id: approve_pr
if: ${{ steps.check_version_updated.outputs.updated == 'true'}}
uses: hmarr/auto-approve-action@v2
uses: hmarr/auto-approve-action@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

Expand All @@ -200,21 +205,23 @@ jobs:
MERGE_METHOD: squash
MERGE_LABELS: ""

- name: Check for PR merge
- name: Get master branch sha
id: master_sha
if: ${{ steps.check_version_updated.outputs.updated == 'true'}}
run: |
ve1/bin/check-auto-merge --api-url=${{ github.event.pull_request._links.self.href }}
git fetch
export ORIGIN_MASTER_SHA=$(git rev-parse origin/master)
echo "origin_master_sha=$ORIGIN_MASTER_SHA" >> $GITHUB_OUTPUT
- name: Create the the release
id: create_release
- name: Create release tag
id: create_release_tag
if: ${{ steps.check_version_updated.outputs.updated == 'true'}}
uses: softprops/action-gh-release@v1
uses: mathieudutour/[email protected]
with:
tag_name: ${{ steps.check_version_in_PR.outputs.PR_version }}
body: ${{ steps.check_version_in_PR.outputs.PR_release_body }}
files: ${{ steps.check_version_in_PR.outputs.PR_tarball_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
github_token: ${{ secrets.PAT_MGOERENS }}
custom_tag: ${{ steps.check_version_in_PR.outputs.PR_version }}
tag_prefix: ""
commit_sha: ${{ steps.master_sha.outputs.origin_master_sha }}

- name: Wait for image build to complete
# Quay is configured to automatically build our image. This waits
Expand Down Expand Up @@ -250,4 +257,4 @@ jobs:
imageReference=quay.io/redhat-certification/chart-verifier
podman pull ${imageReference}:${{ steps.check_version_in_PR.outputs.PR_version }}
podman tag ${imageReference}:${{ steps.check_version_in_PR.outputs.PR_version }} ${imageReference}:latest
podman push ${imageReference}:latest
podman push ${imageReference}:latest
90 changes: 90 additions & 0 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: create release on new tags

# This workflow is triggered by new version tags (e.g. "1.12.2" without leading "v") on the main
# branch.
#
# Tagging should be automatic after each merged PR release (see the build.yaml workflow).
# Alternatively, this workflow can be triggered by manually creating a tag on the main branch with
# the aforementioned format. Note that the tests are *not* run by this workflow, and that you
# should therefore apply caution before manually tagging the main branch in order to trigger it.
#
# This workflow contains a check that the tag matches the version set in
# ./pkg/chartverifier/version/version_info.json.
#
# In order to recreate a GitHub release and rebuild its associated assets, first the tag needs to
# be manually deleted (e.g `git tag --delete 1.12.2 && git push --delete origin 1.12.2`). The
# GitHub release that was created for this tag automatically turns into a "Draft" release and will
# need to be manually cleaned up, though it doesn't constitute a blocker for this workflow to run.
# Finally, as mentioned above, create a new tag (e.g. `git tag 1.12.2 && git push --tags`) to
# recreate the release.
#
# This workflow builds the tarball, creates the Github release and attaches the tarball to it.

on:
push:
# Publish semver tags as releases.
tags: '[0-9]+.[0-9]+.[0-9]+'

jobs:
build-and-release:
name: Create GitHub release
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Setup Go
uses: actions/setup-go@v4
with:
go-version-file: go.mod

- name: Print tag to GITHUB_OUTPUT
id: get_tag
run: |
echo "release_version=${GITHUB_REF#refs/*/}" | tee -a $GITHUB_OUTPUT
- name: Build binary and make tarball
id: build_bin
run: |
make bin
TARBALL_NAME="chart-verifier.tgz-${{ steps.get_tag.outputs.release_version }}.tgz"
tar -zcvf $TARBALL_NAME -C out/ chart-verifier
export TARBALL_PATH=$(realpath $TARBALL_NAME)
echo "tarball_path=$TARBALL_PATH" | tee -a $GITHUB_OUTPUT
- name: Check that the tag matches the current version
id: check_tag_and_version
run: |
release_version=${{ steps.get_tag.outputs.release_version }}
bin_version=$(out/chart-verifier version --as-data | jq -r .version)
if [[ "$release_version" != "$bin_version" ]]; then
echo "Binary version ($bin_version) doesn't match tag ($release_version)" && exit 1
fi
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
python-version: '3.9'

- name: Set up Python scripts
run: |
# set up python requirements and scripts on PR branch
python3 -m venv ve1
cd scripts && ../ve1/bin/pip3 install -r requirements.txt && cd ..
cd scripts && ../ve1/bin/python3 setup.py install && cd ..
- name: Generate release body
id: release_body
run: echo "release_body=$(ve1/bin/print-release-body)" | tee -a $GITHUB_OUTPUT

- name: Create the the release
id: create_release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ steps.get_tag.outputs.release_version }}
body: ${{ steps.release_body.outputs.release_body }}
files: ${{ steps.build_bin.outputs.tarball_path }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

4 changes: 2 additions & 2 deletions scripts/setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ where = src
[options.entry_points]
console_scripts =
release-checker = release.releasechecker:main
check-auto-merge = checkautomerge.checkautomerge:main
print-release-body = release.releasebody:main
build-and-test = buildandtest.buildandtest:main
check-user = owners.checkuser:main
sa-for-chart-testing = saforcharttesting.saforcharttesting:main
tar-file = release.tarfile_asset:main
tar-file = release.tarfile_asset:main
Empty file.
27 changes: 0 additions & 27 deletions scripts/src/checkautomerge/checkautomerge.py

This file was deleted.

21 changes: 21 additions & 0 deletions scripts/src/release/releasebody.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import sys

sys.path.append('./scripts/src/')
from release import releasechecker
from utils import utils

def get_release_body(version, image_name, release_info):
"""Generate the body of the GitHub release"""
body = f"Chart verifier version {version} <br><br>Docker Image:<br>- {image_name}:{version}<br><br>"
body += "This version includes:<br>"
for info in release_info:
if info.startswith("<"):
body += info
else:
body += f"- {info}<br>"
return body

def main():
version_info = releasechecker.get_version_info()
release_body = get_release_body(version_info["version"],version_info["quay-image"],version_info["release-info"])
print(release_body)
17 changes: 3 additions & 14 deletions scripts/src/release/releasechecker.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
import semver
import sys
sys.path.append('./scripts/src/')
from release import tarfile_asset
from release import tarfile_asset, releasebody
from utils import utils

VERSION_FILE = 'pkg/chartverifier/version/version_info.json'
Expand Down Expand Up @@ -64,18 +64,6 @@ def check_if_only_version_file_is_modified(api_url):

return version_file_found

def make_release_body(version, image_name, release_info):
body = f"Chart verifier version {version} <br><br>Docker Image:<br>- {image_name}:{version}<br><br>"
body += "This version includes:<br>"
for info in release_info:
if info.startswith("<"):
body += info
else:
body += f"- {info}<br>"

print(f"[INFO] Release body: {body}")
utils.add_output("PR_release_body",body)

def get_version_info():
data = {}
with open(VERSION_FILE) as json_file:
Expand Down Expand Up @@ -111,7 +99,8 @@ def main():
utils.add_output("PR_release_image",version_info["quay-image"])
utils.add_output("PR_release_info",version_info["release-info"])
utils.add_output("PR_includes_release","true")
make_release_body(version_info["version"],version_info["quay-image"],version_info["release-info"])
release_body = releasebody.get_release_body(version_info["version"],version_info["quay-image"],version_info["release-info"])
utils.add_output("PR_release_body",release_body)
else:
version_info = get_version_info()
if args.version:
Expand Down

0 comments on commit 27389ad

Please sign in to comment.