使用GitHub Actions自动构建程序并发布到Release
前言
简单记录下使用使用GitHub Actions自动构建程序并发布到Release。摸索了好一阵,坑还比较多。
配置
配置主要分为构建和上传。这里使用python作为示例,为了能在其他语言复用这个模板,这里尽量配置得通用一点。
构建部分参考Building and testing Python。上传部分参考了多个开源项目,并且实践修改而来。
配置案例
创建配置文件.github/workflows/python-package.yml
name: Python package
on:
push:
tags: [ '**' ]
jobs:
Linux-build-amd64:
name: Build Linux Amd64
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
# 必须加''
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install wheel pyinstaller
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Pyinstaller
run: |
pyinstaller --onefile --add-data "conf.yaml.default:." --add-data "templates:templates" --name vpspeek app.py
- name: Verify generated file
run: |
ls -l dist/
- name: Upload Linux File
uses: actions/upload-artifact@v3
with:
path: dist/vpspeek
Create-release:
permissions: write-all
runs-on: ubuntu-latest
needs: [ Linux-build-amd64 ]
steps:
- name: Download Linux File
uses: actions/download-artifact@v3
with:
path: dist/
- name: Move downloaded file
run: |
mv dist/artifact/* dist/
- name: Verify file after move
run: |
ls dist/
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: false
- name: Upload Release Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: dist/vpspeek
asset_name: vpspeek
asset_content_type: application/octet-stream
配置说明
on.push.tags: [ '**' ]
每次打tag的时候都自动构建。- jobs 分为 Linux-build-amd64 和 Create-release ,方便后面对 Windows 或者其他版本系统进行扩展。
- actions/setup-python@v5 的 python-version: '3.10' 必须使用''。如填3.10会被识别成3.1。
actions/download-artifact@v3
下载步骤,会在下载的目录中为每个 artifact 创建一个子目录,默认情况下这个子目录的名称会是 artifact 名称(即artifact
)。这样就导致了期望文件vpspeek
出现在dist/
目录下,实际上它在dist/artifact/
目录中。
解决办法就是把文件mv到dist或者直接使用artifact下的文件。- GitHub不允许配置GITHUB_开头的secrets,MY_GITHUB_TOKEN。
License:
CC BY 4.0