-
Notifications
You must be signed in to change notification settings - Fork 38
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactor the build workflow to support automatic updating of update_i…
…nfo.json in the main branch after the new version changes from draft to public release. - Add comments for workflow configuration. - Workflow is built on Windows and may change in the future.
- Loading branch information
1 parent
e1a1b58
commit 0acc93c
Showing
1 changed file
with
194 additions
and
50 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,101 +1,245 @@ | ||
name: Build | ||
|
||
# Trigger the workflow on any push and when a release is published | ||
on: | ||
push: {} | ||
|
||
name: Build | ||
release: | ||
types: [published] | ||
|
||
env: | ||
PYTHONIOENCODING: utf-8 | ||
|
||
# Set the permissions of GITHUB_TOKEN | ||
permissions: | ||
contents: write | ||
|
||
jobs: | ||
build: | ||
name: Build | ||
runs-on: windows-2019 | ||
strategy: | ||
matrix: | ||
CI_ARCH: ["x86", "x64"] # Define architectures to build for | ||
steps: | ||
# Step 1: Check out the repository | ||
- name: Check out sources | ||
uses: actions/checkout@v4 | ||
- name: Get Python | ||
|
||
# Step 2: Set up Python environment with the specified architecture | ||
- name: Set up Python | ||
uses: actions/setup-python@v5 | ||
with: | ||
python-version: "3.10" | ||
architecture: ${{ matrix.CI_ARCH }} | ||
- uses: actions/cache@v4 | ||
|
||
# Step 3: Cache dependencies to speed up builds | ||
- name: Cache dependencies | ||
uses: actions/cache@v4 | ||
id: cache-deps | ||
with: | ||
path: | | ||
venv | ||
.env | ||
bookworm/resources | ||
key: ${{ runner.os }}-venv-${{ matrix.CI_ARCH }}-${{ hashFiles('requirements*.txt') }} | ||
- name: Setup dependencies | ||
key: ${{ runner.os }}-env-${{ matrix.CI_ARCH }}-${{ hashFiles('requirements*.txt') }} | ||
|
||
# Step 4: Install dependencies if cache is not hit | ||
- name: Install dependencies | ||
if: steps.cache-deps.outputs.cache-hit != 'true' | ||
run: | | ||
python -m venv venv | ||
venv/scripts/activate | ||
python -m venv .env | ||
.env\Scripts\activate | ||
pip install invoke | ||
invoke dev | ||
if: steps.cache-deps.outputs.cache-hit != 'true' | ||
- name: test code | ||
run: | | ||
venv/scripts/activate | ||
pytest -v | ||
- name: Build code | ||
# Step 5: Build the project | ||
- name: Build the project | ||
run: | | ||
venv/scripts/activate | ||
invoke freeze | ||
invoke copy-executables | ||
invoke make-installer | ||
.env\Scripts\activate | ||
invoke build | ||
invoke create-portable | ||
# Step 6: Generate translation catalogs and version info (only for x64) | ||
- name: Generate translation catalogs and version info | ||
if: matrix.CI_ARCH == 'x64' | ||
run: | | ||
venv/scripts/activate | ||
.env\Scripts\activate | ||
invoke gen-pot | ||
invoke update-version-info | ||
- name: Upload portable build | ||
# Step 7: Upload installer artifact | ||
- name: Upload installer | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: Bookworm-setup-${{ matrix.CI_ARCH }} | ||
path: scripts\Bookworm-*-${{ matrix.CI_ARCH }}-setup.exe | ||
|
||
# Step 8: Upload portable version artifact | ||
- name: Upload portable version | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: Bookworm-portable-${{ matrix.CI_ARCH }} | ||
path: scripts/builder/dist/${{ matrix.CI_ARCH }}/Bookworm | ||
- name: Upload installer | ||
path: scripts\Bookworm-*-${{ matrix.CI_ARCH }}-portable.zip | ||
|
||
# Step 9: Upload update bundle artifact | ||
- name: Upload update bundle | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: Bookworm-setup-${{ matrix.CI_ARCH }} | ||
path: scripts/Bookworm*setup.exe | ||
name: Bookworm-bundle-${{ matrix.CI_ARCH }} | ||
path: scripts\Bookworm-*-${{ matrix.CI_ARCH }}-update.bundle | ||
|
||
# Step 10: Upload translation catalogs (only for x64) | ||
- name: Upload translation catalogs | ||
if: matrix.CI_ARCH == 'x64' | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: translation-catalogs | ||
path: scripts/*.pot | ||
- name: Upload version info | ||
if: matrix.CI_ARCH == 'x64' && startsWith(github.ref, 'refs/tags') && !github.event_type != 'pull_request' | ||
path: scripts\*.pot | ||
|
||
# Step 11: Upload release info (only for x64 and non-pull_request) | ||
- name: Upload release info | ||
if: matrix.CI_ARCH == 'x64' && startsWith(github.ref, 'refs/tags') && github.event_name != 'pull_request' | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: release-info | ||
path: scripts/release-info.json | ||
strategy: | ||
matrix: | ||
CI_ARCH: ["x86", "x64"] | ||
|
||
path: scripts\release-info.json | ||
|
||
generate_update_info: | ||
name: Generate update-info.json | ||
runs-on: windows-2019 | ||
needs: build # Wait for the build job to complete | ||
steps: | ||
# Step 1: Check out the repository | ||
- name: Check out sources | ||
uses: actions/checkout@v4 | ||
|
||
# Step 2: Download update bundles from both architectures | ||
- name: Download update bundle for x64 | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: Bookworm-bundle-x64 | ||
path: scripts | ||
- name: Download update bundle for x86 | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: Bookworm-bundle-x86 | ||
path: scripts | ||
|
||
# Step 3: Set up Python environment | ||
- name: Set up Python | ||
uses: actions/setup-python@v5 | ||
with: | ||
python-version: "3.10" | ||
|
||
# Step 4: Install dependencies | ||
- name: Install dependencies | ||
run: | | ||
python -m venv .env | ||
.env\Scripts\activate | ||
pip install invoke | ||
invoke dev | ||
# Step 5: Generate update-info.json | ||
- name: Generate update-info.json | ||
run: | | ||
.env\Scripts\activate | ||
invoke gen-update-info-file | ||
# Step 6: Upload update-info.json as an artifact | ||
- name: Upload update-info.json | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: update-info | ||
path: update_info.json | ||
|
||
deploy: | ||
runs-on: ubuntu-latest | ||
needs: ["build"] | ||
name: Deploy | ||
runs-on: windows-2019 | ||
needs: [build, generate_update_info] # Wait for build and generate_update_info jobs | ||
steps: | ||
- uses: actions/download-artifact@v4 | ||
# Step 1: Download all artifacts from previous jobs | ||
- name: Download artifacts | ||
uses: actions/download-artifact@v4 | ||
with: | ||
path: ~/artifacts | ||
- name: Zip Artifacts | ||
path: artifacts | ||
|
||
# Step 2: Prepare release assets by moving them into an upload directory | ||
- name: Prepare release assets | ||
run: | | ||
mkdir -p upload | ||
zip -r upload/Bookworm-portable-x64.zip Bookworm-portable-x64 | ||
zip -r upload/Bookworm-portable-x86.zip Bookworm-portable-x86 | ||
mv Bookworm-setup-x64/* upload | ||
mv Bookworm-setup-x86/* upload | ||
mv release-info/* upload || echo "No release-info" | ||
mv translation-catalogs/* upload | ||
working-directory: /home/runner/artifacts | ||
- name: Release | ||
if: startsWith(github.ref, 'refs/tags') && !github.event_type != 'pull_request' | ||
mkdir upload | ||
echo Listing files in artifacts directory... | ||
dir artifacts\ | ||
echo Moving setup files... | ||
move artifacts\Bookworm-setup-x86\* upload\ | ||
move artifacts\Bookworm-setup-x64\* upload\ | ||
echo Moving portable files... | ||
move artifacts\Bookworm-portable-x86\* upload\ | ||
move artifacts\Bookworm-portable-x64\* upload\ | ||
echo Moving bundle files... | ||
move artifacts\Bookworm-bundle-x86\* upload\ | ||
move artifacts\Bookworm-bundle-x64\* upload\ | ||
if exist artifacts\translation-catalogs\* (move artifacts\translation-catalogs\* upload\) else (echo "No translation catalogs") | ||
if exist artifacts\release-info\* (move artifacts\release-info\* upload\) else (echo "No release info") | ||
if exist artifacts\update-info\* (move artifacts\update-info\* upload\) else (echo "No update info") | ||
shell: cmd | ||
|
||
# Step 3: Create a draft release (only when a tag is pushed and not for pull requests) | ||
- name: Create Release | ||
if: startsWith(github.ref, 'refs/tags') && github.event_name != 'pull_request' | ||
uses: ncipollo/release-action@v1 | ||
with: | ||
artifacts: "/home/runner/artifacts/upload/*" | ||
artifacts: 'upload\*' | ||
draft: true | ||
generateReleaseNotes: true | ||
|
||
submit_update_info: | ||
name: Submit update_info.json to main | ||
runs-on: windows-2019 | ||
if: github.event_name == 'release' && github.event.action == 'published' # Trigger when the release is published | ||
steps: | ||
# Step 1: Check out the repository | ||
- name: Check out sources | ||
uses: actions/checkout@v4 | ||
|
||
# Step 2: Download update_info.json from the release assets | ||
- name: Download update_info.json from release | ||
env: | ||
PAT_TOKEN: ${{ secrets.PAT_TOKEN }} | ||
run: | | ||
$ReleaseAssetsUrl = "${{ github.event.release.assets_url }}" | ||
Write-Host "Release Assets URL: $ReleaseAssetsUrl" | ||
$AuthHeader = "token $env:PAT_TOKEN" | ||
Write-Host "PAT_TOKEN Length: $($env:PAT_TOKEN.Length)" | ||
$Headers = @{ | ||
Authorization = $AuthHeader | ||
Accept = "application/vnd.github.v3+json" | ||
} | ||
$Assets = Invoke-RestMethod -Headers $Headers -Uri $ReleaseAssetsUrl | ||
Write-Host "Assets: $($Assets | ConvertTo-Json -Depth 3)" | ||
$UpdateInfoAsset = $Assets | Where-Object { $_.name -eq "update_info.json" } | ||
Write-Host "Update Info Asset: $($UpdateInfoAsset | ConvertTo-Json)" | ||
if ($UpdateInfoAsset -ne $null) { | ||
Write-Host "Downloading update_info.json from: $($UpdateInfoAsset.browser_download_url)" | ||
Invoke-WebRequest -Headers $Headers -Uri $UpdateInfoAsset.browser_download_url -OutFile update_info.json | ||
} else { | ||
Write-Error "update_info.json not found in release assets" | ||
exit 1 | ||
} | ||
shell: pwsh | ||
|
||
# Step 3: Set up Git user | ||
- name: Configure Git | ||
run: | | ||
git config user.name "GitHub Action" | ||
git config user.email "action@github.com" | ||
# Step 4: Create Pull Request to main branch | ||
- name: Create Pull Request | ||
uses: peter-evans/create-pull-request@v5 | ||
with: | ||
token: ${{ secrets.PAT_TOKEN }} | ||
commit-message: 'Update update_info.json after release' | ||
branch: update-info/${{ github.run_id }} | ||
title: 'Update update_info.json after release' | ||
body: 'This Pull Request updates update_info.json after the release is published.' | ||
labels: 'automation' | ||
base: main |