改进 Sillot CI/CD 工作流 #655 #127
Workflow file for this run
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: Sillot CI/CD | |
# https://github.com/actions/runner-images/blob/main/images/ | |
on: | |
push: | |
tags: | |
- "v*-sillot" | |
# ref https://docs.github.com/zh/actions/learn-github-actions/variables | |
env: | |
repo_name_android: "Sillot-android" | |
repo_name: "Sillot" | |
repo_owner: "Hi-Windom" | |
jobs: | |
create_release: | |
name: Create Release | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
string: | |
- repo_name_android: "Sillot-android" | |
repo_name: "Sillot" | |
repo_owner: "Hi-Windom" | |
package_json: "app/package.json" | |
outputs: | |
upload_url: ${{ steps.create_release.outputs.upload_url }} | |
release_version: ${{ steps.release_info.outputs.release_version }} | |
version: ${{ steps.version.outputs.value }} | |
packageManager: ${{ steps.packageManager.outputs.value }} | |
actionInstallCommand: ${{ steps.actionInstallCommand.outputs.value }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.10" | |
- run: pip install PyGithub | |
- name: Extract Sillot version from package.json | |
uses: sergeysova/jq-action@v2 | |
id: version | |
with: | |
cmd: "jq .version ${{ matrix.string.package_json }} -r" | |
- name: Extract SiYuan version from package.json | |
uses: sergeysova/jq-action@v2 | |
id: syv | |
with: | |
cmd: "jq .syv ${{ matrix.string.package_json }} -r" | |
- name: Extract SiYuan version from package.json | |
uses: sergeysova/jq-action@v2 | |
id: sypv | |
with: | |
cmd: "jq .sypv ${{ matrix.string.package_json }} -r" | |
- name: Extract packageManager from package.json | |
uses: sergeysova/jq-action@v2 | |
id: packageManager | |
with: | |
cmd: "jq .packageManager ${{ matrix.string.package_json }} -r" | |
- name: Extract actionInstallCommand from package.json | |
uses: sergeysova/jq-action@v2 | |
id: actionInstallCommand | |
with: | |
cmd: "jq .actionInstallCommand ${{ matrix.string.package_json }} -r" | |
- id: thisLatestRelease | |
uses: K-Sillot/github-action-get-latest-release@master | |
with: | |
# owner: Hi-Windom | |
# repo: Sillot | |
repository: ${{ github.repository }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
excludes: prerelease, draft | |
- name: Gather Sillot Release Information | |
id: release_info | |
# https://github.com/Hi-Windom/Sillot/issues/373 | |
# 注意:创建或更新环境变量的步骤无权访问新值;$GITHUB_OUTPUT 需要定义步骤 id 才能稍后检索输出值,$GITHUB_ENV 则不需要 | |
# 以下转换不再需要: | |
# changelog="${changelog//'%'/'%25'}" | |
# changelog="${changelog//$'\n'/'%0A'}" | |
# changelog="${changelog//$'\r'/'%0D'}" | |
run: | | |
echo "release_title=$(git show --format=%s --no-patch | head -1)" >> $GITHUB_OUTPUT | |
echo "release_version=v${{ steps.version.outputs.value }}_$(TZ=Asia/Shanghai date +'%Y%m%d')_syv${{ steps.syv.outputs.value }}" >> $GITHUB_OUTPUT | |
changelog1=$(python scripts/parse-changelog-HEAD.py -t ${{ github.ref }} -b ${{ steps.thisLatestRelease.outputs.release }} ${{ env.repo_owner }}/${{ env.repo_name }}) | |
changelog2=$(python scripts/parse-changelog-sillot.py -t ${{ github.ref }} ${{ env.repo_owner }}/${{ env.repo_name }}) | |
changelog3=$(python scripts/parse-changelog-sillot.py -t ${{ github.ref }} ${{ env.repo_owner }}/${{ matrix.string.repo_name_android }}) | |
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) | |
echo "release_body_sillot<<$EOF" >> $GITHUB_ENV | |
echo "$changelog1" >> $GITHUB_ENV | |
echo "$changelog2" >> $GITHUB_ENV | |
echo "$changelog3" >> $GITHUB_ENV | |
echo "$EOF" >> $GITHUB_ENV | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Gather SiYuan Release Information | |
id: release_info_siyuan | |
run: | | |
changelog=$(python scripts/parse-changelog.py -t v${{ steps.syv.outputs.value }} -a "${{ steps.sypv.outputs.value }}" siyuan-note/siyuan) | |
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) | |
echo "release_body_siyuan<<$EOF" >> $GITHUB_ENV | |
echo "$changelog" >> $GITHUB_ENV | |
echo "$EOF" >> $GITHUB_ENV | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Create Release | |
id: create_release | |
uses: ncipollo/release-action@v1 | |
with: | |
name: ${{ steps.release_info.outputs.release_version }} | |
tag: ${{ github.ref }} | |
body: "${{ env.release_body_sillot }}\n---\n${{ env.release_body_siyuan }}\n---\n\n\n" | |
generateReleaseNotes: true | |
draft: false | |
prerelease: true | |
token: ${{ secrets.GITHUB_TOKEN }} | |
build: | |
runs-on: ${{ matrix.config.os }} | |
name: ${{ matrix.config.name }} | |
needs: create_release | |
strategy: | |
matrix: | |
config: | |
- os: ubuntu-20.04 | |
name: ubuntu build linux.AppImage | |
kernel_path: "../app/kernel-linux/SiYuan-Sillot-Kernel" | |
build_args: "-s -w -X github.com/$repo_owner/$repo_name/kernel/util.Mode=prod" | |
electron_args: "dist-linux" | |
goos: "linux" | |
goarch: "amd64" | |
suffix: "linux.AppImage" | |
- os: ubuntu-20.04 | |
name: ubuntu build linux.tar.gz | |
kernel_path: "../app/kernel-linux/SiYuan-Sillot-Kernel" | |
build_args: "-s -w -X github.com/$repo_owner/$repo_name/kernel/util.Mode=prod" | |
electron_args: "dist-linux" | |
goos: "linux" | |
goarch: "amd64" | |
suffix: "linux.tar.gz" | |
- os: windows-latest | |
name: windows build win.exe | |
kernel_path: "../app/kernel/SiYuan-Sillot-Kernel.exe" | |
build_args: "-s -w -H=windowsgui -X github.com/$repo_owner/$repo_name/kernel/util.Mode=prod" | |
electron_args: "dist" | |
goos: "windows" | |
gobin: "bin" | |
mingwsys: "MINGW64" | |
goarch: "amd64" | |
suffix: "win.exe" | |
- os: windows-latest | |
name: windows build android.apk | |
kernel_path: "../app/kernel/SiYuan-Sillot-Kernel.exe" | |
build_args: "-s -w -H=windowsgui -X github.com/$repo_owner/$repo_name/kernel/util.Mode=prod" | |
electron_args: "dist" | |
goos: "windows" | |
gobin: "bin" | |
mingwsys: "MINGW64" | |
goarch: "amd64" | |
suffix: "apk" | |
steps: | |
- name: Enable long paths for windows # 如果路径超过了 260 个字符(对于 .pnpm 几乎不可避免),可能会遇到问题。GitHub Actions 的 windows-latest 已经支持长路径。 | |
if: contains( matrix.config.goos, 'windows') | |
run: | | |
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' | |
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 | |
- name: Checkout repository and submodules | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
path: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }} | |
- name: Set up MingGW | |
uses: msys2/setup-msys2@v2 | |
if: contains( matrix.config.goos, 'windows') | |
with: | |
install: p7zip mingw-w64-x86_64-lua | |
- name: Set up TDM-GCC | |
run: msys2 -c "bash ${{ env.repo_owner }}/${{ env.repo_name }}/scripts/get-tdm-gcc.sh tdm https://github.com/jmeubank/tdm-gcc/releases/download/v10.3.0-tdm-1/tdm-gcc-10.3.0.exe" && echo "CC=${{ github.workspace }}/tdm/bin/gcc.exe" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
if: contains( matrix.config.goarch, '386') | |
working-directory: ${{ github.workspace }} | |
- name: Set up Go | |
uses: actions/setup-go@v5 | |
with: | |
go-version-file: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/kernel/go.mod | |
- run: go version | |
- name: Set up goversioninfo | |
run: go get github.com/josephspurrier/goversioninfo/cmd/goversioninfo && go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo | |
if: contains( matrix.config.goos, 'windows') | |
working-directory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/kernel | |
env: | |
GO111MODULE: on | |
CGO_ENABLED: 1 | |
GOOS: ${{ matrix.config.goos }} | |
GOPATH: ${{ github.workspace }}/go | |
GOARCH: ${{ matrix.config.goarch }} | |
- name: Set up Node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- name: Install Node pnpm | |
run: npm install -g ${{ needs.create_release.outputs.packageManager }} | |
working-directory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app | |
- name: Change NPMRC File | |
run: pnpm config set registry https://registry.npmjs.org/ --location project | |
working-directory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app | |
- name: Install Node Dependencies | |
run: ${{ needs.create_release.outputs.actionInstallCommand }} | |
working-directory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app | |
- name: Building UI | |
run: pnpm run build | |
working-directory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app | |
- name: Remove Build Directory | |
uses: K-Sillot/rm@master | |
if: ${{ !contains( matrix.config.suffix, 'apk') }} | |
with: | |
path: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app/build | |
- name: Remove Kernel Directory for Linux | |
uses: K-Sillot/rm@master | |
if: ${{ !contains( matrix.config.suffix, 'apk') }} | |
with: | |
path: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app/kernel-linux | |
- name: Remove Kernel Directory for Windows | |
uses: K-Sillot/rm@master | |
if: ${{ !contains( matrix.config.suffix, 'apk') }} | |
with: | |
path: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app/kernel | |
- name: Generate Icon Resource and Properties/Version Info For Windows | |
run: ${{ github.workspace }}\go\${{ matrix.config.gobin }}\goversioninfo -platform-specific=true -icon="resource\icon.ico" -manifest="resource\goversioninfo.exe.manifest" | |
if: ${{ contains( matrix.config.goos, 'windows') && !contains( matrix.config.suffix, 'apk') }} | |
working-directory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/kernel | |
- name: Building Kernel | |
if: ${{ !contains( matrix.config.suffix, 'apk') }} | |
run: go build --tags fts5 -o "${{ matrix.config.kernel_path }}" -v -ldflags "${{ matrix.config.build_args }}" | |
working-directory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/kernel | |
env: | |
GO111MODULE: on | |
CGO_ENABLED: 1 | |
GOOS: ${{ matrix.config.goos }} | |
GOPATH: ${{ github.workspace }}/go | |
GOARCH: ${{ matrix.config.goarch }} | |
- name: Building Electron | |
if: ${{ !contains( matrix.config.suffix, 'apk') }} | |
run: pnpm run ${{ matrix.config.electron_args }} | |
working-directory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app | |
- name: Upload Release Asset for Windows & Linux | |
if: ${{ !contains( matrix.config.suffix, 'apk') }} | |
uses: shogo82148/actions-upload-release-asset@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
upload_url: ${{ needs.create_release.outputs.upload_url }} | |
asset_name: ${{ env.repo_name }}-${{ needs.create_release.outputs.release_version }}-${{ matrix.config.suffix }} | |
asset_path: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app/build/${{ env.repo_name }}-${{ needs.create_release.outputs.version }}-${{ matrix.config.suffix }} | |
- name: zip WinPortable | |
uses: thedoctor0/zip-release@0.7.1 | |
if: ${{ contains( matrix.config.goos, 'windows') && !contains( matrix.config.suffix, 'apk') }} | |
with: | |
type: 'zip' | |
filename: ${{ env.repo_name }}-${{ needs.create_release.outputs.release_version }}-win_Portable_.zip | |
path: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }}/app/build/win-unpacked/ | |
exclusions: '*.git*' | |
recursive_exclusions: 'LICENSES.chromium.html' | |
- name: Upload WinPortable to release asset | |
if: ${{ contains(matrix.config.goos, 'windows') && !contains( matrix.config.suffix, 'apk') }} | |
uses: shogo82148/actions-upload-release-asset@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
upload_url: ${{ needs.create_release.outputs.upload_url }} | |
asset_name: ${{ env.repo_name }}-${{ needs.create_release.outputs.release_version }}-win_Portable_.zip | |
asset_path: ${{ env.repo_name }}-${{ needs.create_release.outputs.release_version }}-win_Portable_.zip | |
# Manual setup is required when the built-in version does not work correctly in windows2022 | |
- name: Setup JDK | |
uses: actions/setup-java@v3 | |
if: contains( matrix.config.suffix, 'apk') | |
continue-on-error: true | |
with: | |
java-version: '17' | |
distribution: 'zulu' | |
overwrite-settings: true | |
- name: Setup Android SDK | |
uses: android-actions/setup-android@v3.2.0 | |
if: contains( matrix.config.suffix, 'apk') | |
- name: Install Android NDK | |
uses: nttld/setup-ndk@v1 | |
if: contains( matrix.config.suffix, 'apk') | |
with: | |
ndk-version: r25b | |
add-to-path: true | |
- name: Remove android Directory | |
uses: K-Sillot/rm@master | |
if: contains( matrix.config.suffix, 'apk') | |
with: | |
path: ${{ github.workspace }}/${{ env.repo_owner }}/${{ matrix.string.repo_name_android }} | |
- name: Checkout android repo | |
uses: actions/checkout@v4 | |
if: contains( matrix.config.suffix, 'apk') | |
with: | |
repository: ${{ env.repo_owner }}/${{ matrix.string.repo_name_android }} | |
path: ${{ github.workspace }}/${{ env.repo_owner }}/${{ matrix.string.repo_name_android }} | |
- name: Before android build | |
if: contains( matrix.config.suffix, 'apk') | |
run: | | |
cd ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.repo_name }} | |
.\scripts\sillot-android-build-action.bat | |
continue-on-error: false | |
- name: Build with Gradle | |
if: contains( matrix.config.suffix, 'apk') | |
working-directory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ matrix.string.repo_name_android }} | |
run: ./gradlew assembleOfficialAction --quiet --stacktrace | |
continue-on-error: false | |
- uses: noriban/sign-android-release@v5 | |
if: contains( matrix.config.suffix, 'apk') | |
name: Sign APK | |
id: sign_app | |
with: | |
releaseDirectory: ${{ github.workspace }}/${{ env.repo_owner }}/${{ matrix.string.repo_name_android }}/app/build/outputs/apk/official/action | |
signingKeyBase64: ${{ secrets.APK_SIGN_KEY_JKS_BASE64 }} | |
alias: ${{ secrets.APK_SIGN_KEY_ALIAS }} | |
keyStorePassword: ${{ secrets.APK_SIGN_KEY_JKS_PW }} | |
keyPassword: ${{ secrets.APK_SIGN_KEY_PW }} | |
env: | |
# override default build-tools version -- optional | |
BUILD_TOOLS_VERSION: "34.0.0" | |
- name: Upload APK to release asset | |
if: contains( matrix.config.suffix, 'apk') | |
uses: shogo82148/actions-upload-release-asset@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
upload_url: ${{ needs.create_release.outputs.upload_url }} | |
asset_name: ${{ env.repo_name }}-${{ needs.create_release.outputs.release_version }}-beta_github.apk | |
asset_path: ${{ steps.sign_app.outputs.signedReleaseFile }} | |
- name: Upload logs if failure | |
if: failure() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: logs | |
path: ./**/*.log |