CI #706
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: CI | |
on: | |
create: | |
pull_request: | |
types: [ opened, synchronize, reopened ] | |
paths-ignore: | |
- '*.md' | |
- 'docs/**' | |
push: | |
branches: | |
- master | |
paths-ignore: | |
- '*.md' | |
- 'docs/**' | |
workflow_dispatch: | |
defaults: | |
run: | |
shell: bash | |
jobs: | |
workflow_config: | |
runs-on: ubuntu-latest | |
outputs: | |
do_release: ${{ steps.config.outputs.do_release }} | |
do_snapshot_release: ${{ steps.config.outputs.do_snapshot_release }} | |
pom_version: ${{ steps.config.outputs.pom_version }} | |
do_javadoc: ${{ steps.config.outputs.do_javadoc }} | |
do_test_linux: ${{ steps.config.outputs.do_test_linux }} | |
do_test_windows: ${{ steps.config.outputs.do_test_windows }} | |
steps: | |
- name: Checkout the repository | |
uses: actions/checkout@v4 | |
- name: Configure workflow | |
id: config | |
env: | |
ACTOR: ${{ github.actor }} | |
EVENT_ACTION: ${{ github.event.action }} | |
REF_TYPE: ${{ github.event.ref_type }} | |
REF: ${{ github.event.ref }} | |
run: | | |
cat <<-EOF | |
::group::Debug Info | |
GITHUB_EVENT_NAME : '${GITHUB_EVENT_NAME}' | |
EVENT_ACTION : '${EVENT_ACTION}' | |
REF_TYPE : '${REF_TYPE}' | |
REF : '${REF}' | |
ACTOR : '${ACTOR}' | |
GITHUB_REPOSITORY_OWNER : '${GITHUB_REPOSITORY_OWNER}' | |
::endgroup:: | |
EOF | |
# Do a release when a git tag starting with 'v' has been created by a suitable user. | |
# (We match against github.repository_owner as a kludge so that forked repos can release themselves when testing the workflow) | |
if [[ "${GITHUB_EVENT_NAME}" == "create" && "${REF_TYPE}" == "tag" && "${REF}" == v* && \ | |
( "${ACTOR}" == "arnaudroques" || "${ACTOR}" == "${GITHUB_REPOSITORY_OWNER}" ) \ | |
]]; then | |
echo "::notice title=::This run will release '${REF}'" | |
echo "do_release=true" >> $GITHUB_OUTPUT | |
echo "pom_version=${REF#v}" | |
echo "pom_version=${REF#v}" >> $GITHUB_OUTPUT # pom_version is the tag without the 'v' prefix | |
echo "do_javadoc=true" >> $GITHUB_OUTPUT | |
echo "This run will update the Javadoc" | |
elif [[ "${GITHUB_EVENT_NAME}" =~ push|workflow_dispatch && "${REF}" == "refs/heads/master" && "${ACTOR}" == "arnaudroques" ]]; then | |
echo "::notice title=::This run will release a snapshot" | |
echo "do_snapshot_release=true" >> $GITHUB_OUTPUT | |
V=$(perl -ne 'if (/return (\d{6,7});/) {$v=$1} if (/final int beta = (\d+);/) {$b=$1} END{print(substr($v, 0, 1),".", substr($v, 1, 4),"."); if ($b) {print(int(substr($v+1, 5)), "beta", $b);} else {print(int(substr($v, 5)))}}' src/net/sourceforge/plantuml/version/Version.java) | |
echo "pom_version=$V-SNAPSHOT" | |
echo "pom_version=$V-SNAPSHOT" >> $GITHUB_OUTPUT # pom_version is taken from Version.java | |
echo "do_javadoc=true" >> $GITHUB_OUTPUT | |
echo "This run will update the Javadoc" | |
else | |
echo "This run will NOT make a release" | |
echo "do_javadoc=false" >> $GITHUB_OUTPUT | |
echo "This run will NOT update the Javadoc" | |
fi | |
echo "do_test_linux=true" >> $GITHUB_OUTPUT | |
echo "do_test_windows=false" >> $GITHUB_OUTPUT | |
# We run the tests on many OS / Java combinations but also the Compile step because some users build | |
# their own jars from source, so it is good for CI to check that is working on all combinations. | |
# We split windows and ubuntu because windows is so slow... | |
test_linux: | |
needs: workflow_config | |
strategy: | |
fail-fast: false | |
matrix: | |
java_version: [ 8, 17 ] | |
os: [ ubuntu-latest ] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout the repository | |
if: needs.workflow_config.outputs.do_test_linux == 'true' | |
uses: actions/checkout@v4 | |
- name: Set up java | |
if: needs.workflow_config.outputs.do_test_linux == 'true' | |
uses: actions/setup-java@v4 | |
with: | |
java-version: ${{ matrix.java_version }} | |
distribution: temurin | |
cache: gradle | |
# Compile / Test / Package are separate steps so the reason for any failure is more obvious in GitHub UI | |
- name: Compile | |
if: needs.workflow_config.outputs.do_test_linux == 'true' | |
run: gradle -q compileJava --no-daemon | |
- name: Test | |
if: needs.workflow_config.outputs.do_test_linux == 'true' | |
run: gradle test --no-daemon -i | |
- name: Upload test reports | |
uses: actions/upload-artifact@v4 | |
if: needs.workflow_config.outputs.do_test_linux == 'true' | |
with: | |
# Using github.run_number here to reduce confusion when downloading & comparing from several builds | |
name: ${{ github.run_number }}-${{ matrix.os }}-java-${{ matrix.java_version }}-test-reports | |
path: build/reports/tests/ | |
build_artifacts: | |
needs: [ workflow_config ] | |
runs-on: ubuntu-latest | |
outputs: | |
release_version: ${{ steps.version.outputs.release_version }} | |
steps: | |
- name: Checkout the repository | |
uses: actions/checkout@v4 | |
- name: Set up java | |
uses: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: temurin | |
cache: gradle | |
# - name: Set version in gradle.properties | |
# if: env.POM_VERSION | |
# env: | |
# POM_VERSION: ${{ needs.workflow_config.outputs.pom_version }} | |
# run: | | |
# sed -i "s/version = .*/version = $POM_VERSION/" gradle.properties | |
# cat gradle.properties | |
- name: Generate artifacts | |
run: | | |
echo "print gradle.properties" | |
cat gradle.properties | |
gradle clean build \ | |
pdfJar \ | |
generateMetadataFileForMavenPublication generatePomFileForMavenPublication \ | |
-x test | |
find . -name "*.jar" | |
- name: Sign artifacts | |
if: env.ORG_GRADLE_PROJECT_signingKey | |
env: | |
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.ARTIFACT_SIGNING_KEY }} | |
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.ARTIFACT_SIGNING_PASSPHRASE }} | |
run: | | |
gradle -i signMavenPublication signPdfJar | |
ls -l build/libs | |
ls -l plantuml-asl/build/libs | |
ls -l plantuml-bsd/build/libs | |
ls -l plantuml-epl/build/libs | |
ls -l plantuml-lgpl/build/libs | |
ls -l plantuml-mit/build/libs | |
ls -l plantuml-gplv2/build/libs | |
- name: Get release version | |
id: version | |
run: | | |
echo "release_version=$(gradle properties -q | grep "version:" | awk '{print $2}')" >> $GITHUB_OUTPUT | |
- name: Cache libs | |
uses: actions/cache/save@v4 | |
with: | |
path: | | |
build/libs | |
build/publications | |
plantuml-asl/build/libs | |
plantuml-bsd/build/libs | |
plantuml-epl/build/libs | |
plantuml-lgpl/build/libs | |
plantuml-mit/build/libs | |
plantuml-gplv2/build/libs | |
key: "libs-${{ github.run_id }}" | |
enableCrossOsArchive: true | |
deploy_javadoc: | |
needs: [ build_artifacts, test_linux ] | |
if: needs.workflow_config.outputs.do_javadoc == 'true' | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout the repository | |
uses: actions/checkout@v4 | |
- name: Set up java | |
uses: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: temurin | |
- name: Build Javadoc | |
run: gradle javadoc | |
- name: Deploy Javadoc to GitHub Pages | |
uses: peaceiris/actions-gh-pages@v3 | |
with: | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
publish_dir: ./build/docs/javadoc | |
upload: | |
if: | | |
needs.workflow_config.outputs.do_release == 'true' || | |
needs.workflow_config.outputs.do_snapshot_release == 'true' | |
needs: [ workflow_config, build_artifacts, test_linux ] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout the repository | |
uses: actions/checkout@v4 | |
- name: Set up java | |
uses: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: temurin | |
cache: gradle | |
- name: Restore Libs cache | |
uses: actions/cache/restore@v4 | |
with: | |
path: | | |
build/libs | |
build/publications | |
plantuml-asl/build/libs | |
plantuml-bsd/build/libs | |
plantuml-epl/build/libs | |
plantuml-lgpl/build/libs | |
plantuml-mit/build/libs | |
plantuml-gplv2/build/libs | |
key: "libs-${{ github.run_id }}" | |
fail-on-cache-miss: true | |
enableCrossOsArchive: true | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
# Using github.run_number here to reduce confusion when downloading & comparing artifacts from several builds | |
name: ${{ github.run_number }}-artifacts | |
path: | | |
build/libs/* | |
build/publications/maven/* | |
plantuml-asl/build/libs | |
plantuml-bsd/build/libs | |
plantuml-epl/build/libs | |
plantuml-lgpl/build/libs | |
plantuml-mit/build/libs | |
plantuml-gplv2/build/libs | |
- name: Create snapshot | |
if: needs.workflow_config.outputs.do_snapshot_release == 'true' | |
env: | |
RELEASE_VERSION: ${{ needs.build_artifacts.outputs.RELEASE_VERSION }} | |
GITHUB_TOKEN: ${{ github.token }} | |
OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} | |
OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} | |
#do not remove signing key and password or signatures will not be published | |
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.ARTIFACT_SIGNING_KEY }} | |
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.ARTIFACT_SIGNING_PASSPHRASE }} | |
run: | | |
echo "print gradle.properties" | |
cat gradle.properties | |
echo "RELEASE_VERSION=$RELEASE_VERSION" | |
.github/scripts/release-snapshot.sh | |
- name: Create release in GitHub and OSSRH | |
if: needs.workflow_config.outputs.do_release == 'true' | |
env: | |
RELEASE_VERSION: ${{ needs.build_artifacts.outputs.RELEASE_VERSION }} | |
GITHUB_TOKEN: ${{ github.token }} | |
TAG: ${{ github.event.ref }} | |
OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} | |
OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} | |
#do not remove signing key and password or signatures will not be published | |
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.ARTIFACT_SIGNING_KEY }} | |
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.ARTIFACT_SIGNING_PASSPHRASE }} | |
run: | | |
echo "print gradle.properties" | |
cat gradle.properties | |
echo "RELEASE_VERSION=$RELEASE_VERSION" | |
.github/scripts/release.sh | |
gradle --debug publish | |
push_to_docker_registry: | |
needs: [ workflow_config, upload, test_linux ] | |
if: needs.workflow_config.outputs.do_release == 'true' | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check out the repo | |
uses: actions/checkout@v4 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Docker meta | |
id: meta | |
uses: docker/metadata-action@v5 | |
with: | |
# list of Docker images to use as base name for tags | |
images: | | |
${{ github.repository }} | |
ghcr.io/${{ github.repository }} | |
# generate Docker tags based on the following events/attributes | |
tags: | | |
type=semver,pattern={{version}} | |
type=semver,pattern={{major}}.{{minor}} | |
type=semver,pattern={{major}} | |
type=sha | |
- name: Log into Docker Hub | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKERHUB_USERNAME }} | |
password: ${{ secrets.DOCKERHUB_TOKEN }} | |
- name: Log in to GitHub Docker Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ github.repository_owner }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Build/push container image | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
push: true | |
build-args: | | |
PLANTUML_VERSION=${{ github.event.ref }} | |
tags: ${{ steps.meta.outputs.tags }} | |
labels: ${{ steps.meta.outputs.labels }} | |
platforms: linux/amd64,linux/arm64 |