Skip to content

Perform Release

Perform Release #7

name: Perform Release
on:
workflow_dispatch:
inputs:
dry-run:
description: Dry Run
required: false
type: boolean
default: false
release-version:
description: Release Version
required: false
type: string
next-version:
description: Next Development Version
required: false
type: string
tag-as-latest:
description: Latest
required: false
type: boolean
default: false
include-site:
description: Build and Deploy Site
required: false
type: boolean
default: false
jobs:
maven-build-deploy:
name: Build and Deploy Maven Artifacts
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
outputs:
release-sha: ${{ steps.release-sha.outputs.value }}
release-tag: ${{ steps.release-tag.outputs.value }}
steps:
- name: Checkout 3scale CMS
uses: actions/checkout@v4
- name: Set Up JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: '21'
settings-path: ${{ github.workspace }}
server-id: github
- name: Determine Home Directory
id: find-home
run: |
echo "home=$HOME" >> $GITHUB_OUTPUT
- name: Cache Maven Local Repo
uses: actions/cache@v3
with:
path: ${{ steps.find-home.outputs.home }}/.m2/repository
key: ${{ runner.os }}-${{ runner.arch }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-maven-
- name: Set Up Maven Repo Filters
run: |
mkdir -p ${{ steps.find-home.outputs.home }}/.m2/repository/.remoteRepositoryFilters/
cp -av ${{ github.workspace }}/.mvn/filters/*.txt ${{ steps.find-home.outputs.home }}/.m2/repository/.remoteRepositoryFilters/
- name: Configure Git User
run: |
git config user.name "GitHub Actions"
git config user.email "[email protected]"
- name: Configure SCM Settings in POM
run: >-
sed
-i
-e '/<scm>/,/<\/scm>/ s;<url>.*</url>;<url>https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/</url>;'
-e '/<scm>/,/<\/scm>/ s;<connection>.*</connection>;<connection>scm:git:${{ github.server_url }}/${{ github.repository }}.git</connection>;'
-e '/<scm>/,/<\/scm>/ s;<developerConnection>.*</developerConnection>;<developerConnection>scm:git:${{ github.server_url }}/${{ github.repository }}.git</developerConnection>;'
pom.xml
- name: Prepare Maven Release (build code and create tag)
id: release-prepare
env:
GITHUB_TOKEN: ${{ github.token }}
run: >-
./mvnw
--settings ${{ github.workspace }}/settings.xml
--batch-mode
release:prepare
${{ format('-DdryRun={0}', inputs.dry-run) }}
${{ inputs.next-version && format('-DdevelopmentVersion={0}', inputs.next-version) || '' }}
${{ inputs.release-version && format('-DreleaseVersion={0}', inputs.release-version) || '' }}
-DcheckModificationExcludeList=pom.xml
-Dusername=${{ github.token }}
-DpreparationGoals='clean verify'
-Darguments='
--settings ${{ github.workspace }}/settings.xml
-DaltDeploymentRepository=github::https://maven.pkg.github.com/${{ github.repository_owner }}/${{ github.event.repository.name }}
'
- name: Perform Maven Release (deploy artifacts)
env:
GITHUB_TOKEN: ${{ github.token }}
run: >-
./mvnw
--settings ${{ github.workspace }}/settings.xml
--batch-mode
release:perform
-DlocalCheckout=true
${{ format('-DdryRun={0}', inputs.dry-run) }}
-Dusername=${{ github.token }}
-Dgoals='deploy'
-Darguments='
--settings ${{ github.workspace }}/settings.xml
-DaltDeploymentRepository=github::https://maven.pkg.github.com/${{ github.repository_owner }}/${{ github.event.repository.name }}
'
- name: Rollback Maven Release unless Success
if: ${{ !success() && !inputs.dry-run && steps.release-prepare.outcome == 'success' }}
env:
GITHUB_TOKEN: ${{ github.token }}
run: >-
./mvnw
--settings ${{ github.workspace }}/settings.xml
--batch-mode
release:rollback
-Dusername=${{ github.token }}
- name: Determine Release Commit SHA
id: release-sha
run: |
echo "value=$(git rev-parse HEAD^)" >> $GITHUB_OUTPUT
- name: Determine Release Tag
id: release-tag
env:
RELEASE_SHA: ${{ steps.release-sha.outputs.value }}
run: |
echo "value=$(git describe --tags --abbrev=0 $RELEASE_SHA 2>&1 || echo $RELEASE_SHA)" >> $GITHUB_OUTPUT
create-github-release:
name: Create GitHub Release from Tag
runs-on: ubuntu-latest
if: ${{ success() && !inputs.dry-run }}
permissions:
contents: write
needs:
- maven-build-deploy
steps:
- name: Checkout Project
uses: actions/checkout@v4
with:
ref: ${{ needs.maven-build-deploy.outputs.release-tag }}
- uses: spenserblack/actions-tag-to-release@v3
with:
tag: ${{ needs.maven-build-deploy.outputs.release-tag }}
tag-as-title: true
draft: true
dry-run: ${{ inputs.dry-run }}
prerelease: auto
prerelease-pattern: v*.*.*-*
add-jvm-build-to-release:
name: Add Executable JAR to Release
runs-on: ubuntu-latest
permissions:
contents: write
needs:
- maven-build-deploy
- create-github-release
steps:
- name: Checkout Tag
uses: actions/checkout@v4
with:
ref: ${{ needs.maven-build-deploy.outputs.release-tag }}
- name: Set Up JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: '21'
- name: Determine Home Directory
id: find-home
run: |
echo "home=$HOME" >> $GITHUB_OUTPUT
- name: Cache Maven Local Repo
uses: actions/cache@v3
with:
path: ${{ steps.find-home.outputs.home }}/.m2/repository
key: ${{ runner.os }}-${{ runner.arch }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-maven-
- name: Set Up Maven Repo Filters
run: |
mkdir -p ${{ steps.find-home.outputs.home }}/.m2/repository/.remoteRepositoryFilters/
cp -av ${{ github.workspace }}/.mvn/filters/*.txt ${{ steps.find-home.outputs.home }}/.m2/repository/.remoteRepositoryFilters/
- name: Perform JVM-mode CLI Build
run: >-
./mvnw
--batch-mode
package
--projects cli
--also-make
-DskipTests
-DskipJavadoc
- name: Package CLI JAR into Tarball
run: |
mkdir -p tarball/3scale-cms-java
cp -av cli/target/quarkus-app/app cli/target/quarkus-app/lib cli/target/quarkus-app/quarkus tarball/3scale-cms-java/
cp -av cli/target/quarkus-app/quarkus-run.jar tarball/3scale-cms-java/3scale-cms.jar
cat <<EOF >tarball/3scale-cms
#!/bin/sh
java -jar "\$(dirname \$0)/3scale-cms-java/3scale-cms.jar" "\$@"
EOF
chmod +x tarball/3scale-cms
pushd tarball
tar cvfaS 3scale-cms-${{ runner.os }}-java.tar.gz --mtime=$(realpath 3scale-cms-java/3scale-cms.jar) 3scale-cms 3scale-cms-java
popd
- name: Upload Artifact to GitHub Actions
uses: actions/upload-artifact@v3
with:
name: 3scale-cms-${{ runner.os }}-java
path: ${{ github.workspace }}/tarball/3scale-cms-${{ runner.os }}-java.tar.gz
if-no-files-found: error
- name: Add Artifact to Release
if: ${{ success() && !inputs.dry-run }}
uses: ncipollo/release-action@v1
with:
tag: ${{ needs.maven-build-deploy.outputs.release-tag }}
allowUpdates: true
updateOnlyUnreleased: true
omitBodyDuringUpdate: true
omitDraftDuringUpdate: true
omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true
generateReleaseNotes: false
artifactErrorsFailBuild: true
removeArtifacts: false
replacesArtifacts: false
artifacts: ${{ github.workspace }}/tarball/3scale-cms-${{ runner.os }}-java.tar.gz
add-native-build-to-release:
name: Add Native Executable to Release
runs-on: ubuntu-latest
permissions:
contents: write
needs:
- maven-build-deploy
- create-github-release
steps:
- name: Checkout Tag
uses: actions/checkout@v4
with:
ref: ${{ needs.maven-build-deploy.outputs.release-tag }}
- name: Set Up JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: '21'
- name: Determine Home Directory
id: find-home
run: |
echo "home=$HOME" >> $GITHUB_OUTPUT
- name: Cache Maven Local Repo
uses: actions/cache@v3
with:
path: ${{ steps.find-home.outputs.home }}/.m2/repository
key: ${{ runner.os }}-${{ runner.arch }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-maven-
- name: Set Up Maven Repo Filters
run: |
mkdir -p ${{ steps.find-home.outputs.home }}/.m2/repository/.remoteRepositoryFilters/
cp -av ${{ github.workspace }}/.mvn/filters/*.txt ${{ steps.find-home.outputs.home }}/.m2/repository/.remoteRepositoryFilters/
- name: Perform Native CLI Build
run: >-
./mvnw
--batch-mode
package
--projects cli
--also-make
-DskipTests
-DskipJavadoc
-Dnative
- name: Package CLI into Tarball
run: |
mkdir -p tarball
cp -av cli/target/3scale-cms-*-runner tarball/3scale-cms
pushd tarball
tar cvfaS 3scale-cms-${{ runner.os }}-${{ runner.arch }}.tar.gz 3scale-cms
popd
- name: Upload Artifact to GitHub Actions
uses: actions/upload-artifact@v3
with:
name: 3scale-cms-${{ runner.os }}-${{ runner.arch }}
path: ${{ github.workspace }}/tarball/3scale-cms-${{ runner.os }}-${{ runner.arch }}.tar.gz
if-no-files-found: error
- name: Add Artifact to Release
if: ${{ success() && !inputs.dry-run }}
uses: ncipollo/release-action@v1
with:
tag: ${{ needs.maven-build-deploy.outputs.release-tag }}
allowUpdates: true
updateOnlyUnreleased: true
omitBodyDuringUpdate: true
omitDraftDuringUpdate: true
omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true
generateReleaseNotes: false
artifactErrorsFailBuild: true
removeArtifacts: false
replacesArtifacts: false
artifacts: ${{ github.workspace }}/tarball/3scale-cms-${{ runner.os }}-${{ runner.arch }}.tar.gz
build-container-image:
name: Build, Tag, Push Container Image
if: ${{ success() && !inputs.dry-run }}
permissions:
contents: read
packages: write
secrets: inherit
needs:
- maven-build-deploy
uses: ./.github/workflows/build-container-image.yml
with:
git-ref: ${{ needs.maven-build-deploy.outputs.release-tag }}
build-mode: jvm_and_native
tag-as-latest: ${{ inputs.tag-as-latest }}
skip-tests: true
render-and-deploy-site:
name: Render and Deploy Site
if: ${{ success() && inputs.include-site == true }}
permissions:
contents: read
pages: write
id-token: write
secrets: inherit
needs:
- maven-build-deploy
uses: ./.github/workflows/render-and-deploy-site.yml
with:
git-ref: ${{ needs.maven-build-deploy.outputs.release-tag }}
dry-run: ${{ inputs.dry-run }}