Perform Release #7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }} |