name: ci on: push: tags: - "v*" branches-ignore: - "master" paths: - "3rdparty/include/**" - "include/**" - "src/**" - "cmake/**" - "CMakeLists.txt" - "MAA.sln" - ".github/workflows/ci.yml" - "!**/*.md" pull_request: branches: - "dev" paths: - "3rdparty/include/**" - "include/**" - "src/**" - "cmake/**" - "CMakeLists.txt" - "MAA.sln" - "!**/*.md" workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: meta: # Prevent duplicate runs on organization branches with PRs if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name runs-on: ubuntu-latest outputs: tag: ${{ steps.set_tag.outputs.tag }} prerelease: ${{ steps.set_pre.outputs.prerelease }} steps: - name: Checkout code uses: actions/checkout@v5 with: path: temp show-progress: false - name: Fetch history if: ${{ !startsWith(github.ref, 'refs/pull/') }} run: | git init cp $GITHUB_WORKSPACE/temp/.git/config ./.git rm -rf $GITHUB_WORKSPACE/temp # git config remote.origin.fetch '+refs/*:refs/*' git fetch --filter=tree:0 # --update-head-ok git reset --hard origin/$(git branch --show-current) || true git checkout ${{ github.ref_name }} - name: Set tag id: set_tag run: | ${{ startsWith(github.ref, 'refs/pull/') && 'cd temp' || '' }} echo tag=$(git describe --tags --match "v*" ${{ github.ref }} || git rev-parse --short HEAD) | tee -a $GITHUB_OUTPUT exit ${PIPESTATUS[0]} - name: Judge pre-release id: set_pre if: ${{ startsWith(github.ref, 'refs/tags/v') }} run: | if [[ '${{ steps.set_tag.outputs.tag }}' =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo prerelease=false | tee -a $GITHUB_OUTPUT else echo prerelease=true | tee -a $GITHUB_OUTPUT fi - name: Generate changelog if: ${{ startsWith(github.ref, 'refs/tags/v') }} run: | this_tag=${{ steps.set_tag.outputs.tag }} if [[ '${{ steps.set_pre.outputs.prerelease }}' != 'false' ]]; then last_tag=$(git describe --tags --match "v*" --abbrev=0 --exclude='${{ steps.set_tag.outputs.tag }}') else last_tag=$(git describe --tags --match "v*" --abbrev=0 --exclude='${{ steps.set_tag.outputs.tag }}' --exclude='*-*') fi echo >> CHANGELOG.md echo "**Full Changelog**: [$last_tag -> $this_tag](https://github.com/MaaAssistantArknights/MaaAssistantArknights/compare/${last_tag}...${this_tag})" >> CHANGELOG.md echo >> CHANGELOG.md echo "[已有 Mirror酱 CDK?前往 Mirror酱 高速下载](https://mirrorchyan.com/zh/projects?rid=MAA&source=maagh-release)" >> CHANGELOG.md - name: Upload changelog to Github uses: actions/upload-artifact@v4 if: ${{ startsWith(github.ref, 'refs/tags/v') }} with: name: changelog path: CHANGELOG.md windows: # Prevent duplicate runs on organization branches with PRs if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name needs: meta strategy: matrix: include: - msbuild_target: x64 lowercase_target: x64 - msbuild_target: ARM64 lowercase_target: arm64 env: MAABUILDER_TARGET_PLATFORM: ${{ matrix.msbuild_target }} runs-on: windows-latest steps: - name: Checkout code uses: actions/checkout@v5 with: show-progress: false - name: Fetch submodules run: | git submodule update --init --depth 1 3rdparty/EmulatorExtras - name: Cache .nuke/temp, ~/.nuget/packages id: cache-nuget uses: actions/cache@v4 with: path: | .nuke/temp ~/.nuget/packages key: ${{ runner.os }}-${{ matrix.msbuild_target }}-${{ hashFiles('**/global.json', '**/*.csproj') }} - name: Restore dependencies if: steps.cache-nuget.outputs.cache-hit != 'true' run: dotnet restore - name: Cache MaaDeps id: cache-maadeps uses: actions/cache@v4 with: path: | ./MaaDeps key: ${{ runner.os }}-${{ matrix.lowercase_target }}-maadeps-${{ hashFiles('./maadeps-download.py') }} - name: Bootstrap MaaDeps if: steps.cache-maadeps.outputs.cache-hit != 'true' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | python3 maadeps-download.py ${{ matrix.lowercase_target }}-windows - name: Create fake event file shell: bash run: cp -v "$GITHUB_EVENT_PATH" ./event.json - name: Merge Event Data with Inputs if: startsWith(github.ref, 'refs/tags/v') shell: bash run: | cat "$GITHUB_EVENT_PATH" | jq '. + { "inputs": {"ReleaseSimulation": "${{ needs.meta.outputs.tag }}"} }' | tee ./event.json - name: Taggify Version run: | $csprojPath = "src/MaaWpfGui/MaaWpfGui.csproj" $csprojPath = Resolve-Path -Path $csprojPath $tag = '${{ needs.meta.outputs.tag }}' -replace '.*?/', '' if ($tag -match '\d+(\.\d+){1,3}') { $match = $Matches[0] } else { $match = "0.0.1" } [xml]$csproj = Get-Content -Path $csprojPath $node = $csproj.Project.PropertyGroup | where {$_.ApplicationVersion -ne $null} $node.InformationalVersion = $tag $node.Version = $match $node.FileVersion = $match $node.AssemblyVersion = $match $csproj.Save($csprojPath) env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Build run: | $env:GITHUB_WORKFLOW = 'dev-build-win' # pretend this is a dev-build-win workflow $env:GITHUB_EVENT_PATH = "$pwd\\event.json" $env:GITHUB_REF = "refs/heads/not_master" $env:MAA_BUILDER_MAA_VERSION = '${{ needs.meta.outputs.tag }}' ./build.cmd DevBuild env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Cleanup checksum file run: | rm -vf ./artifacts/checksum.json shell: bash - name: Upload MAA to Github uses: actions/upload-artifact@v4 with: name: MAA-win-${{ matrix.lowercase_target }} path: artifacts ubuntu: # Prevent duplicate runs on organization branches with PRs if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name needs: meta runs-on: ubuntu-22.04 strategy: matrix: arch: [aarch64, x86_64] permissions: actions: write steps: - name: Checkout code uses: actions/checkout@v5 with: show-progress: false - name: Fetch submodules run: | git submodule update --init --depth 1 3rdparty/EmulatorExtras git submodule update --init --depth 1 src/maa-cli - name: Install cross compile toolchains if: ${{ matrix.arch != 'x86_64' }} run: | sudo apt-get update sudo apt-get install g++-12-aarch64-linux-gnu g++-12-aarch64-linux-gnu # Caching not necessary on ubuntu runner - name: Bootstrap MaaDeps env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | python3 maadeps-download.py ${{ matrix.arch == 'x86_64' && 'x64' || 'arm64' }}-linux - name: Build MAA run: | mkdir -p build cmake -B build \ -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ -DMAADEPS_TRIPLET='maa-${{ matrix.arch == 'x86_64' && 'x64' || 'arm64' }}-linux' \ -DINSTALL_THIRD_LIBS=ON \ -DINSTALL_RESOURCE=ON \ -DINSTALL_PYTHON=ON \ -DMAA_VERSION='${{ needs.meta.outputs.tag }}' cmake --build build --parallel $(nproc --all) mkdir -p install cmake --install build --prefix install env: CC: ${{ matrix.arch == 'x86_64' && 'gcc-12' || 'aarch64-linux-gnu-gcc-12' }} CXX: ${{ matrix.arch == 'x86_64' && 'g++-12' || 'aarch64-linux-gnu-g++-12' }} CMAKE_COLOR_DIAGNOSTICS: ON CLICOLOR_FORCE: 1 CXXFLAGS: | # workaround for gcc bugs -Wno-error=restrict -Wno-error=array-bounds -Wno-error=stringop-overread -Wno-error=missing-field-initializers - name: Setup Cross Compile Toolchains for CLI uses: ./src/maa-cli/.github/actions/setup with: os: ubuntu-latest target_arch: ${{ matrix.arch }} - name: Build CLI run: | cargo build --release --locked --package maa-cli --features vendored-openssl cp -v target/$CARGO_BUILD_TARGET/release/maa $GITHUB_WORKSPACE/install/maa cargo build --release --locked --package maa-cli --no-default-features \ --features git2,vendored-openssl cp -v target/$CARGO_BUILD_TARGET/release/maa $GITHUB_WORKSPACE/appimage-maa working-directory: src/maa-cli - name: Build Appimage run: | sudo add-apt-repository universe sudo apt update sudo apt install libfuse2 mkdir -pv release mkdir -pv Maa.AppDir/usr/share/maa cp -r install/* Maa.AppDir/usr/share/maa/ wget -c https://raw.githubusercontent.com/MaaAssistantArknights/design/main/logo/maa-logo_512x512.png -O Maa.AppDir/maa.png mkdir -pv Maa.AppDir/usr/share/icons/hicolor/512x512/apps/ cp -v Maa.AppDir/maa.png Maa.AppDir/usr/share/icons/hicolor/512x512/apps/ cp -v appimage-maa Maa.AppDir/usr/share/maa/maa chmod a+x Maa.AppDir/usr/share/maa/maa cat > Maa.AppDir/maa.desktop < "AuthKey_${APPSTORE_KEYID}.p8" dmg="MAA-${{ needs.meta.outputs.tag }}-macos-universal.dmg" xcrun notarytool submit -k "AuthKey_${APPSTORE_KEYID}.p8" -d "$APPSTORE_KEYID" -i "$ISSUER_ID" --wait ${dmg} env: APPSTORE_KEYID: ${{ secrets.HGUANDL_APPSTORE_KEYID }} APPSTORE_KEY: ${{ secrets.HGUANDL_APPSTORE_KEY }} ISSUER_ID: ${{ secrets.HGUANDL_APPSTORE_ISSUER }} - name: Attach Notarization Tickets if: startsWith(github.ref, 'refs/tags/v') run: | dmg="MAA-${{ needs.meta.outputs.tag }}-macos-universal.dmg" xcrun stapler staple ${dmg} working-directory: release - name: Upload MAA to Github uses: actions/upload-artifact@v4 with: name: MAA-macos-universal path: ${{ startsWith(github.ref, 'refs/tags/v') && 'release/MAA*' || 'src/MaaMacGui/MAA.xcarchive/**' }} release: # Prevent duplicate runs on organization branches with PRs if: (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) && startsWith(github.ref, 'refs/tags/v') needs: [meta, windows, ubuntu, macOS-Core, macOS-GUI] runs-on: ubuntu-latest steps: - name: Download MAA from Github uses: actions/download-artifact@v5 with: path: assets - name: Cleanup files run: | mv -vf assets/changelog/* . rm -rf assets/MAACore-macos-* cd assets # find . -type f | xargs mv -fvt . find . -type f | while read f; do mv -fvt . $f; done - name: Release to Github uses: softprops/action-gh-release@v2.3.2 with: body_path: CHANGELOG.md files: | assets/* prerelease: ${{ needs.meta.outputs.prerelease != 'false' }} - name: Trigger MirrorChyan run: | gh workflow run --repo $GITHUB_REPOSITORY mirrorchyan gh workflow run --repo $GITHUB_REPOSITORY mirrorchyan_release_note env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Trigger secondary workflows # ref: https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow run: | gh workflow run --repo $GITHUB_REPOSITORY release-ota env: GH_TOKEN: ${{ secrets.MISTEOWORKFLOW }}