release-nightly-ota #95
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: release-nightly-ota | |
on: | |
schedule: | |
- cron: "0 22 * * *" # Runs daily at 22:00 UTC | |
workflow_dispatch: | |
inputs: | |
release_body: | |
description: "Release note" | |
type: string | |
required: false | |
ref: | |
description: "Commit to build (git checkout)" | |
type: string | |
required: false | |
limit_maa: | |
description: "Number of releases to fetch from MaaAssistantArknights" | |
required: true | |
default: "10" | |
type: number | |
limit_mr: | |
description: "Number of releases to fetch from MaaRelease" | |
required: true | |
default: "10" | |
type: number | |
jobs: | |
build-win-nightly: | |
if: github.repository_owner == 'MaaAssistantArknights' | |
runs-on: windows-latest | |
strategy: | |
matrix: | |
msbuild_target: [x64] | |
fail-fast: false | |
env: | |
MAABUILDER_TARGET_PLATFORM: ${{ matrix.msbuild_target }} | |
outputs: | |
tag: ${{ steps.set_tag.outputs.tag }} | |
pre_version: ${{ steps.set_tag.outputs.pre_version }} | |
main_tag_name: ${{ steps.push_main_tag.outputs.main_tag_name }} | |
changelog: ${{ steps.read_changelog.outputs.content }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
# repository: 'MaaAssistantArknights/MaaAssistantArknights' | |
#ref: ${{ inputs.ref }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
fetch-depth: 250 | |
fetch-tags: true | |
- name: Fetch submodules | |
run: | | |
git submodule update --init --depth 1 3rdparty/EmulatorExtras | |
- name: Checkout ref (if provided) | |
if: inputs.ref != '' | |
run: | | |
git checkout --progress --recurse-submodules ${{ inputs.ref }} | |
- name: Check for Changes and Set tag | |
id: set_tag | |
run: | | |
# Fetch the latest tag from the repository | |
$latest_tag = git describe --tags --abbrev=0 | |
# Check for changes between the latest tag and HEAD | |
$recent_changes = git log "$latest_tag..HEAD" --oneline | |
if (-not $recent_changes) { | |
Write-Output "No commits. Cancelling workflow..." | |
Write-Output "cancel_run=true" >> $env:GITHUB_ENV | |
exit 0 | |
} else { | |
Write-Output "Recent commits: $recent_changes" | |
Write-Output "Commits found. Continuing build..." | |
Write-Output "cancel_run=false" >> $env:GITHUB_ENV | |
} | |
Write-Output "Previous Tag: $latest_tag" | |
Write-Output "latest_tag=$latest_tag" >> $env:GITHUB_OUTPUT | |
# Get the full description of the current commit | |
$described = git describe --tags --long --match 'v*' | |
Write-Output "New Described: $described" | |
$ids = $described -split "-" | |
if ($ids.Length -eq 3) { | |
# Extract and parse the current version | |
$current_version = $ids[0].Substring(1) | |
$parts = $current_version -split '\.' | |
if ($parts.Length -ne 3) { | |
Write-Error "Invalid version format: $current_version. Expected 'major.minor.patch'." | |
exit 1 | |
} | |
# Increment the patch version | |
$parts[2] = [int]$parts[2] + 1 | |
$new_version = "$($parts[0]).$($parts[1]).$($parts[2])" | |
# Construct the new tag and pre_version | |
$ver = "v$new_version" | |
$pre_version = $ids[0] | |
$dist = "{0:D3}" -f [int]$ids[1] | |
Write-Output "pre_version=$pre_version" >> $env:GITHUB_OUTPUT | |
Write-Output "New Tag: $ver-alpha.1.d$dist.$($ids[2])" | |
Write-Output "tag=$ver-alpha.1.d$dist.$($ids[2])" >> $env:GITHUB_OUTPUT | |
exit 0 | |
} | |
if ($ids.Length -eq 4) { | |
$dist = "{0:D3}" -f [int]$ids[2] | |
$pre_version = "$($ids[0])-$($ids[1])" | |
Write-Output "Pre Version: $pre_version" | |
Write-Output "pre_version=$pre_version" >> $env:GITHUB_OUTPUT | |
Write-Output "tag: $pre_version.d$dist.$($ids[3])" | |
Write-Output "tag=$pre_version.d$dist.$($ids[3])" >> $env:GITHUB_OUTPUT | |
exit 0 | |
} | |
exit 1 | |
- name: Stop if no changes | |
if: env.cancel_run == 'true' | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
curl -s -L -X POST ` | |
-H "Accept: application/vnd.github+json" ` | |
-H "Authorization: Bearer ${{ secrets.MAA_ACTION_READ_WRITE }}" ` | |
-H "X-GitHub-Api-Version: 2022-11-28" ` | |
"https://api.github.com/repos/MaaAssistantArknights/MaaAssistantArknights/actions/runs/${{ github.run_id }}/cancel" > $null | |
gh run watch ${{ github.run_id }} | |
- name: Generate Changelog | |
id: generate_changelog | |
run: | | |
python3 tools/ChangelogGenerator/changelog_generator.py --latest "${{ steps.set_tag.outputs.latest_tag }}" --tag "${{ steps.set_tag.outputs.tag }}" | |
Get-Content .\changelog.md | Select-Object -Skip 2 | Out-File -FilePath changelog_notag.md -Encoding utf8 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
PYTHONIOENCODING: "utf-8" | |
- name: Stop if no changes | |
if: steps.generate_changelog.outputs.cancel_run == 'true' | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
curl -s -L -X POST ` | |
-H "Accept: application/vnd.github+json" ` | |
-H "Authorization: Bearer ${{ secrets.MAA_ACTION_READ_WRITE }}" ` | |
-H "X-GitHub-Api-Version: 2022-11-28" ` | |
"https://api.github.com/repos/MaaAssistantArknights/MaaAssistantArknights/actions/runs/${{ github.run_id }}/cancel" > $null | |
gh run watch ${{ github.run_id }} | |
- name: Read Changelog to variable | |
id: read_changelog | |
uses: juliangruber/read-file-action@v1 | |
with: | |
path: ./changelog_notag.md | |
- 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.msbuild_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.msbuild_target }}-windows | |
- name: Taggify Version | |
run: | | |
$csprojPath = "src/MaaWpfGui/MaaWpfGui.csproj" | |
$csprojPath = Resolve-Path -Path $csprojPath | |
$tag = '${{ steps.set_tag.outputs.tag }}' -replace '.*?/', '' | |
if ($tag -match '\d+(\.\d+){1,3}') { | |
$match = $Matches[0] | |
} else { | |
$match = "0.0.1" | |
} | |
echo "Tag value: $tag" | |
echo "Version value: $match" | |
[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: Run './build.cmd DevBuild' | |
run: | | |
$env:GITHUB_WORKFLOW = 'dev-build-win' # pretend this is a dev-build-win workflow | |
$env:MAA_BUILDER_MAA_VERSION = "${{ steps.set_tag.outputs.tag }}" | |
echo "tag: " $env:MAA_BUILDER_MAA_VERSION | |
./build.cmd DevBuild | |
env: | |
Reason: "Build nightly version" | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Upload MAA to Github | |
uses: actions/upload-artifact@v4 | |
with: | |
name: MAA-win-${{ matrix.msbuild_target }} | |
path: artifacts | |
- name: Push tag to main repo | |
id: push_main_tag | |
run: | | |
git config user.name 'github-actions[bot]' | |
git config user.email 'github-actions[bot]@users.noreply.github.com' | |
$main_tag_name=$(echo "alpha/${{ steps.set_tag.outputs.tag }}") | |
git tag $main_tag_name -f | |
git push --tags origin HEAD:refs/tags/$main_tag_name -f | |
echo "main_tag_name=$main_tag_name" >> $env:GITHUB_OUTPUT | |
push-tag: | |
if: github.repository_owner == 'MaaAssistantArknights' | |
needs: build-win-nightly | |
runs-on: ubuntu-latest | |
steps: | |
- name: Fetch MaaRelease | |
uses: actions/checkout@v4 | |
with: | |
repository: ${{ format('{0}/{1}', github.repository_owner, 'MaaRelease') }} | |
fetch-depth: 0 | |
token: ${{ secrets.MAARELEASE_RELEASE }} | |
show-progress: false | |
- name: Commit and setup tag | |
run: | | |
git config user.name 'github-actions[bot]' | |
git config user.email 'github-actions[bot]@users.noreply.github.com' | |
git checkout --orphan __temp | |
git rm -rf . | |
git commit --allow-empty --message ${{ needs.build-win-nightly.outputs.tag }} | |
git tag ${{ needs.build-win-nightly.outputs.tag }} || exit 0 # do nothing if the tag already exists | |
git push --tags origin HEAD:refs/tags/${{ needs.build-win-nightly.outputs.tag }} | |
make-ota: | |
if: github.repository_owner == 'MaaAssistantArknights' | |
needs: [build-win-nightly, push-tag] | |
strategy: | |
matrix: | |
target: [x64] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Echo tag version | |
run: | | |
echo ${{ needs.build-win-nightly.outputs.tag }} | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
path: MaaAssistantArknights | |
token: ${{ secrets.MAARELEASE_RELEASE }} | |
show-progress: false | |
- name: Download MAA from Github | |
uses: actions/download-artifact@v4 | |
with: | |
name: MAA-win-${{ matrix.target }} | |
path: ${{ format('{0}/{1}', 'build-ota', needs.build-win-nightly.outputs.tag) }} | |
- name: Fetch release info | |
run: | | |
mkdir -pv build-ota && cd build-ota | |
# Convert inputs to integers | |
limit_maa=${{ inputs.limit_maa || 10 }} | |
limit_maa=${limit_maa%.*} | |
echo "Parsed limit_maa: $limit_maa" | |
limit_mr=${{ inputs.limit_mr || 10 }} | |
limit_mr=${limit_mr%.*} | |
echo "Parsed limit_mr: $limit_mr" | |
gh release list --repo 'MaaAssistantArknights/MaaAssistantArknights' --limit $limit_maa | tee ./release_maa.txt | |
gh release list --repo "${{ github.repository_owner }}/MaaRelease" --limit $limit_mr | tee ./release_mr.txt | |
echo ${{ needs.build-win-nightly.outputs.tag }} > ./config | |
cat ./release_maa.txt | awk '{ print $1 }' > ./tags_maa.txt | |
cat ./release_mr.txt | awk '{ print $1 }' > ./tags_mr.txt | |
comm <(sort ./tags_maa.txt) <(sort ./tags_mr.txt) | awk '{ print $1 }' >> ./config | |
echo "config:" | |
cat ./config | |
echo "release_tag=$(head -n 1 ./config)" >> $GITHUB_ENV | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Build OTA | |
run: | | |
cd build-ota | |
pushd ${{ needs.build-win-nightly.outputs.tag }} | |
zip -d *.zip '*.lib' '*.pdb' '*.exp' '*.config' '*.xml' | |
mv *.zip MAA-${{ env.release_tag }}-win-${{ matrix.target }}.zip | |
popd | |
$GITHUB_WORKSPACE/MaaAssistantArknights/tools/OTAPacker/build.sh 'MaaAssistantArknights/MaaAssistantArknights' ./config ${{ matrix.target }} "${{ github.repository_owner }}/MaaRelease" | |
mv -v ${{ needs.build-win-nightly.outputs.tag }}/*.zip ./MAA-${{ env.release_tag }}-win-${{ matrix.target }}.zip | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Upload to MaaRelease | |
uses: svenstaro/upload-release-action@v2 | |
with: | |
repo_name: ${{ format('{0}/{1}', github.repository_owner, 'MaaRelease') }} | |
repo_token: ${{ secrets.MAARELEASE_RELEASE }} | |
file_glob: true | |
file: build-ota/*.zip | |
tag: ${{ env.release_tag }} | |
prerelease: true | |
overwrite: true | |
body: | | |
${{ inputs.release_body || '' }} | |
${{ needs.build-win-nightly.outputs.changelog }} | |
**Full Changelog**: [${{ needs.build-win-nightly.outputs.pre_version }} -> ${{ needs.build-win-nightly.outputs.main_tag_name }}](https://github.com/${{ github.repository }}/compare/${{ needs.build-win-nightly.outputs.pre_version }}...${{ needs.build-win-nightly.outputs.main_tag_name }}) | |
- name: Setup release mirror | |
run: | | |
gh workflow --repo MaaAssistantArknights/MaaRelease run release-mirrors.yml | |
env: | |
GH_TOKEN: ${{ secrets.MISTEOWORKFLOW }} |