Automated Release #164
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: Automated Release | |
on: | |
schedule: | |
- cron: 45 3 * * MON | |
workflow_dispatch: | |
jobs: | |
prepare: | |
name: Prepare Release | |
runs-on: ubuntu-latest | |
outputs: | |
commit_count: ${{ steps.commits.outputs.count }} | |
release_version: ${{ steps.release.outputs.version }} | |
previous_version: ${{ steps.previous.outputs.version }} | |
release_url: ${{ steps.create_release.outputs.upload_url }} | |
build_timestamp: ${{ steps.timestamp.outputs.iso8601 }} | |
steps: | |
- id: checkout | |
name: Clone Git Repository | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- id: commits | |
name: Count Commits | |
run: echo "count=$(git rev-list --count HEAD --since='last Monday' -- src/main/java)" >> $GITHUB_OUTPUT | |
- id: release | |
name: Create Release Version | |
if: steps.commits.outputs.count > 0 | |
run: echo "version=$(date +'%Y.%-m.%-d')" >> $GITHUB_OUTPUT | |
- id: previous | |
name: Get Last Release | |
if: steps.commits.outputs.count > 0 | |
run: echo "version=$(git describe --abbrev=0 --tags)" >> $GITHUB_OUTPUT | |
- name: Build Timestamp | |
id: timestamp | |
run: echo "iso8601=$(date --utc --iso-8601=seconds)" >> $GITHUB_OUTPUT | |
build: | |
name: Build on ${{ matrix.os }} | |
needs: prepare | |
outputs: | |
mac_sha256: ${{ steps.mac-checksum.outputs.sha256 }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: | |
- ubuntu-latest | |
- macos-latest | |
- windows-latest | |
steps: | |
- id: checkout | |
name: Clone Git Repository | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: actions/checkout@v4 | |
- id: graal | |
name: GraalVM Setup | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: graalvm/setup-graalvm@v1 | |
with: | |
version: latest | |
java-version: 21 | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
- id: cache | |
name: Cache Maven Repository | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: actions/cache@v3 | |
with: | |
path: ~/.m2/repository | |
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} | |
restore-keys: | | |
${{ runner.os }}-maven- | |
- id: gpg | |
name: GPG Key | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: timheuer/base64-to-file@v1.2 | |
with: | |
fileName: signing.key.asc | |
fileDir: ${{ github.workspace}} | |
encodedString: ${{ secrets.GPG_SECRET_KEY_BASE64 }} | |
- id: verify | |
if: needs.prepare.outputs.commit_count > 0 | |
name: Verify Project | |
run: > | |
mvn | |
--batch-mode | |
--activate-profiles release | |
--define revision=${{ needs.prepare.outputs.release_version }} | |
--define skipNativeBuild=false | |
--define pgp.secretkey=keyfile:signing.key.asc | |
--define pgp.passphrase=literal:${{ secrets.GPG_SECRET_KEY_PASSWORD }} | |
--define project.build.outputTimestamp=${{ needs.prepare.outputs.build_timestamp }} | |
verify | |
- id: mac-checksum | |
name: Capture MacOS SHA256 Checksum | |
if: needs.prepare.outputs.commit_count > 0 && runner.os == 'macOS' | |
run: echo "sha256=$(cat ./target/ilo-${{ needs.prepare.outputs.release_version }}-mac.zip.sha256)" >> $GITHUB_OUTPUT | |
- id: upload-java | |
name: Upload JVM Artifact | |
if: needs.prepare.outputs.commit_count > 0 && runner.os == 'Linux' | |
uses: actions/upload-artifact@v3 | |
with: | |
name: jvm | |
path: ./target/ilo-*-jvm* | |
- id: upload-linux | |
name: Upload Linux Artifact | |
if: needs.prepare.outputs.commit_count > 0 && runner.os == 'Linux' | |
uses: actions/upload-artifact@v3 | |
with: | |
name: linux | |
path: ./target/ilo-*-linux* | |
- id: upload-mac | |
name: Upload Mac Artifact | |
if: needs.prepare.outputs.commit_count > 0 && runner.os == 'macOS' | |
uses: actions/upload-artifact@v3 | |
with: | |
name: mac | |
path: ./target/ilo-*-mac* | |
- id: upload-windows | |
name: Upload Windows Artifact | |
if: needs.prepare.outputs.commit_count > 0 && runner.os == 'Windows' | |
uses: actions/upload-artifact@v3 | |
with: | |
name: windows | |
path: ./target/ilo-*-windows* | |
release: | |
name: GitHub Release | |
needs: [prepare, build] | |
runs-on: ubuntu-latest | |
permissions: | |
contents: write | |
steps: | |
- id: checkout | |
name: Clone Git Repository | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- id: download | |
name: Download Artifacts | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: actions/download-artifact@v3 | |
with: | |
path: artifacts | |
- id: create_release | |
name: Create Release | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: softprops/action-gh-release@v1 | |
with: | |
tag_name: ${{ needs.prepare.outputs.release_version }} | |
name: ${{ needs.prepare.outputs.release_version }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
draft: false | |
prerelease: false | |
generate_release_notes: true | |
files: | | |
artifacts/jvm/ilo-${{ needs.prepare.outputs.release_version }}-jvm.zip | |
artifacts/jvm/ilo-${{ needs.prepare.outputs.release_version }}-jvm.zip.asc | |
artifacts/jvm/ilo-${{ needs.prepare.outputs.release_version }}-jvm.zip.sha512 | |
artifacts/linux/ilo-${{ needs.prepare.outputs.release_version }}-linux.zip | |
artifacts/linux/ilo-${{ needs.prepare.outputs.release_version }}-linux.zip.asc | |
artifacts/linux/ilo-${{ needs.prepare.outputs.release_version }}-linux.zip.sha512 | |
artifacts/mac/ilo-${{ needs.prepare.outputs.release_version }}-mac.zip | |
artifacts/mac/ilo-${{ needs.prepare.outputs.release_version }}-mac.zip.asc | |
artifacts/mac/ilo-${{ needs.prepare.outputs.release_version }}-mac.zip.sha512 | |
artifacts/windows/ilo-${{ needs.prepare.outputs.release_version }}-windows.zip | |
artifacts/windows/ilo-${{ needs.prepare.outputs.release_version }}-windows.zip.asc | |
artifacts/windows/ilo-${{ needs.prepare.outputs.release_version }}-windows.zip.sha512 | |
packages: | |
name: Update Package Managers | |
needs: [prepare, build, release] | |
runs-on: ubuntu-latest | |
steps: | |
- id: checkout | |
name: Clone Git Repository | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: actions/checkout@v4 | |
- id: update-copr-version | |
name: Update COPR Version | |
if: needs.prepare.outputs.commit_count > 0 | |
run: sed -i -- 's/${{ needs.prepare.outputs.previous_version }}/${{ needs.prepare.outputs.release_version }}/g' build/copr/ilo.spec | |
- id: update-homebrew-version | |
name: Update Homebrew Version | |
if: needs.prepare.outputs.commit_count > 0 | |
run: sed -i -- 's/${{ needs.prepare.outputs.previous_version }}/${{ needs.prepare.outputs.release_version }}/g' HomebrewFormula/ilo.rb | |
- id: update-homebrew-checksum | |
name: Update Homebrew Checksum | |
if: needs.prepare.outputs.commit_count > 0 | |
run: sed -i -- 's/sha256 \".*\"/sha256 \"${{ needs.build.outputs.mac_sha256 }}\"/g' HomebrewFormula/ilo.rb | |
- id: cpr | |
name: Create Pull Request | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: peter-evans/create-pull-request@v5 | |
with: | |
token: ${{ secrets.PAT }} | |
commit-message: Update package-manager infos for latest release | |
committer: GitHub <noreply@github.com> | |
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> | |
title: Update package-manager infos for latest release | |
body: | | |
- COPR: `build/copr/ilo.spec` | |
- Homebrew: `HomebrewFormula/ilo.rb` | |
assignees: sebhoss | |
draft: false | |
base: main | |
branch: update-package-manager | |
delete-branch: true | |
- name: Enable Pull Request Automerge | |
if: needs.prepare.outputs.commit_count > 0 && steps.cpr.outputs.pull-request-operation == 'created' | |
run: gh pr merge --auto --rebase "${{ steps.cpr.outputs.pull-request-number }}" | |
env: | |
GITHUB_TOKEN: ${{ secrets.PAT }} | |
announce: | |
name: Release Announcement | |
needs: [prepare, packages] | |
runs-on: ubuntu-latest | |
steps: | |
- id: email | |
name: Send Mail | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: dawidd6/action-send-mail@v3 | |
with: | |
server_address: ${{ secrets.MAIL_SERVER }} | |
server_port: ${{ secrets.MAIL_PORT }} | |
username: ${{ secrets.MAIL_USERNAME }} | |
password: ${{ secrets.MAIL_PASSWORD }} | |
subject: ${{ github.event.repository.name }} version ${{ needs.prepare.outputs.release_version }} published | |
body: See https://github.com/metio/ilo/releases/tag/${{ needs.prepare.outputs.release_version }} for details. | |
to: announcements@metio.groups.io | |
from: ${{ secrets.MAIL_SENDER }} | |
- id: matrix | |
name: Send Matrix Message | |
if: needs.prepare.outputs.commit_count > 0 | |
uses: s3krit/matrix-message-action@v0.0.3 | |
with: | |
room_id: ${{ secrets.MATRIX_ROOM_ID }} | |
access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} | |
message: ${{ github.event.repository.name }} version [${{ needs.prepare.outputs.release_version }}](https://github.com/metio/ilo/releases/tag/${{ needs.prepare.outputs.release_version }}) published | |
server: matrix.org |