Skip to content

改进 Sillot CI/CD 工作流 #655 #129

改进 Sillot CI/CD 工作流 #655

改进 Sillot CI/CD 工作流 #655 #129

Workflow file for this run

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"
package_json: "app/package.json"
jobs:
create_release:
name: Create Release
runs-on: ubuntu-latest
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 ${{ env.package_json }} -r"
- name: Extract SiYuan version from package.json
uses: sergeysova/jq-action@v2
id: syv
with:
cmd: "jq .syv ${{ env.package_json }} -r"
- name: Extract SiYuan version from package.json
uses: sergeysova/jq-action@v2
id: sypv
with:
cmd: "jq .sypv ${{ env.package_json }} -r"
- name: Extract packageManager from package.json
uses: sergeysova/jq-action@v2
id: packageManager
with:
cmd: "jq .packageManager ${{ env.package_json }} -r"
- name: Extract actionInstallCommand from package.json
uses: sergeysova/jq-action@v2
id: actionInstallCommand
with:
cmd: "jq .actionInstallCommand ${{ env.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 }}/${{ env.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: test
run: |
echo "${{ matrix.config.build_args }}"
- 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 }}/${{ env.repo_name_android }}
- name: Checkout android repo
uses: actions/checkout@v4
if: contains( matrix.config.suffix, 'apk')
with:
repository: ${{ env.repo_owner }}/${{ env.repo_name_android }}
path: ${{ github.workspace }}/${{ env.repo_owner }}/${{ env.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 }}/${{ env.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 }}/${{ env.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