Build Yogurt PMHQ #11
This file contains hidden or 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: 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 | |
| - build-native | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Download linux-x64 executable | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: yogurt-linux-x64 | |
| path: docker/bin/linux-amd64 | |
| - name: Download linux-arm64 executable | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: yogurt-linux-arm64 | |
| path: docker/bin/linux-arm64 | |
| - name: Normalize Docker binaries | |
| run: | | |
| set -euo pipefail | |
| mv docker/bin/linux-amd64/yogurt.kexe docker/bin/linux-amd64/yogurt | |
| mv docker/bin/linux-arm64/yogurt.kexe docker/bin/linux-arm64/yogurt | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v3 | |
| - 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,linux/arm64 | |
| push: true | |
| tags: ${{ steps.docker_meta.outputs.tags }} | |
| labels: ${{ steps.docker_meta.outputs.labels }} | |
| cache-from: type=gha | |
| cache-to: type=gha,mode=max |