Skip to content

Build Yogurt PMHQ

Build Yogurt PMHQ #3

name: Build Yogurt PMHQ
on:
workflow_dispatch:
permissions:
contents: write
packages: write
jobs:
resolve-meta:
runs-on: ubuntu-latest
outputs:
release_version: ${{ steps.meta.outputs.release_version }}
release_tag: ${{ steps.meta.outputs.release_tag }}
release_name: ${{ steps.meta.outputs.release_name }}
docker_image: ${{ steps.meta.outputs.docker_image }}
docker_version_tag: ${{ steps.meta.outputs.docker_version_tag }}
docker_sha_tag: ${{ steps.meta.outputs.docker_sha_tag }}
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Resolve release metadata
id: meta
run: |
set -euo pipefail
version="$(python3 <<'PY'
import re
from pathlib import Path
gradle_file = Path("yogurt") / "build.gradle.kts"
content = gradle_file.read_text(encoding="utf-8")
match = re.search(r'version\s*=\s*"([^"]+)"', content)
if not match:
raise SystemExit("Cannot find version in yogurt/build.gradle.kts")
print(match.group(1))
PY
)"
short_hash="$(git rev-parse --short=7 HEAD)"
release_tag="v${version}+${short_hash}"
docker_version_tag="${version}-${short_hash}"
docker_sha_tag="sha-${short_hash}"
docker_image="ghcr.io/llonebot/yogurt-pmhq"
echo "release_version=${version}" >> "$GITHUB_OUTPUT"
echo "release_tag=${release_tag}" >> "$GITHUB_OUTPUT"
echo "release_name=${release_tag}" >> "$GITHUB_OUTPUT"
echo "docker_image=${docker_image}" >> "$GITHUB_OUTPUT"
echo "docker_version_tag=${docker_version_tag}" >> "$GITHUB_OUTPUT"
echo "docker_sha_tag=${docker_sha_tag}" >> "$GITHUB_OUTPUT"
build-native:
needs: resolve-meta
runs-on: ${{ matrix.runs-on }}
strategy:
matrix:
include:
- runs-on: ubuntu-latest
target: mingwX64
gradle-target: MingwX64
platform: windows-x64
- runs-on: macos-latest
target: macosX64
gradle-target: MacosX64
platform: macos-x64
- runs-on: macos-latest
target: macosArm64
gradle-target: MacosArm64
platform: macos-arm64
- runs-on: ubuntu-latest
target: linuxX64
gradle-target: LinuxX64
platform: linux-x64
- runs-on: ubuntu-latest
target: linuxArm64
gradle-target: LinuxArm64
platform: linux-arm64
env:
GITHUB_ACTIONS_BUILD_TARGET: ${{ matrix.target }}
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Cache konan
uses: actions/cache@v4
with:
path: ~/.konan
key: ${{ runner.os }}-konan-${{ matrix.target }}-${{ hashFiles('**/gradle/libs.versions.toml') }}
- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrappers
key: ${{ runner.os }}-gradleNativeBuild-${{ matrix.target }}-${{ hashFiles('**/gradle/libs.versions.toml') }}
- name: Setup JDK 25
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 25
- name: Build Yogurt for ${{ matrix.target }}
run: ./gradlew :yogurt:linkReleaseExecutable${{ matrix.gradle-target }} --no-daemon
- name: Upload ${{ matrix.target }} executable
uses: actions/upload-artifact@v4
with:
name: yogurt-${{ matrix.platform }}
path: yogurt/build/bin/${{ matrix.target }}/releaseExecutable/**
build-jvm:
needs: resolve-meta
runs-on: ubuntu-latest
env:
GITHUB_ACTIONS_BUILD_TARGET: jvm
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Setup JDK 25
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 25
cache: gradle
- name: Build yogurt-jvm fat jar
run: ./gradlew :yogurt-jvm:shadowJar --no-daemon
- name: Upload fat jar artifact
uses: actions/upload-artifact@v4
with:
name: yogurt-jvm
path: yogurt-jvm/build/libs/yogurt-jvm-all.jar
release-yogurt:
needs:
- resolve-meta
- build-native
- build-jvm
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
path: release-input
- name: Prepare release assets
run: |
set -euo pipefail
mkdir -p release-assets
for dir in release-input/yogurt-*; do
if [ -d "$dir" ]; then
base="$(basename "$dir")"
if [ "$base" = "yogurt-jvm" ]; then
continue
fi
(cd "$dir" && zip -r "../../release-assets/${base}.zip" .)
fi
done
if [ -f release-input/yogurt-jvm/yogurt-jvm-all.jar ]; then
cp release-input/yogurt-jvm/yogurt-jvm-all.jar release-assets/yogurt-jvm-all.jar
fi
- name: Create GitHub release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.resolve-meta.outputs.release_tag }}
name: ${{ needs.resolve-meta.outputs.release_name }}
generate_release_notes: false
files: release-assets/*
body: |
Yogurt PMHQ build for commit `${{ github.sha }}`
publish-docker:
needs: resolve-meta
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract Docker metadata
id: docker_meta
uses: docker/metadata-action@v5
with:
images: ${{ needs.resolve-meta.outputs.docker_image }}
tags: |
type=raw,value=latest
type=raw,value=${{ needs.resolve-meta.outputs.release_version }}
type=raw,value=${{ needs.resolve-meta.outputs.docker_version_tag }}
type=raw,value=${{ needs.resolve-meta.outputs.docker_sha_tag }}
labels: |
org.opencontainers.image.title=yogurt-pmhq
org.opencontainers.image.description=Yogurt PMHQ Docker image
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.version=${{ needs.resolve-meta.outputs.release_tag }}
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
file: docker/Dockerfile
platforms: linux/amd64
push: true
build-args: |
YOGURT_GIT_HASH=${{ github.sha }}
tags: ${{ steps.docker_meta.outputs.tags }}
labels: ${{ steps.docker_meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max