Skip to content

Testing release workflow #122

Testing release workflow

Testing release workflow #122

name: Release
run-name: "Testing release workflow"
env:
APPLICATION: "test-app"
GOLANG_BUILDER_VERSION: "1.22-bookworm"
TARGET_BASE_VERSION: "bookworm-20240722"
PACKAGE_NAME: "github.com/erigontech/erigon"
BUILD_TAGS: "nosqlite,noboltdb,nosilkworm"
DOCKERHUB_REPOSITORY_DEV: "erigontech/dev-erigon"
DOCKERHUB_REPOSITORY_PRD: "erigontech/dev-erigon"
VERSION: "2.65.4"
VERSION_TMP: ".."
GITHUB_AUTOMATION_EMAIL: "[email protected]"
GITHUB_AUTOMATION_NAME: "Erigon Github Automation"
on:
push:
branches-ignore:
- '**'
#branches:
# - 'master'
#tags:
## only trigger on release tags:
#- 'v*.*.*'
#- 'v*.*.*-*'
workflow_dispatch:
inputs:
checkout_ref:
required: true
type: string
default: 'main'
description: 'The branch or Commid ID (SHA) to checkout and build artifacts from'
release_version:
required: false
type: string
description: 'Release version number (Pattern - v#.#.# , f.e. v2.41.3 or v3.0.0 )'
perform_release:
required: true
type: boolean
default: false
description: 'perform_release: when set then all artifacts will be published and the release
notes will be created. Otherwise build will be done and draft of the release notes will be created.'
jobs:
init:
runs-on: ubuntu-24.04
timeout-minutes: 30
name: Init
outputs:
my_git_ref_id: ${{ steps.getCommitId.outputs.id }}
steps:
- name: Fast checkout git repo in order to get commit id for further checkouts
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 ## 4.1.7 release
with:
fetch-depth: 1
ref: ${{ inputs.checkout_ref }}
- name: Get commit id
id: getCommitId
run: |
echo "id=$(git log -1 --format='%H')" >> $GITHUB_OUTPUT
- name: Check if tag ${{ inputs.release_version }} already exists. Exit workflow if tag already exist.
if: ${{ inputs.perform_release }}
run: |
if git ls-remote --exit-code --quiet --tags origin '${{ inputs.release_version }}'; then
echo "ERROR: tag ${{ inputs.release_version }} exists and workflow is performing release. Exit."
exit 1
else
echo "OK: tag ${{ inputs.release_version }} does not exists. Proceeding."
fi
build:
runs-on: ubuntu-24.04
timeout-minutes: 30
name: Build ${{ matrix.arch }}
needs: [ init ]
strategy:
matrix:
include:
- arch: linux/amd64/v2
id: linux-amd64-v2
goos: linux
goarch: amd64
docker_run_envs: -e CC=x86_64-linux-gnu-gcc -e CXX=x86_64-linux-gnu-g++ -e CGO_LDFLAGS="-s -w -extldflags '-static'"
build_dst: src
- arch: linux/arm64
id: linux-arm64
goos: linux
goarch: arm64
docker_run_envs: -e CC=aarch64-linux-gnu-gcc -e CXX=aarch64-linux-gnu-g++ -e CGO_LDFLAGS="-s -w -extldflags '-static'"
build_dst: src
steps:
- name: Checkout github repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 ## 4.1.7 release
with:
fetch-depth: 1
ref: ${{ needs.init.outputs.my_git_ref_id }}
- name: Debug content of current dir
run: |
pwd
ls -lao
set
- name: Get short commit id
id: GetShortCommitId
run: echo "short_commit_id=${GITHUB_SHA:0:7}" >> $GITHUB_OUTPUT
- name: Login to Docker Hub
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 ## v3.3.0
with:
username: ${{ secrets.ORG_DOCKERHUB_ERIGONTECH_USERNAME }}
password: ${{ secrets.ORG_DOCKERHUB_ERIGONTECH_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf ## v3.2.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db ## v3.6.1
- name: Build binaries for the platform ${{ matrix.arch }}
run: |
docker run --rm --platform ${{ matrix.arch }} \
-e GOOS=${{ matrix.goos }} -e GOARCH=${{ matrix.goarch }} \
${{ matrix.docker_run_envs }} \
-w /app1/src \
-v $(pwd):/app1 \
golang:${{ env.GOLANG_BUILDER_VERSION }} \
/bin/bash -c "git config --global --add safe.directory . ; go build main.go; ls -lao"
- name: Build ${{ inputs.perform_release && 'and push' || 'without pushing' }} a docker image for ${{ matrix.arch }} platform
id: docker_build
uses: docker/build-push-action@16ebe778df0e7752d2cfcbd924afdbbd89c1a755 ## v6.6.1
env:
LOCAL_DOCKERHUB_REPOSITORY: ${{ inputs.perform_release && env.DOCKERHUB_REPOSITORY_PRD || env.DOCKERHUB_REPOSITORY_DEV }}
with:
context: .
file: ./Dockerfile
platforms: ${{ matrix.arch }}
build-args: |
BUILD_DST=${{ matrix.build_dst }}
GOLANG_BUILDER_VERSION=${{ env.GOLANG_BUILDER_VERSION }}
TARGET_BASE_VERSION=${{ env.TARGET_BASE_VERSION }}
BUILD_TAGS=${{ env.BUILD_TAGS }}
BUILD_TIMESTAMP=${{ steps.current_ts.outputs.date }}
VCS_REF_SHORT=${{ steps.GetShortCommitId.outputs.short_commit_id }}
VCS_REF_LONG=${{ github.sha }}
VERSION=${{ steps.GetVersion.outputs.ver }}
## push when perform_release==true only:
outputs: type=image,name=${{ env.LOCAL_DOCKERHUB_REPOSITORY }},push-by-digest=true,name-canonical=true,${{ inputs.perform_release && 'push=true' || 'push=false' }}
- name: Compress Artifact for the platform ${{ matrix.arch }}
id: archiving
env:
LOCAL_VERSION: ${{ inputs.release_version && inputs.release_version || format('SNAPSHOT-{0}',steps.GetShortCommitId.outputs.short_commit_id) }}
LOCAL_APP: ${{ env.APPLICATION }}
LOCAL_ARCH: ${{ matrix.id }}
run: |
echo "Compressing archive with name ${LOCAL_APP}-${LOCAL_ARCH}-${LOCAL_VERSION}.tar.gz :"
echo "LOCAL_VERSION=${LOCAL_VERSION}" >> "$GITHUB_ENV"
echo "LOCAL_APP=${LOCAL_APP}" >> "$GITHUB_ENV"
echo "LOCAL_ARCH=${LOCAL_ARCH}" >> "$GITHUB_ENV"
tar czvf ./${LOCAL_APP}_${LOCAL_VERSION}_${LOCAL_ARCH}.tar.gz --transform "s,^,${LOCAL_APP}_${LOCAL_VERSION}_${LOCAL_ARCH}/," -C src/ main
- name: Upload Artifact
uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a ## v4.3.6
with:
name: ${{ github.run_id }}_${{ env.LOCAL_APP }}_${{ env.LOCAL_VERSION }}_${{ env.LOCAL_ARCH }}.tar.gz
path: ./${{ env.LOCAL_APP }}_${{ env.LOCAL_VERSION }}_${{ env.LOCAL_ARCH }}.tar.gz
retention-days: 1
compression-level: 0
if-no-files-found: error
- name: Debug 2
run: |
pwd
find . -ls
- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.docker_build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a ## v4.3.6
with:
name: digests-${{ matrix.id }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
publish-artifacts:
needs: [ init, build ]
runs-on: ubuntu-24.04
timeout-minutes: 30
name: Publish artifacts
steps:
- name: Checkout github repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 ## 4.1.7 release
with:
fetch-depth: 1
ref: ${{ needs.init.outputs.my_git_ref_id }}
- name: Get short commit id
id: GetShortCommitId
run: echo "short_commit_id=${GITHUB_SHA:0:7}" >> $GITHUB_OUTPUT
- name: Download tar.gz artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 ## v4.1.8
with:
path: .
pattern: "${{ github.run_id }}_*"
merge-multiple: true
- name: Download docker digests
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 ## v4.1.8
with:
path: /tmp/digests
pattern: digests-*
merge-multiple: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db ## v3.6.1
- name: Get version from Github tag
id: GetVersion
run: echo ver=$( echo ${{ github.ref_name }} | sed -e 's,.*\/,,g' ) >> $GITHUB_OUTPUT
- name: Docker meta (configure specific tag for each use-case)
id: meta
uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 ## v5.5.1
with:
images: ${{ inputs.perform_release && env.DOCKERHUB_REPOSITORY_PRD || env.DOCKERHUB_REPOSITORY_DEV }}
flavor: |
latest=false
tags: |
type=sha,priority=100,prefix=sha-,suffix=,format=short,enable=${{ inputs.perform_release && 'false' || 'true' }}
type=semver,priority=100,pattern={{raw}},value=${{ inputs.release_version }},enable=${{ inputs.perform_release && 'true' || 'false' }}
- name: Login to Docker Hub
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 ## v3.3.0
with:
username: ${{ secrets.ORG_DOCKERHUB_ERIGONTECH_USERNAME }}
password: ${{ secrets.ORG_DOCKERHUB_ERIGONTECH_TOKEN }}
- name: Create manifest list and push ${{ inputs.perform_release && 'when perform_release is true' || '' }}
working-directory: /tmp/digests
if: ${{ inputs.perform_release }}
env:
LOCAL_DOCKERHUB_REPOSITORY: ${{ inputs.perform_release && env.DOCKERHUB_REPOSITORY_PRD || env.DOCKERHUB_REPOSITORY_DEV }}
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.LOCAL_DOCKERHUB_REPOSITORY }}@sha256:%s ' *)
- name: Generate checksum file
env:
LOCAL_VERSION: ${{ inputs.release_version && inputs.release_version || format('SNAPSHOT-{0}',steps.GetShortCommitId.outputs.short_commit_id) }}
LOCAL_APP: ${{ env.APPLICATION }}
run: |
sha256sum *.tar.gz > ${LOCAL_APP}_${LOCAL_VERSION}_checksums.txt
echo "DEBUG: content of the file ${LOCAL_APP}_${LOCAL_VERSION}_checksums.txt :"
cat ${LOCAL_APP}_${LOCAL_VERSION}_checksums.txt
echo "DEBUG: end of content"
ls -lao
- name: Create GIT Tag for the released version
if: ${{ inputs.perform_release }}
env:
LOCAL_VERSION: ${{ inputs.release_version && inputs.release_version || format('SNAPSHOT-{0}',steps.GetShortCommitId.outputs.short_commit_id) }}
LOCAL_APP: ${{ env.APPLICATION }}
run: |
git config --global user.email ${{ env.GITHUB_AUTOMATION_EMAIL }}
git config --global user.name "${{ env.GITHUB_AUTOMATION_NAME }}"
git tag -a ${LOCAL_VERSION} -m "Release ${LOCAL_VERSION}"
git push origin ${LOCAL_VERSION}
- name: Publish draft of the Release notes with assets
if: ${{ inputs.perform_release }}
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
DOCKER_META_TAGS: ${{ join(fromJSON(steps.meta.outputs.json).tags, ' ') }}
GITHUB_RELEASE_TARGET: ${{ needs.init.outputs.my_git_ref_id }}
LOCAL_VERSION: ${{ inputs.release_version && inputs.release_version || format('SNAPSHOT-{0}',steps.GetShortCommitId.outputs.short_commit_id) }}
run: |
gh release create ${LOCAL_VERSION} *.tar.gz *_checksums.txt \
--generate-notes \
--verify-tag \
--target ${GITHUB_RELEASE_TARGET} \
--draft=true \
--title "${{ inputs.release_version }}" \
--notes "**Improvements:**<br>- ...coming soon <br><br>**Bugfixes:**<br><br>- ...coming soon<br><br>**Docker images:**<br><br>Docker image released:<br> ${{ env.DOCKER_META_TAGS }}<br><br>... coming soon<br>"