refactor(selector): optimize search content negotiation #8274
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
| # This file was generated using Kotlin DSL (.github/workflows/src.main.kts). | |
| # If you want to modify the workflow, please change the Kotlin file and regenerate this YAML file. | |
| # Generated with https://github.com/typesafegithub/github-workflows-kt | |
| name: 'Build' | |
| on: | |
| push: | |
| paths-ignore: | |
| - '**/*.md' | |
| - '.idea/**' | |
| - '.junie/**' | |
| - '.readme/**' | |
| - '.run/**' | |
| - 'scripts/*' | |
| pull_request: | |
| paths-ignore: | |
| - '**/*.md' | |
| - '.idea/**' | |
| - '.junie/**' | |
| - '.readme/**' | |
| - '.run/**' | |
| - 'scripts/*' | |
| concurrency: | |
| group: '${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name == ''main'' && github.run_id || github.ref_name }}' | |
| cancel-in-progress: true | |
| jobs: | |
| consistency-check: | |
| name: 'Workflow YAML Consistency Check' | |
| runs-on: 'ubuntu-latest' | |
| permissions: {} | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| - id: 'step-1' | |
| run: 'pip3 install PyYAML' | |
| - id: 'step-2' | |
| run: 'cp ".github/workflows/build.yml" ".github/workflows/build.yml-check.yml" ' | |
| - id: 'step-3' | |
| run: '.github/workflows/src.main.kts' | |
| - id: 'step-4' | |
| run: 'python .github/workflows/check_yaml_equivalence.py .github/workflows/build.yml .github/workflows/build.yml-check.yml' | |
| build_github-windows-2022: | |
| name: 'Build (Windows Server 2019 x86_64)' | |
| runs-on: | |
| - 'windows-2022' | |
| permissions: | |
| actions: 'write' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| with: | |
| submodules: 'recursive' | |
| - id: 'step-1' | |
| continue-on-error: true | |
| run: 'rm local.properties' | |
| - id: 'step-2' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.android.abis=x86_64" >> local.properties | |
| echo "ani.dandanplay.app.id=${{ secrets.DANDANPLAY_APP_ID }}" >> local.properties | |
| echo "ani.dandanplay.app.secret=${{ secrets.DANDANPLAY_APP_SECRET }}" >> local.properties | |
| echo "ani.sentry.dsn=${{ secrets.SENTRY_DSN }}" >> local.properties | |
| echo "kotlin.native.ignoreDisabledTargets=true" >> local.properties | |
| - id: 'step-3' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.enable.firebase=true" >> local.properties | |
| echo "firebase.ga.app.id=${{ secrets.FIREBASE_GA_APP_ID }}" >> local.properties | |
| echo "firebase.ga.api.secret=${{ secrets.FIREBASE_GA_API_SECRET }}" >> local.properties | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-4' | |
| name: 'Get JBR (Windows)' | |
| env: | |
| RUNNER_TOOL_CACHE: '${{ runner.tool_cache }}' | |
| JBR_URL: 'https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-windows-x64-b1163.116.tar.gz' | |
| JBR_CHECKSUM_URL: 'https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-windows-x64-b1163.116.tar.gz.checksum' | |
| shell: 'cmd' | |
| run: 'python .github/workflows/download_jbr.py' | |
| - id: 'step-5' | |
| name: 'Setup JBR 21 for Windows' | |
| uses: 'gmitch215/setup-java@6d2c5e1f82f180ae79f799f0ed6e3e5efb4e664d' | |
| with: | |
| java-version: '21' | |
| distribution: 'jdkfile' | |
| jdkFile: '${{ steps.step-4.outputs.jbrLocation }}' | |
| env: | |
| GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' | |
| - id: 'step-6' | |
| name: 'Dump Local Properties' | |
| run: 'echo "jvm.toolchain.version=21" >> local.properties' | |
| - id: 'step-7' | |
| name: 'Setup Gradle' | |
| uses: 'gradle/actions/setup-gradle@v3' | |
| with: | |
| cache-disabled: 'true' | |
| - id: 'step-8' | |
| name: 'Clean and download dependencies (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| - id: 'step-9' | |
| name: 'Clean and download dependencies (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| if: '${{ steps.step-8.outcome == ''failure'' }}' | |
| - id: 'step-10' | |
| name: 'Update dev version name (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| - id: 'step-11' | |
| name: 'Update dev version name (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| if: '${{ steps.step-10.outcome == ''failure'' }}' | |
| - id: 'step-12' | |
| name: 'Prepare google-services.json' | |
| env: | |
| BASE64_CONTENT: '${{ secrets.GOOGLE_SERVICES_JSON }}' | |
| FILE_PATH: './app/android/google-services.json' | |
| continue-on-error: true | |
| shell: 'bash' | |
| run: |- | |
| set -euo pipefail | |
| if [ -z "${BASE64_CONTENT:-}" ]; then | |
| echo "BASE64_CONTENT is empty" >&2 | |
| exit 1 | |
| fi | |
| mkdir -p "$(dirname "$FILE_PATH")" | |
| if ! printf '%s' "$BASE64_CONTENT" | base64 --decode > "$FILE_PATH" 2>/dev/null; then | |
| printf '%s' "$BASE64_CONTENT" | base64 -D > "$FILE_PATH" | |
| fi | |
| chmod 600 "$FILE_PATH" | |
| echo "filePath=$FILE_PATH" >> "$GITHUB_OUTPUT" | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-13' | |
| name: 'Compile Kotlin (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| - id: 'step-14' | |
| name: 'Compile Kotlin (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| if: '${{ steps.step-13.outcome == ''failure'' }}' | |
| - id: 'step-15' | |
| name: 'Compile Kotlin Android (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileDefaultDebugKotlin compileDefaultReleaseKotlin "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| - id: 'step-16' | |
| name: 'Compile Kotlin Android (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileDefaultDebugKotlin compileDefaultReleaseKotlin "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| if: '${{ steps.step-15.outcome == ''failure'' }}' | |
| - id: 'step-17' | |
| name: 'Package Desktop (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew createReleaseDistributable "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| - id: 'step-18' | |
| name: 'Package Desktop (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew createReleaseDistributable "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| if: '${{ steps.step-17.outcome == ''failure'' }}' | |
| - id: 'step-19' | |
| name: 'Upload compose logs' | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'compose-logs-github-windows-2022' | |
| path: 'app/desktop/build/compose/logs' | |
| if: '${{ always() }}' | |
| - id: 'step-20' | |
| name: 'Upload Windows packages (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-windows-portable' | |
| path: 'app/desktop/build/compose/binaries/main-release/app' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| - id: 'step-21' | |
| name: 'Upload Windows packages (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-windows-portable' | |
| path: 'app/desktop/build/compose/binaries/main-release/app' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-20.outcome == ''failure'' }}' | |
| - id: 'step-22' | |
| name: 'Upload Windows packages (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-windows-portable' | |
| path: 'app/desktop/build/compose/binaries/main-release/app' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-21.outcome == ''failure'' }}' | |
| - id: 'step-23' | |
| name: 'Check (Desktop) (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew desktopTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| - id: 'step-24' | |
| name: 'Check (Desktop) (Attempt #2)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew desktopTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| if: '${{ steps.step-23.outcome == ''failure'' }}' | |
| - id: 'step-25' | |
| name: 'Check (Desktop) (Attempt #3)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew desktopTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| if: '${{ steps.step-24.outcome == ''failure'' }}' | |
| - id: 'step-26' | |
| name: 'Check (Android Host) (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew testAndroidHostTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| - id: 'step-27' | |
| name: 'Check (Android Host) (Attempt #2)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew testAndroidHostTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| if: '${{ steps.step-26.outcome == ''failure'' }}' | |
| - id: 'step-28' | |
| name: 'Check (Android Host) (Attempt #3)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew testAndroidHostTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DBoost_INCLUDE_DIR=C:/vcpkg/installed/x64-windows/include" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel"' | |
| if: '${{ steps.step-27.outcome == ''failure'' }}' | |
| build_github-windows-11-arm64: | |
| name: 'Build (Windows 11 AArch64 (GitHub))' | |
| runs-on: | |
| - 'windows-11-arm' | |
| permissions: | |
| actions: 'write' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| with: | |
| submodules: 'recursive' | |
| - id: 'step-1' | |
| continue-on-error: true | |
| run: 'rm local.properties' | |
| - id: 'step-2' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.android.abis=arm64-v8a" >> local.properties | |
| echo "ani.dandanplay.app.id=${{ secrets.DANDANPLAY_APP_ID }}" >> local.properties | |
| echo "ani.dandanplay.app.secret=${{ secrets.DANDANPLAY_APP_SECRET }}" >> local.properties | |
| echo "ani.sentry.dsn=${{ secrets.SENTRY_DSN }}" >> local.properties | |
| echo "kotlin.native.ignoreDisabledTargets=true" >> local.properties | |
| - id: 'step-3' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.enable.firebase=true" >> local.properties | |
| echo "firebase.ga.app.id=${{ secrets.FIREBASE_GA_APP_ID }}" >> local.properties | |
| echo "firebase.ga.api.secret=${{ secrets.FIREBASE_GA_API_SECRET }}" >> local.properties | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-4' | |
| name: 'Setup Android SDK' | |
| uses: 'android-actions/setup-android@v3' | |
| with: | |
| accept-android-sdk-licenses: 'true' | |
| packages: 'platform-tools platforms;android-37.0 build-tools;36.0.0' | |
| - id: 'step-5' | |
| name: 'Get JBR (Windows)' | |
| env: | |
| RUNNER_TOOL_CACHE: '${{ runner.tool_cache }}' | |
| JBR_URL: 'https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-windows-aarch64-b1163.116.tar.gz' | |
| JBR_CHECKSUM_URL: 'https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-windows-aarch64-b1163.116.tar.gz.checksum' | |
| shell: 'cmd' | |
| run: 'python .github/workflows/download_jbr.py' | |
| - id: 'step-6' | |
| name: 'Setup JBR 21 for Windows' | |
| uses: 'gmitch215/setup-java@6d2c5e1f82f180ae79f799f0ed6e3e5efb4e664d' | |
| with: | |
| java-version: '21' | |
| distribution: 'jdkfile' | |
| jdkFile: '${{ steps.step-5.outputs.jbrLocation }}' | |
| env: | |
| GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' | |
| - id: 'step-7' | |
| name: 'Dump Local Properties' | |
| run: 'echo "jvm.toolchain.version=21" >> local.properties' | |
| - id: 'step-8' | |
| name: 'Setup Gradle' | |
| uses: 'gradle/actions/setup-gradle@v3' | |
| with: | |
| cache-disabled: 'true' | |
| - id: 'step-9' | |
| name: 'Clean and download dependencies (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| - id: 'step-10' | |
| name: 'Clean and download dependencies (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| if: '${{ steps.step-9.outcome == ''failure'' }}' | |
| - id: 'step-11' | |
| name: 'Update dev version name (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| - id: 'step-12' | |
| name: 'Update dev version name (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| if: '${{ steps.step-11.outcome == ''failure'' }}' | |
| - id: 'step-13' | |
| name: 'Prepare google-services.json' | |
| env: | |
| BASE64_CONTENT: '${{ secrets.GOOGLE_SERVICES_JSON }}' | |
| FILE_PATH: './app/android/google-services.json' | |
| continue-on-error: true | |
| shell: 'bash' | |
| run: |- | |
| set -euo pipefail | |
| if [ -z "${BASE64_CONTENT:-}" ]; then | |
| echo "BASE64_CONTENT is empty" >&2 | |
| exit 1 | |
| fi | |
| mkdir -p "$(dirname "$FILE_PATH")" | |
| if ! printf '%s' "$BASE64_CONTENT" | base64 --decode > "$FILE_PATH" 2>/dev/null; then | |
| printf '%s' "$BASE64_CONTENT" | base64 -D > "$FILE_PATH" | |
| fi | |
| chmod 600 "$FILE_PATH" | |
| echo "filePath=$FILE_PATH" >> "$GITHUB_OUTPUT" | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-14' | |
| name: 'Compile Kotlin (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| - id: 'step-15' | |
| name: 'Compile Kotlin (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| if: '${{ steps.step-14.outcome == ''failure'' }}' | |
| - id: 'step-16' | |
| name: 'Compile Kotlin Android (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileDefaultDebugKotlin compileDefaultReleaseKotlin "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| - id: 'step-17' | |
| name: 'Compile Kotlin Android (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileDefaultDebugKotlin compileDefaultReleaseKotlin "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| if: '${{ steps.step-16.outcome == ''failure'' }}' | |
| - id: 'step-18' | |
| name: 'Package Desktop (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew createReleaseDistributable "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| - id: 'step-19' | |
| name: 'Package Desktop (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew createReleaseDistributable "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| if: '${{ steps.step-18.outcome == ''failure'' }}' | |
| - id: 'step-20' | |
| name: 'Upload compose logs' | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'compose-logs-github-windows-11-arm64' | |
| path: 'app/desktop/build/compose/logs' | |
| if: '${{ always() }}' | |
| - id: 'step-21' | |
| name: 'Upload Windows packages (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-windows-aarch64-portable' | |
| path: 'app/desktop/build/compose/binaries/main-release/app' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| - id: 'step-22' | |
| name: 'Upload Windows packages (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-windows-aarch64-portable' | |
| path: 'app/desktop/build/compose/binaries/main-release/app' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-21.outcome == ''failure'' }}' | |
| - id: 'step-23' | |
| name: 'Upload Windows packages (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-windows-aarch64-portable' | |
| path: 'app/desktop/build/compose/binaries/main-release/app' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-22.outcome == ''failure'' }}' | |
| - id: 'step-24' | |
| name: 'Check (Desktop) (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew desktopTest -x :torrent:anitorrent:desktopTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| - id: 'step-25' | |
| name: 'Check (Desktop) (Attempt #2)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew desktopTest -x :torrent:anitorrent:desktopTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| if: '${{ steps.step-24.outcome == ''failure'' }}' | |
| - id: 'step-26' | |
| name: 'Check (Desktop) (Attempt #3)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew desktopTest -x :torrent:anitorrent:desktopTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| if: '${{ steps.step-25.outcome == ''failure'' }}' | |
| - id: 'step-27' | |
| name: 'Check (Android Host) (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew testAndroidHostTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| - id: 'step-28' | |
| name: 'Check (Android Host) (Attempt #2)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew testAndroidHostTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| if: '${{ steps.step-27.outcome == ''failure'' }}' | |
| - id: 'step-29' | |
| name: 'Check (Android Host) (Attempt #3)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew testAndroidHostTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options=-Xmx4g" "-Dkotlin.daemon.jvm.options=-Xmx4g" "--parallel" "--no-configuration-cache"' | |
| if: '${{ steps.step-28.outcome == ''failure'' }}' | |
| build_github-ubuntu-2404: | |
| name: 'Build (Ubuntu 24.04 x86_64 (GitHub))' | |
| runs-on: | |
| - 'ubuntu-24.04' | |
| permissions: | |
| actions: 'write' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| with: | |
| submodules: 'recursive' | |
| - id: 'step-1' | |
| name: 'Free space for Ubuntu' | |
| uses: 'jlumbroso/free-disk-space@v1.3.1' | |
| with: | |
| android: 'false' | |
| large-packages: 'false' | |
| tool-cache: 'false' | |
| - id: 'step-2' | |
| name: 'Enable Swap' | |
| run: |- | |
| sudo fallocate -l 10G /swapfile | |
| sudo chmod 600 /swapfile | |
| sudo mkswap /swapfile | |
| sudo swapon /swapfile | |
| - id: 'step-3' | |
| continue-on-error: true | |
| run: 'rm local.properties' | |
| - id: 'step-4' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.android.abis=all" >> local.properties | |
| echo "ani.dandanplay.app.id=${{ secrets.DANDANPLAY_APP_ID }}" >> local.properties | |
| echo "ani.dandanplay.app.secret=${{ secrets.DANDANPLAY_APP_SECRET }}" >> local.properties | |
| echo "ani.sentry.dsn=${{ secrets.SENTRY_DSN }}" >> local.properties | |
| echo "kotlin.native.ignoreDisabledTargets=true" >> local.properties | |
| - id: 'step-5' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.enable.firebase=true" >> local.properties | |
| echo "firebase.ga.app.id=${{ secrets.FIREBASE_GA_APP_ID }}" >> local.properties | |
| echo "firebase.ga.api.secret=${{ secrets.FIREBASE_GA_API_SECRET }}" >> local.properties | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-6' | |
| name: 'Get JBR (Windows)' | |
| env: | |
| RUNNER_TOOL_CACHE: '${{ runner.tool_cache }}' | |
| JBR_URL: 'https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-linux-x64-b1163.116.tar.gz' | |
| JBR_CHECKSUM_URL: 'https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-linux-x64-b1163.116.tar.gz.checksum' | |
| shell: 'bash' | |
| run: 'python .github/workflows/download_jbr.py' | |
| - id: 'step-7' | |
| name: 'Setup JBR 21 for Ubuntu' | |
| uses: 'gmitch215/setup-java@6d2c5e1f82f180ae79f799f0ed6e3e5efb4e664d' | |
| with: | |
| java-version: '21' | |
| distribution: 'jdkfile' | |
| jdkFile: '${{ steps.step-6.outputs.jbrLocation }}' | |
| env: | |
| GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' | |
| - id: 'step-8' | |
| name: 'Dump Local Properties' | |
| run: 'echo "jvm.toolchain.version=21" >> local.properties' | |
| - id: 'step-9' | |
| run: 'chmod -R 777 .' | |
| - id: 'step-10' | |
| name: 'Setup Gradle' | |
| uses: 'gradle/actions/setup-gradle@v3' | |
| with: | |
| cache-disabled: 'true' | |
| - id: 'step-11' | |
| name: 'Clean and download dependencies (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-12' | |
| name: 'Clean and download dependencies (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-11.outcome == ''failure'' }}' | |
| - id: 'step-13' | |
| name: 'Update dev version name (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-14' | |
| name: 'Update dev version name (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-13.outcome == ''failure'' }}' | |
| - id: 'step-15' | |
| name: 'Prepare signing key' | |
| env: | |
| BASE64_CONTENT: '${{ secrets.SIGNING_RELEASE_STOREFILE }}' | |
| FILE_PATH: './android_signing_key' | |
| continue-on-error: true | |
| shell: 'bash' | |
| run: |- | |
| set -euo pipefail | |
| if [ -z "${BASE64_CONTENT:-}" ]; then | |
| echo "BASE64_CONTENT is empty" >&2 | |
| exit 1 | |
| fi | |
| mkdir -p "$(dirname "$FILE_PATH")" | |
| if ! printf '%s' "$BASE64_CONTENT" | base64 --decode > "$FILE_PATH" 2>/dev/null; then | |
| printf '%s' "$BASE64_CONTENT" | base64 -D > "$FILE_PATH" | |
| fi | |
| chmod 600 "$FILE_PATH" | |
| echo "filePath=$FILE_PATH" >> "$GITHUB_OUTPUT" | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-16' | |
| name: 'Prepare google-services.json' | |
| env: | |
| BASE64_CONTENT: '${{ secrets.GOOGLE_SERVICES_JSON }}' | |
| FILE_PATH: './app/android/google-services.json' | |
| continue-on-error: true | |
| shell: 'bash' | |
| run: |- | |
| set -euo pipefail | |
| if [ -z "${BASE64_CONTENT:-}" ]; then | |
| echo "BASE64_CONTENT is empty" >&2 | |
| exit 1 | |
| fi | |
| mkdir -p "$(dirname "$FILE_PATH")" | |
| if ! printf '%s' "$BASE64_CONTENT" | base64 --decode > "$FILE_PATH" 2>/dev/null; then | |
| printf '%s' "$BASE64_CONTENT" | base64 -D > "$FILE_PATH" | |
| fi | |
| chmod 600 "$FILE_PATH" | |
| echo "filePath=$FILE_PATH" >> "$GITHUB_OUTPUT" | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-17' | |
| name: 'Compile Kotlin (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-18' | |
| name: 'Compile Kotlin (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-17.outcome == ''failure'' }}' | |
| - id: 'step-19' | |
| name: 'Compile Kotlin Android (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileDefaultDebugKotlin compileDefaultReleaseKotlin "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-20' | |
| name: 'Compile Kotlin Android (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileDefaultDebugKotlin compileDefaultReleaseKotlin "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-19.outcome == ''failure'' }}' | |
| - id: 'step-21' | |
| name: 'Build Android Debug APKs (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew assembleDefaultDebug "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-22' | |
| name: 'Build Android Debug APKs (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew assembleDefaultDebug "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-21.outcome == ''failure'' }}' | |
| - id: 'step-23' | |
| name: 'Upload Android Debug APK arm64-v8a (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-arm64-v8a-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-arm64-v8a-debug.apk' | |
| overwrite: 'true' | |
| - id: 'step-24' | |
| name: 'Upload Android Debug APK arm64-v8a (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-arm64-v8a-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-arm64-v8a-debug.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-23.outcome == ''failure'' }}' | |
| - id: 'step-25' | |
| name: 'Upload Android Debug APK arm64-v8a (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-arm64-v8a-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-arm64-v8a-debug.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-24.outcome == ''failure'' }}' | |
| - id: 'step-26' | |
| name: 'Upload Android Debug APK x86_64 (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-x86_64-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-x86_64-debug.apk' | |
| overwrite: 'true' | |
| - id: 'step-27' | |
| name: 'Upload Android Debug APK x86_64 (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-x86_64-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-x86_64-debug.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-26.outcome == ''failure'' }}' | |
| - id: 'step-28' | |
| name: 'Upload Android Debug APK x86_64 (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-x86_64-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-x86_64-debug.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-27.outcome == ''failure'' }}' | |
| - id: 'step-29' | |
| name: 'Upload Android Debug APK armeabi-v7a (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-armeabi-v7a-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-armeabi-v7a-debug.apk' | |
| overwrite: 'true' | |
| - id: 'step-30' | |
| name: 'Upload Android Debug APK armeabi-v7a (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-armeabi-v7a-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-armeabi-v7a-debug.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-29.outcome == ''failure'' }}' | |
| - id: 'step-31' | |
| name: 'Upload Android Debug APK armeabi-v7a (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-armeabi-v7a-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-armeabi-v7a-debug.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-30.outcome == ''failure'' }}' | |
| - id: 'step-32' | |
| name: 'Upload Android Debug APK universal (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-universal-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-universal-debug.apk' | |
| overwrite: 'true' | |
| - id: 'step-33' | |
| name: 'Upload Android Debug APK universal (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-universal-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-universal-debug.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-32.outcome == ''failure'' }}' | |
| - id: 'step-34' | |
| name: 'Upload Android Debug APK universal (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-universal-debug' | |
| path: 'app/android/build/outputs/apk/default/debug/android-default-universal-debug.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-33.outcome == ''failure'' }}' | |
| - id: 'step-35' | |
| name: 'Build Android Release APKs (Attempt #1)' | |
| env: | |
| signing_release_storeFileFromRoot: '${{ steps.step-15.outputs.filePath }}' | |
| signing_release_storePassword: '${{ secrets.SIGNING_RELEASE_STOREPASSWORD }}' | |
| signing_release_keyAlias: '${{ secrets.SIGNING_RELEASE_KEYALIAS }}' | |
| signing_release_keyPassword: '${{ secrets.SIGNING_RELEASE_KEYPASSWORD }}' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew assembleDefaultRelease "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-36' | |
| name: 'Build Android Release APKs (Attempt #2)' | |
| env: | |
| signing_release_storeFileFromRoot: '${{ steps.step-15.outputs.filePath }}' | |
| signing_release_storePassword: '${{ secrets.SIGNING_RELEASE_STOREPASSWORD }}' | |
| signing_release_keyAlias: '${{ secrets.SIGNING_RELEASE_KEYALIAS }}' | |
| signing_release_keyPassword: '${{ secrets.SIGNING_RELEASE_KEYPASSWORD }}' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew assembleDefaultRelease "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-35.outcome == ''failure'' }}' | |
| - id: 'step-37' | |
| name: 'Upload Android Release APK arm64-v8a (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-arm64-v8a-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-arm64-v8a-release.apk' | |
| overwrite: 'true' | |
| - id: 'step-38' | |
| name: 'Upload Android Release APK arm64-v8a (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-arm64-v8a-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-arm64-v8a-release.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-37.outcome == ''failure'' }}' | |
| - id: 'step-39' | |
| name: 'Upload Android Release APK arm64-v8a (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-arm64-v8a-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-arm64-v8a-release.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-38.outcome == ''failure'' }}' | |
| - id: 'step-40' | |
| name: 'Upload Android Release APK x86_64 (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-x86_64-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-x86_64-release.apk' | |
| overwrite: 'true' | |
| - id: 'step-41' | |
| name: 'Upload Android Release APK x86_64 (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-x86_64-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-x86_64-release.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-40.outcome == ''failure'' }}' | |
| - id: 'step-42' | |
| name: 'Upload Android Release APK x86_64 (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-x86_64-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-x86_64-release.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-41.outcome == ''failure'' }}' | |
| - id: 'step-43' | |
| name: 'Upload Android Release APK armeabi-v7a (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-armeabi-v7a-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-armeabi-v7a-release.apk' | |
| overwrite: 'true' | |
| - id: 'step-44' | |
| name: 'Upload Android Release APK armeabi-v7a (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-armeabi-v7a-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-armeabi-v7a-release.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-43.outcome == ''failure'' }}' | |
| - id: 'step-45' | |
| name: 'Upload Android Release APK armeabi-v7a (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-armeabi-v7a-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-armeabi-v7a-release.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-44.outcome == ''failure'' }}' | |
| - id: 'step-46' | |
| name: 'Upload Android Release APK universal (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-universal-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-universal-release.apk' | |
| overwrite: 'true' | |
| - id: 'step-47' | |
| name: 'Upload Android Release APK universal (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-universal-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-universal-release.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-46.outcome == ''failure'' }}' | |
| - id: 'step-48' | |
| name: 'Upload Android Release APK universal (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-android-universal-release' | |
| path: 'app/android/build/outputs/apk/default/release/android-default-universal-release.apk' | |
| overwrite: 'true' | |
| if: '${{ steps.step-47.outcome == ''failure'' }}' | |
| - id: 'step-49' | |
| name: 'Install patchelf' | |
| run: 'sudo apt-get install -y patchelf' | |
| - id: 'step-50' | |
| name: 'Package Desktop (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew createReleaseDistributable "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-51' | |
| name: 'Package Desktop (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew createReleaseDistributable "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-50.outcome == ''failure'' }}' | |
| - id: 'step-52' | |
| name: 'Upload compose logs' | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'compose-logs-github-ubuntu-2404' | |
| path: 'app/desktop/build/compose/logs' | |
| if: '${{ always() }}' | |
| - id: 'step-53' | |
| name: 'Build AppImage' | |
| run: |- | |
| # Download appimagetool | |
| wget https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage | |
| chmod +x appimagetool-x86_64.AppImage | |
| # Bundle the external updater. It is copied out of the read-only AppImage mount before use. | |
| appImageUpdateVersion="2.0.0-alpha-1-20251018" | |
| appImageUpdateTool="appimageupdatetool-x86_64.AppImage" | |
| wget "https://github.com/AppImageCommunity/AppImageUpdate/releases/download/$appImageUpdateVersion/$appImageUpdateTool" | |
| echo "d976cdac667b03dee8cb23fb95ef74b042c406c5cbab3ff294d2b16efeaff84f $appImageUpdateTool" | sha256sum -c - | |
| chmod +x "$appImageUpdateTool" | |
| # Prepare AppDir | |
| mkdir -p AppDir/usr | |
| cp -r app/desktop/build/compose/binaries/main-release/app/Ani/* AppDir/usr | |
| cp "$appImageUpdateTool" AppDir/usr/lib/app/resources/ | |
| cp app/desktop/appResources/linux-x64/AppRun AppDir/AppRun | |
| cp app/desktop/appResources/linux-x64/animeko.desktop AppDir/animeko.desktop | |
| cp app/desktop/appResources/linux-x64/icon.png AppDir/icon.png | |
| # Fix permissions | |
| chmod a+x AppDir/AppRun | |
| chmod a+x AppDir/usr/bin/Ani | |
| # The CEF helpers get their executable bit from restoreLinuxRuntimeExecutables, | |
| # so assert rather than chmod. A chmod here would keep the AppImage green while | |
| # the deb, the rpm and every direct user of createReleaseDistributable ship a | |
| # runtime whose helpers cannot be spawned (#3259). | |
| test -x AppDir/usr/lib/runtime/lib/jcef_helper | |
| test -x AppDir/usr/lib/runtime/lib/cef_server | |
| # Build an AppImage whose zsync metadata points at this repository's release asset. | |
| # Build with the final release filename so the generated zsync metadata keeps that name, | |
| # then normalize the local filenames expected by the upload tasks below. | |
| releaseTag="$GITHUB_REF_NAME" | |
| releaseVersion="$(printf '%s' "$releaseTag" | sed 's/^v//')" | |
| # Pull request merge refs contain '/', which must not become a path separator here. | |
| releaseVersion="${releaseVersion//\//-}" | |
| releaseAsset="ani-$releaseVersion-linux-x86_64.appimage" | |
| updateInformation="zsync|https://github.com/$GITHUB_REPOSITORY/releases/download/$releaseTag/$releaseAsset.zsync" | |
| ARCH=x86_64 ./appimagetool-x86_64.AppImage \ | |
| -u "$updateInformation" \ | |
| AppDir \ | |
| "$releaseAsset" | |
| # Keep the zsync reusable on GitHub, d.myani.org and compatible mirrors. | |
| sed -i "s|^URL:.*|URL: $releaseAsset|" "$releaseAsset.zsync" | |
| mv "$releaseAsset" Animeko-x86_64.AppImage | |
| mv "$releaseAsset.zsync" Animeko-x86_64.AppImage.zsync | |
| - id: 'step-54' | |
| name: 'Upload Linux packages (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-linux-appimage-x64' | |
| path: |- | |
| Animeko-x86_64.AppImage | |
| Animeko-x86_64.AppImage.zsync | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| - id: 'step-55' | |
| name: 'Upload Linux packages (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-linux-appimage-x64' | |
| path: |- | |
| Animeko-x86_64.AppImage | |
| Animeko-x86_64.AppImage.zsync | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-54.outcome == ''failure'' }}' | |
| - id: 'step-56' | |
| name: 'Upload Linux packages (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-linux-appimage-x64' | |
| path: |- | |
| Animeko-x86_64.AppImage | |
| Animeko-x86_64.AppImage.zsync | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-55.outcome == ''failure'' }}' | |
| build_github-macos-15-intel: | |
| name: 'Build (macOS 15 x86_64 (GitHub))' | |
| runs-on: | |
| - 'macos-15-intel' | |
| permissions: | |
| actions: 'write' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| with: | |
| submodules: 'recursive' | |
| - id: 'step-1' | |
| name: 'Free space for macOS' | |
| continue-on-error: true | |
| run: 'chmod +x ./ci-helper/free-space-macos.sh && ./ci-helper/free-space-macos.sh' | |
| - id: 'step-2' | |
| continue-on-error: true | |
| run: 'rm local.properties' | |
| - id: 'step-3' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.android.abis=arm64-v8a" >> local.properties | |
| echo "ani.enable.ios=true" >> local.properties | |
| echo "ani.dandanplay.app.id=${{ secrets.DANDANPLAY_APP_ID }}" >> local.properties | |
| echo "ani.dandanplay.app.secret=${{ secrets.DANDANPLAY_APP_SECRET }}" >> local.properties | |
| echo "ani.sentry.dsn=${{ secrets.SENTRY_DSN }}" >> local.properties | |
| echo "kotlin.native.ignoreDisabledTargets=true" >> local.properties | |
| - id: 'step-4' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.enable.firebase=true" >> local.properties | |
| echo "firebase.ga.app.id=${{ secrets.FIREBASE_GA_APP_ID }}" >> local.properties | |
| echo "firebase.ga.api.secret=${{ secrets.FIREBASE_GA_API_SECRET }}" >> local.properties | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-5' | |
| name: 'Resolve JBR location' | |
| shell: 'bash' | |
| run: |- | |
| # Expand jbrLocationExpr | |
| jbr_location_expr='${{ runner.tool_cache }}/jbrsdk_jcef-21.0.11-osx-x64-b1163.116.tar.gz' | |
| echo "jbrLocation=$jbr_location_expr" >> $GITHUB_OUTPUT | |
| - id: 'step-6' | |
| name: 'Get JBR 21 for macOS AArch64 (Attempt #1)' | |
| env: | |
| jbrLocation: '${{ steps.step-5.outputs.jbrLocation }}' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| shell: 'bash' | |
| run: |- | |
| jbr_location="$jbrLocation" | |
| checksum_url="https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-osx-x64-b1163.116.tar.gz.checksum" | |
| checksum_file="checksum.tmp" | |
| wget -q -O $checksum_file $checksum_url | |
| expected_checksum=$(awk '{print $1}' $checksum_file) | |
| file_checksum="" | |
| if [ -f "$jbr_location" ]; then | |
| file_checksum=$(shasum -a 512 "$jbr_location" | awk '{print $1}') | |
| fi | |
| if [ "$file_checksum" != "$expected_checksum" ]; then | |
| wget -q --tries=3 https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-osx-x64-b1163.116.tar.gz -O "$jbr_location" | |
| file_checksum=$(shasum -a 512 "$jbr_location" | awk '{print $1}') | |
| fi | |
| if [ "$file_checksum" != "$expected_checksum" ]; then | |
| echo "Checksum verification failed!" >&2 | |
| rm -f $checksum_file | |
| exit 1 | |
| fi | |
| rm -f $checksum_file | |
| file "$jbr_location" | |
| - id: 'step-7' | |
| name: 'Get JBR 21 for macOS AArch64 (Attempt #2)' | |
| env: | |
| jbrLocation: '${{ steps.step-5.outputs.jbrLocation }}' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| shell: 'bash' | |
| run: |- | |
| jbr_location="$jbrLocation" | |
| checksum_url="https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-osx-x64-b1163.116.tar.gz.checksum" | |
| checksum_file="checksum.tmp" | |
| wget -q -O $checksum_file $checksum_url | |
| expected_checksum=$(awk '{print $1}' $checksum_file) | |
| file_checksum="" | |
| if [ -f "$jbr_location" ]; then | |
| file_checksum=$(shasum -a 512 "$jbr_location" | awk '{print $1}') | |
| fi | |
| if [ "$file_checksum" != "$expected_checksum" ]; then | |
| wget -q --tries=3 https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-osx-x64-b1163.116.tar.gz -O "$jbr_location" | |
| file_checksum=$(shasum -a 512 "$jbr_location" | awk '{print $1}') | |
| fi | |
| if [ "$file_checksum" != "$expected_checksum" ]; then | |
| echo "Checksum verification failed!" >&2 | |
| rm -f $checksum_file | |
| exit 1 | |
| fi | |
| rm -f $checksum_file | |
| file "$jbr_location" | |
| if: '${{ steps.step-6.outcome == ''failure'' }}' | |
| - id: 'step-8' | |
| name: 'Setup JBR 21 for macOS ' | |
| uses: 'gmitch215/setup-java@6d2c5e1f82f180ae79f799f0ed6e3e5efb4e664d' | |
| with: | |
| java-version: '21' | |
| distribution: 'jdkfile' | |
| jdkFile: '${{ steps.step-5.outputs.jbrLocation }}' | |
| env: | |
| GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' | |
| - id: 'step-9' | |
| name: 'Dump Local Properties' | |
| run: 'echo "jvm.toolchain.version=21" >> local.properties' | |
| - id: 'step-10' | |
| run: 'chmod -R 777 .' | |
| - id: 'step-11' | |
| name: 'Setup Gradle' | |
| uses: 'gradle/actions/setup-gradle@v3' | |
| with: | |
| cache-disabled: 'true' | |
| - id: 'step-12' | |
| name: 'Clean and download dependencies (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-13' | |
| name: 'Clean and download dependencies (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-12.outcome == ''failure'' }}' | |
| - id: 'step-14' | |
| name: 'Update dev version name (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-15' | |
| name: 'Update dev version name (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-14.outcome == ''failure'' }}' | |
| - id: 'step-16' | |
| name: 'Prepare google-services.json' | |
| env: | |
| BASE64_CONTENT: '${{ secrets.GOOGLE_SERVICES_JSON }}' | |
| FILE_PATH: './app/android/google-services.json' | |
| continue-on-error: true | |
| shell: 'bash' | |
| run: |- | |
| set -euo pipefail | |
| if [ -z "${BASE64_CONTENT:-}" ]; then | |
| echo "BASE64_CONTENT is empty" >&2 | |
| exit 1 | |
| fi | |
| mkdir -p "$(dirname "$FILE_PATH")" | |
| if ! printf '%s' "$BASE64_CONTENT" | base64 --decode > "$FILE_PATH" 2>/dev/null; then | |
| printf '%s' "$BASE64_CONTENT" | base64 -D > "$FILE_PATH" | |
| fi | |
| chmod 600 "$FILE_PATH" | |
| echo "filePath=$FILE_PATH" >> "$GITHUB_OUTPUT" | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-17' | |
| name: 'Compile Kotlin (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-18' | |
| name: 'Compile Kotlin (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-17.outcome == ''failure'' }}' | |
| - id: 'step-19' | |
| name: 'Package Desktop (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew createReleaseDistributable "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| - id: 'step-20' | |
| name: 'Package Desktop (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew createReleaseDistributable "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g" "-Dkotlin.daemon.jvm.options=-Xmx6g"' | |
| if: '${{ steps.step-19.outcome == ''failure'' }}' | |
| - id: 'step-21' | |
| name: 'Upload compose logs' | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'compose-logs-github-macos-15-intel' | |
| path: 'app/desktop/build/compose/logs' | |
| if: '${{ always() }}' | |
| - id: 'step-22' | |
| name: 'Upload macOS x86_64 ZIP (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-macos-portable-x64' | |
| path: 'app/desktop/build/compose/binaries/main-release/app/Ani.app' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| - id: 'step-23' | |
| name: 'Upload macOS x86_64 ZIP (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-macos-portable-x64' | |
| path: 'app/desktop/build/compose/binaries/main-release/app/Ani.app' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-22.outcome == ''failure'' }}' | |
| - id: 'step-24' | |
| name: 'Upload macOS x86_64 ZIP (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-macos-portable-x64' | |
| path: 'app/desktop/build/compose/binaries/main-release/app/Ani.app' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-23.outcome == ''failure'' }}' | |
| build_self-hosted-macos-15: | |
| name: 'Build (macOS 15 AArch64 (Self-Hosted))' | |
| runs-on: | |
| - 'self-hosted' | |
| - 'macOS' | |
| - 'ARM64' | |
| permissions: | |
| actions: 'write' | |
| if: '${{ github.repository == ''open-ani/animeko'' }}' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| with: | |
| submodules: 'recursive' | |
| - id: 'step-1' | |
| continue-on-error: true | |
| run: 'rm local.properties' | |
| - id: 'step-2' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.android.abis=arm64-v8a" >> local.properties | |
| echo "ani.enable.ios=true" >> local.properties | |
| echo "ani.build.framework=true" >> local.properties | |
| echo "ani.dandanplay.app.id=${{ secrets.DANDANPLAY_APP_ID }}" >> local.properties | |
| echo "ani.dandanplay.app.secret=${{ secrets.DANDANPLAY_APP_SECRET }}" >> local.properties | |
| echo "ani.sentry.dsn=${{ secrets.SENTRY_DSN }}" >> local.properties | |
| echo "kotlin.native.ignoreDisabledTargets=true" >> local.properties | |
| - id: 'step-3' | |
| continue-on-error: true | |
| run: | | |
| echo "ani.enable.firebase=true" >> local.properties | |
| echo "firebase.ga.app.id=${{ secrets.FIREBASE_GA_APP_ID }}" >> local.properties | |
| echo "firebase.ga.api.secret=${{ secrets.FIREBASE_GA_API_SECRET }}" >> local.properties | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-4' | |
| name: 'Resolve JBR location' | |
| shell: 'bash' | |
| run: |- | |
| # Expand jbrLocationExpr | |
| jbr_location_expr='${{ runner.tool_cache }}/jbrsdk_jcef-21.0.11-osx-aarch64-b1163.116.tar.gz' | |
| echo "jbrLocation=$jbr_location_expr" >> $GITHUB_OUTPUT | |
| - id: 'step-5' | |
| name: 'Get JBR 21 for macOS AArch64 (Attempt #1)' | |
| env: | |
| jbrLocation: '${{ steps.step-4.outputs.jbrLocation }}' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| shell: 'bash' | |
| run: |- | |
| jbr_location="$jbrLocation" | |
| checksum_url="https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-osx-aarch64-b1163.116.tar.gz.checksum" | |
| checksum_file="checksum.tmp" | |
| wget -q -O $checksum_file $checksum_url | |
| expected_checksum=$(awk '{print $1}' $checksum_file) | |
| file_checksum="" | |
| if [ -f "$jbr_location" ]; then | |
| file_checksum=$(shasum -a 512 "$jbr_location" | awk '{print $1}') | |
| fi | |
| if [ "$file_checksum" != "$expected_checksum" ]; then | |
| wget -q --tries=3 https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-osx-aarch64-b1163.116.tar.gz -O "$jbr_location" | |
| file_checksum=$(shasum -a 512 "$jbr_location" | awk '{print $1}') | |
| fi | |
| if [ "$file_checksum" != "$expected_checksum" ]; then | |
| echo "Checksum verification failed!" >&2 | |
| rm -f $checksum_file | |
| exit 1 | |
| fi | |
| rm -f $checksum_file | |
| file "$jbr_location" | |
| - id: 'step-6' | |
| name: 'Get JBR 21 for macOS AArch64 (Attempt #2)' | |
| env: | |
| jbrLocation: '${{ steps.step-4.outputs.jbrLocation }}' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| shell: 'bash' | |
| run: |- | |
| jbr_location="$jbrLocation" | |
| checksum_url="https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-osx-aarch64-b1163.116.tar.gz.checksum" | |
| checksum_file="checksum.tmp" | |
| wget -q -O $checksum_file $checksum_url | |
| expected_checksum=$(awk '{print $1}' $checksum_file) | |
| file_checksum="" | |
| if [ -f "$jbr_location" ]; then | |
| file_checksum=$(shasum -a 512 "$jbr_location" | awk '{print $1}') | |
| fi | |
| if [ "$file_checksum" != "$expected_checksum" ]; then | |
| wget -q --tries=3 https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_jcef-21.0.11-osx-aarch64-b1163.116.tar.gz -O "$jbr_location" | |
| file_checksum=$(shasum -a 512 "$jbr_location" | awk '{print $1}') | |
| fi | |
| if [ "$file_checksum" != "$expected_checksum" ]; then | |
| echo "Checksum verification failed!" >&2 | |
| rm -f $checksum_file | |
| exit 1 | |
| fi | |
| rm -f $checksum_file | |
| file "$jbr_location" | |
| if: '${{ steps.step-5.outcome == ''failure'' }}' | |
| - id: 'step-7' | |
| name: 'Setup JBR 21 for macOS ' | |
| uses: 'gmitch215/setup-java@6d2c5e1f82f180ae79f799f0ed6e3e5efb4e664d' | |
| with: | |
| java-version: '21' | |
| distribution: 'jdkfile' | |
| jdkFile: '${{ steps.step-4.outputs.jbrLocation }}' | |
| env: | |
| GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' | |
| - id: 'step-8' | |
| name: 'Dump Local Properties' | |
| run: 'echo "jvm.toolchain.version=21" >> local.properties' | |
| - id: 'step-9' | |
| run: 'chmod -R 777 .' | |
| - id: 'step-10' | |
| name: 'Setup Gradle' | |
| uses: 'gradle/actions/setup-gradle@v3' | |
| with: | |
| cache-disabled: 'true' | |
| - id: 'step-11' | |
| name: 'Clean and download dependencies (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-12' | |
| name: 'Clean and download dependencies (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew --scan "--stacktrace" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-11.outcome == ''failure'' }}' | |
| - id: 'step-13' | |
| name: 'Update dev version name (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-14' | |
| name: 'Update dev version name (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew updateDevVersionNameFromGit "--no-configuration-cache" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-13.outcome == ''failure'' }}' | |
| - id: 'step-15' | |
| name: 'Prepare google-services.json' | |
| env: | |
| BASE64_CONTENT: '${{ secrets.GOOGLE_SERVICES_JSON }}' | |
| FILE_PATH: './app/android/google-services.json' | |
| continue-on-error: true | |
| shell: 'bash' | |
| run: |- | |
| set -euo pipefail | |
| if [ -z "${BASE64_CONTENT:-}" ]; then | |
| echo "BASE64_CONTENT is empty" >&2 | |
| exit 1 | |
| fi | |
| mkdir -p "$(dirname "$FILE_PATH")" | |
| if ! printf '%s' "$BASE64_CONTENT" | base64 --decode > "$FILE_PATH" 2>/dev/null; then | |
| printf '%s' "$BASE64_CONTENT" | base64 -D > "$FILE_PATH" | |
| fi | |
| chmod 600 "$FILE_PATH" | |
| echo "filePath=$FILE_PATH" >> "$GITHUB_OUTPUT" | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-16' | |
| name: 'Compile Kotlin (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-17' | |
| name: 'Compile Kotlin (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileKotlin compileCommonMainKotlinMetadata compileJvmMainKotlinMetadata compileKotlinDesktop compileKotlinMetadata "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-16.outcome == ''failure'' }}' | |
| - id: 'step-18' | |
| name: 'Compile Kotlin Android (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileDefaultDebugKotlin compileDefaultReleaseKotlin "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-19' | |
| name: 'Compile Kotlin Android (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileDefaultDebugKotlin compileDefaultReleaseKotlin "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-18.outcome == ''failure'' }}' | |
| - id: 'step-20' | |
| name: 'generateDummyFramework (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew :app:shared:application:generateDummyFramework "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-21' | |
| name: 'generateDummyFramework (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew :app:shared:application:generateDummyFramework "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-20.outcome == ''failure'' }}' | |
| - id: 'step-22' | |
| name: 'Pod Install (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew :app:ios:podInstall "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-23' | |
| name: 'Pod Install (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew :app:ios:podInstall "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-22.outcome == ''failure'' }}' | |
| - id: 'step-24' | |
| name: 'Patch ios Plist (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew :app:ios:patchInfoPlist "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-25' | |
| name: 'Patch ios Plist (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew :app:ios:patchInfoPlist "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-24.outcome == ''failure'' }}' | |
| - id: 'step-26' | |
| name: 'Build iOS Debug IPA (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew :app:ios:buildDebugIpa "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-27' | |
| name: 'Build iOS Debug IPA (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew :app:ios:buildDebugIpa "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-26.outcome == ''failure'' }}' | |
| - id: 'step-28' | |
| name: 'Upload iOS Debug IPA (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-ios-debug' | |
| path: 'app/ios/build/archives/debug/Animeko.ipa' | |
| overwrite: 'true' | |
| - id: 'step-29' | |
| name: 'Upload iOS Debug IPA (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-ios-debug' | |
| path: 'app/ios/build/archives/debug/Animeko.ipa' | |
| overwrite: 'true' | |
| if: '${{ steps.step-28.outcome == ''failure'' }}' | |
| - id: 'step-30' | |
| name: 'Upload iOS Debug IPA (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-ios-debug' | |
| path: 'app/ios/build/archives/debug/Animeko.ipa' | |
| overwrite: 'true' | |
| if: '${{ steps.step-29.outcome == ''failure'' }}' | |
| - id: 'step-31' | |
| name: 'Package Desktop (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew packageReleaseDistributionForCurrentOS "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-32' | |
| name: 'Package Desktop (Attempt #2)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew packageReleaseDistributionForCurrentOS "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-31.outcome == ''failure'' }}' | |
| - id: 'step-33' | |
| name: 'Upload compose logs' | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'compose-logs-self-hosted-macos-15' | |
| path: 'app/desktop/build/compose/logs' | |
| if: '${{ always() }}' | |
| - id: 'step-34' | |
| name: 'Upload macOS AArch64 dmg (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| path: 'app/desktop/build/compose/binaries/main-release/dmg/Ani-*.dmg' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| - id: 'step-35' | |
| name: 'Upload macOS AArch64 dmg (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| path: 'app/desktop/build/compose/binaries/main-release/dmg/Ani-*.dmg' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-34.outcome == ''failure'' }}' | |
| - id: 'step-36' | |
| name: 'Upload macOS AArch64 dmg (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/upload-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| path: 'app/desktop/build/compose/binaries/main-release/dmg/Ani-*.dmg' | |
| if-no-files-found: 'error' | |
| overwrite: 'true' | |
| if: '${{ steps.step-35.outcome == ''failure'' }}' | |
| - id: 'step-37' | |
| name: 'Check (Desktop) (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew desktopTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-38' | |
| name: 'Check (Desktop) (Attempt #2)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew desktopTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-37.outcome == ''failure'' }}' | |
| - id: 'step-39' | |
| name: 'Check (Desktop) (Attempt #3)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew desktopTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-38.outcome == ''failure'' }}' | |
| - id: 'step-40' | |
| name: 'Check (Android Host) (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew testAndroidHostTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-41' | |
| name: 'Check (Android Host) (Attempt #2)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew testAndroidHostTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-40.outcome == ''failure'' }}' | |
| - id: 'step-42' | |
| name: 'Check (Android Host) (Attempt #3)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew testAndroidHostTest "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-41.outcome == ''failure'' }}' | |
| - id: 'step-43' | |
| name: 'Build Android Instrumented Tests (Attempt #1)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileAndroidDeviceTest "-Pandroid.min.sdk=30" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| - id: 'step-44' | |
| name: 'Build Android Instrumented Tests (Attempt #2)' | |
| continue-on-error: true | |
| timeout-minutes: 180 | |
| run: './gradlew compileAndroidDeviceTest "-Pandroid.min.sdk=30" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-43.outcome == ''failure'' }}' | |
| - id: 'step-45' | |
| name: 'Build Android Instrumented Tests (Attempt #3)' | |
| continue-on-error: false | |
| timeout-minutes: 180 | |
| run: './gradlew compileAndroidDeviceTest "-Pandroid.min.sdk=30" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel"' | |
| if: '${{ steps.step-44.outcome == ''failure'' }}' | |
| - id: 'step-46' | |
| name: 'Android Instrumented Test (api=30, arch=arm64-v8a)' | |
| uses: 'reactivecircus/android-emulator-runner@v2.35.0' | |
| with: | |
| api-level: '30' | |
| arch: 'arm64-v8a' | |
| emulator-boot-timeout: '1800' | |
| script: './gradlew connectedDeviceTest "-Pandroid.min.sdk=30" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel" && killall -INT crashpad_handler || true' | |
| - id: 'step-47' | |
| name: 'Android Instrumented Test (api=36, arch=arm64-v8a)' | |
| uses: 'reactivecircus/android-emulator-runner@v2.35.0' | |
| with: | |
| api-level: '36' | |
| arch: 'arm64-v8a' | |
| emulator-boot-timeout: '1800' | |
| script: './gradlew connectedDeviceTest "-Pandroid.min.sdk=30" "--scan" "-Porg.gradle.daemon.idletimeout=60000" "-Dfile.encoding=UTF-8" "-Dorg.gradle.jvmargs=-Xmx12g -Dkotlin.daemon.jvm.options=-Xmx20g" "-Dkotlin.daemon.jvm.options=-Xmx20g" "--parallel" && killall -INT crashpad_handler || true' | |
| - id: 'step-48' | |
| name: 'Cleanup temp files' | |
| continue-on-error: true | |
| run: 'chmod +x ./ci-helper/cleanup-temp-files-macos.sh && ./ci-helper/cleanup-temp-files-macos.sh' | |
| verify_github-windows-2025: | |
| name: 'Verify (Windows Server 2025 x86_64 (GitHub))' | |
| runs-on: | |
| - 'windows-2025' | |
| permissions: | |
| actions: 'read' | |
| needs: | |
| - 'build_github-windows-2022' | |
| if: '${{ needs.build_github-windows-2022.result == ''success'' }}' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| - id: 'step-1' | |
| name: 'Delete libraries from system' | |
| continue-on-error: true | |
| shell: 'powershell' | |
| run: |- | |
| Remove-Item -Path "C:\vcpkg\installed\x64-windows\lib\libssl*" -Recurse -Force -Verbose | |
| Remove-Item -Path "C:\vcpkg\installed\x64-windows\lib\libcrypto*" -Recurse -Force -Verbose | |
| - id: 'step-2' | |
| name: 'Download Windows x64 Portable (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-windows-portable' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| - id: 'step-3' | |
| name: 'Download Windows x64 Portable (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-windows-portable' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| if: '${{ steps.step-2.outcome == ''failure'' }}' | |
| - id: 'step-4' | |
| name: 'Download Windows x64 Portable (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-windows-portable' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| if: '${{ steps.step-3.outcome == ''failure'' }}' | |
| - id: 'step-5' | |
| name: 'Check that Anitorrent can be loaded' | |
| timeout-minutes: 5 | |
| shell: 'powershell' | |
| run: 'powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${{ github.workspace }}/ci-helper/verify/run-ani-test-windows-x64.ps1" "${{ github.workspace }}\ci-helper\verify" "anitorrent-load-test"' | |
| - id: 'step-6' | |
| name: 'Check that Dandanplay APP ID is valid' | |
| timeout-minutes: 5 | |
| shell: 'powershell' | |
| run: 'powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${{ github.workspace }}/ci-helper/verify/run-ani-test-windows-x64.ps1" "${{ github.workspace }}\ci-helper\verify" "dandanplay-app-id"' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-7' | |
| name: 'Check that sentryDsn is valid' | |
| timeout-minutes: 5 | |
| shell: 'powershell' | |
| run: 'powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${{ github.workspace }}/ci-helper/verify/run-ani-test-windows-x64.ps1" "${{ github.workspace }}\ci-helper\verify" "sentry-dsn"' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| verify_github-windows-2022: | |
| name: 'Verify (Windows Server 2022 x86_64 (GitHub))' | |
| runs-on: | |
| - 'windows-2022' | |
| permissions: | |
| actions: 'read' | |
| needs: | |
| - 'build_github-windows-2022' | |
| if: '${{ needs.build_github-windows-2022.result == ''success'' }}' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| - id: 'step-1' | |
| name: 'Delete libraries from system' | |
| continue-on-error: true | |
| shell: 'powershell' | |
| run: |- | |
| Remove-Item -Path "C:\vcpkg\installed\x64-windows\lib\libssl*" -Recurse -Force -Verbose | |
| Remove-Item -Path "C:\vcpkg\installed\x64-windows\lib\libcrypto*" -Recurse -Force -Verbose | |
| - id: 'step-2' | |
| name: 'Download Windows x64 Portable (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-windows-portable' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| - id: 'step-3' | |
| name: 'Download Windows x64 Portable (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-windows-portable' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| if: '${{ steps.step-2.outcome == ''failure'' }}' | |
| - id: 'step-4' | |
| name: 'Download Windows x64 Portable (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-windows-portable' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| if: '${{ steps.step-3.outcome == ''failure'' }}' | |
| - id: 'step-5' | |
| name: 'Check that Anitorrent can be loaded' | |
| timeout-minutes: 5 | |
| shell: 'powershell' | |
| run: 'powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${{ github.workspace }}/ci-helper/verify/run-ani-test-windows-x64.ps1" "${{ github.workspace }}\ci-helper\verify" "anitorrent-load-test"' | |
| - id: 'step-6' | |
| name: 'Check that Dandanplay APP ID is valid' | |
| timeout-minutes: 5 | |
| shell: 'powershell' | |
| run: 'powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${{ github.workspace }}/ci-helper/verify/run-ani-test-windows-x64.ps1" "${{ github.workspace }}\ci-helper\verify" "dandanplay-app-id"' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-7' | |
| name: 'Check that sentryDsn is valid' | |
| timeout-minutes: 5 | |
| shell: 'powershell' | |
| run: 'powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${{ github.workspace }}/ci-helper/verify/run-ani-test-windows-x64.ps1" "${{ github.workspace }}\ci-helper\verify" "sentry-dsn"' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| verify_github-windows-11-arm64: | |
| name: 'Verify (Windows 11 AArch64 (GitHub))' | |
| runs-on: | |
| - 'windows-11-arm' | |
| permissions: | |
| actions: 'read' | |
| needs: | |
| - 'build_github-windows-11-arm64' | |
| if: '${{ needs.build_github-windows-11-arm64.result == ''success'' }}' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| - id: 'step-1' | |
| name: 'Download Windows AArch64 Portable (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-windows-aarch64-portable' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| - id: 'step-2' | |
| name: 'Download Windows AArch64 Portable (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-windows-aarch64-portable' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| if: '${{ steps.step-1.outcome == ''failure'' }}' | |
| - id: 'step-3' | |
| name: 'Download Windows AArch64 Portable (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-windows-aarch64-portable' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| if: '${{ steps.step-2.outcome == ''failure'' }}' | |
| - id: 'step-4' | |
| name: 'Check that MediaMP FFmpeg can run' | |
| timeout-minutes: 5 | |
| shell: 'powershell' | |
| run: 'powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${{ github.workspace }}/ci-helper/verify/run-ani-test-windows-x64.ps1" "${{ github.workspace }}\ci-helper\verify" "mediamp-ffmpeg-smoke-test"' | |
| - id: 'step-5' | |
| name: 'Check that bundled SQLite can be loaded' | |
| timeout-minutes: 5 | |
| shell: 'powershell' | |
| run: 'powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${{ github.workspace }}/ci-helper/verify/run-ani-test-windows-x64.ps1" "${{ github.workspace }}\ci-helper\verify" "sqlite-bundled-load-test"' | |
| verify_self-hosted-macos-15: | |
| name: 'Verify (macOS 15 AArch64 (Self-Hosted))' | |
| runs-on: | |
| - 'self-hosted' | |
| - 'macOS' | |
| - 'ARM64' | |
| permissions: | |
| actions: 'read' | |
| needs: | |
| - 'build_self-hosted-macos-15' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (needs.build_self-hosted-macos-15.result == ''success'') }}' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| - id: 'step-1' | |
| name: 'Download DMG (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| - id: 'step-2' | |
| name: 'Download DMG (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| if: '${{ steps.step-1.outcome == ''failure'' }}' | |
| - id: 'step-3' | |
| name: 'Download DMG (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| if: '${{ steps.step-2.outcome == ''failure'' }}' | |
| - id: 'step-4' | |
| name: 'Check that Anitorrent can be loaded' | |
| timeout-minutes: 5 | |
| run: '"$GITHUB_WORKSPACE/ci-helper/verify/run-ani-test-macos-aarch64.sh" "$GITHUB_WORKSPACE"/*.dmg anitorrent-load-test' | |
| - id: 'step-5' | |
| name: 'Check that Dandanplay APP ID is valid' | |
| timeout-minutes: 5 | |
| run: '"$GITHUB_WORKSPACE/ci-helper/verify/run-ani-test-macos-aarch64.sh" "$GITHUB_WORKSPACE"/*.dmg dandanplay-app-id' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-6' | |
| name: 'Check that sentryDsn is valid' | |
| timeout-minutes: 5 | |
| run: '"$GITHUB_WORKSPACE/ci-helper/verify/run-ani-test-macos-aarch64.sh" "$GITHUB_WORKSPACE"/*.dmg sentry-dsn' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| verify_github-macos-14: | |
| name: 'Verify (macOS 14 AArch64 (GitHub))' | |
| runs-on: | |
| - 'macos-14' | |
| permissions: | |
| actions: 'read' | |
| needs: | |
| - 'build_self-hosted-macos-15' | |
| if: '${{ needs.build_self-hosted-macos-15.result == ''success'' }}' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| - id: 'step-1' | |
| name: 'Delete libraries from system' | |
| continue-on-error: true | |
| run: |- | |
| sudo rm -rfv /usr/local/lib/libssl* || true | |
| sudo rm -rfv /usr/local/lib/libcrypto* || true | |
| sudo rm -rfv /opt/homebrew/lib/libssl* || true | |
| sudo rm -rfv /opt/homebrew/lib/libcrypto* || true | |
| - id: 'step-2' | |
| name: 'Download DMG (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| - id: 'step-3' | |
| name: 'Download DMG (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| if: '${{ steps.step-2.outcome == ''failure'' }}' | |
| - id: 'step-4' | |
| name: 'Download DMG (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| if: '${{ steps.step-3.outcome == ''failure'' }}' | |
| - id: 'step-5' | |
| name: 'Check that Anitorrent can be loaded' | |
| timeout-minutes: 5 | |
| run: '"$GITHUB_WORKSPACE/ci-helper/verify/run-ani-test-macos-aarch64.sh" "$GITHUB_WORKSPACE"/*.dmg anitorrent-load-test' | |
| - id: 'step-6' | |
| name: 'Check that Dandanplay APP ID is valid' | |
| timeout-minutes: 5 | |
| run: '"$GITHUB_WORKSPACE/ci-helper/verify/run-ani-test-macos-aarch64.sh" "$GITHUB_WORKSPACE"/*.dmg dandanplay-app-id' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-7' | |
| name: 'Check that sentryDsn is valid' | |
| timeout-minutes: 5 | |
| run: '"$GITHUB_WORKSPACE/ci-helper/verify/run-ani-test-macos-aarch64.sh" "$GITHUB_WORKSPACE"/*.dmg sentry-dsn' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| verify_github-macos-15-apple: | |
| name: 'Verify (macOS 15 AArch64 (GitHub))' | |
| runs-on: | |
| - 'macos-15' | |
| permissions: | |
| actions: 'read' | |
| needs: | |
| - 'build_self-hosted-macos-15' | |
| if: '${{ needs.build_self-hosted-macos-15.result == ''success'' }}' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| - id: 'step-1' | |
| name: 'Delete libraries from system' | |
| continue-on-error: true | |
| run: |- | |
| sudo rm -rfv /usr/local/lib/libssl* || true | |
| sudo rm -rfv /usr/local/lib/libcrypto* || true | |
| sudo rm -rfv /opt/homebrew/lib/libssl* || true | |
| sudo rm -rfv /opt/homebrew/lib/libcrypto* || true | |
| - id: 'step-2' | |
| name: 'Download DMG (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| - id: 'step-3' | |
| name: 'Download DMG (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| if: '${{ steps.step-2.outcome == ''failure'' }}' | |
| - id: 'step-4' | |
| name: 'Download DMG (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-macos-dmg-aarch64' | |
| if: '${{ steps.step-3.outcome == ''failure'' }}' | |
| - id: 'step-5' | |
| name: 'Check that Anitorrent can be loaded' | |
| timeout-minutes: 5 | |
| run: '"$GITHUB_WORKSPACE/ci-helper/verify/run-ani-test-macos-aarch64.sh" "$GITHUB_WORKSPACE"/*.dmg anitorrent-load-test' | |
| - id: 'step-6' | |
| name: 'Check that Dandanplay APP ID is valid' | |
| timeout-minutes: 5 | |
| run: '"$GITHUB_WORKSPACE/ci-helper/verify/run-ani-test-macos-aarch64.sh" "$GITHUB_WORKSPACE"/*.dmg dandanplay-app-id' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-7' | |
| name: 'Check that sentryDsn is valid' | |
| timeout-minutes: 5 | |
| run: '"$GITHUB_WORKSPACE/ci-helper/verify/run-ani-test-macos-aarch64.sh" "$GITHUB_WORKSPACE"/*.dmg sentry-dsn' | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| verify_github-ubuntu-2404: | |
| name: 'Verify (Ubuntu 24.04 x86_64 (GitHub))' | |
| runs-on: | |
| - 'ubuntu-24.04' | |
| permissions: | |
| actions: 'read' | |
| needs: | |
| - 'build_github-ubuntu-2404' | |
| if: '${{ needs.build_github-ubuntu-2404.result == ''success'' }}' | |
| steps: | |
| - id: 'step-0' | |
| uses: 'actions/checkout@v4' | |
| - id: 'step-1' | |
| name: 'Download Linux x64 AppImage (Attempt #1)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-linux-appimage-x64' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| - id: 'step-2' | |
| name: 'Download Linux x64 AppImage (Attempt #2)' | |
| continue-on-error: true | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-linux-appimage-x64' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| if: '${{ steps.step-1.outcome == ''failure'' }}' | |
| - id: 'step-3' | |
| name: 'Download Linux x64 AppImage (Attempt #3)' | |
| continue-on-error: false | |
| uses: 'actions/download-artifact@v4' | |
| with: | |
| name: 'ani-linux-appimage-x64' | |
| path: '${{ github.workspace }}/ci-helper/verify' | |
| if: '${{ steps.step-2.outcome == ''failure'' }}' | |
| - id: 'step-4' | |
| name: 'Check that Dandanplay APP ID is valid' | |
| timeout-minutes: 5 | |
| shell: 'bash' | |
| run: |- | |
| ANI_APPIMAGE="${{ github.workspace }}/ci-helper/verify/Animeko-x86_64.AppImage" | |
| chmod +x "$ANI_APPIMAGE" | |
| ANIMEKO_DESKTOP_TEST_TASK="dandanplay-app-id" "$ANI_APPIMAGE" | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-5' | |
| name: 'Check that sentryDsn is valid' | |
| timeout-minutes: 5 | |
| shell: 'bash' | |
| run: |- | |
| ANI_APPIMAGE="${{ github.workspace }}/ci-helper/verify/Animeko-x86_64.AppImage" | |
| chmod +x "$ANI_APPIMAGE" | |
| ANIMEKO_DESKTOP_TEST_TASK="sentry-dsn" "$ANI_APPIMAGE" | |
| if: '${{ (github.repository == ''open-ani/animeko'') && (!(github.event_name == ''pull_request'')) }}' | |
| - id: 'step-6' | |
| name: 'Check that bundled SQLite can be loaded' | |
| timeout-minutes: 5 | |
| shell: 'bash' | |
| run: |- | |
| ANI_APPIMAGE="${{ github.workspace }}/ci-helper/verify/Animeko-x86_64.AppImage" | |
| chmod +x "$ANI_APPIMAGE" | |
| ANIMEKO_DESKTOP_TEST_TASK="sqlite-bundled-load-test" "$ANI_APPIMAGE" | |
| - id: 'step-7' | |
| name: 'Check that JCEF can be initialized' | |
| timeout-minutes: 5 | |
| shell: 'bash' | |
| run: |- | |
| ANI_APPIMAGE="${{ github.workspace }}/ci-helper/verify/Animeko-x86_64.AppImage" | |
| chmod +x "$ANI_APPIMAGE" | |
| XDG_SESSION_TYPE=wayland WAYLAND_DISPLAY=wayland-0 xvfb-run --auto-servernum env ANIMEKO_DESKTOP_TEST_TASK="jcef-init-test" "$ANI_APPIMAGE" |