通过 GitHub Actions 自动构建分支

CudaText 汉化包项目中需要实现一个 CI/CD 脚本:一是用 msgfmt 命令生成 MO 文件;二是将生成的汉化包发布到 main 分支上。第一步倒是很容易通过 GitHub Actions 调用 Makefile 脚本来实现,第二步纯手写的话似乎比较麻烦,不如我们先问一下神奇的 ChatGPT 吧:

fournoas: 请帮我写一个 github actions workflow 脚本,它先调用 make build 命令构建项目,并将生成的 build 目录内容发布到 main 分支

ChatGPT: 您可以使用以下GitHub Actions workflow脚本来构建项目并将生成的build目录内容发布到main分支。请将以下内容添加到您的项目的.github/workflows目录中的一个YAML文件中,例如build.yml

YAMLname: Build and Deploy

on:
  push:
    branches:
      - master  # 当有代码推送到master分支时触发

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Build project
      run: make build  # 替换为您的构建命令

    - name: Deploy to main branch
      run: |
        git config --global user.email "[email protected]"
        git config --global user.name "GitHub Actions"

        # Clone the repository
        git clone https://github.com/${{ github.repository }} /tmp/repo

        # Copy build directory contents to the main branch
        cp -r build/* /tmp/repo

        # Commit and push changes
        cd /tmp/repo
        git add .
        git commit -m "Auto-deploy build files"
        git push origin main

请确保将上述脚本中的以下部分替换为您的实际配置:

  1. on.push.branches中的分支名,以便在特定分支推送时触发工作流程。
  2. 构建步骤中的run命令,以适应您的项目的实际构建命令。
  3. 在部署步骤中,您可以配置Git的用户名和电子邮件地址,以及更改目标分支(main)等信息,以适应您的项目需求。

将此文件添加到您的项目后,每当您将代码推送到main分支时,GitHub Actions将执行此工作流程,并自动构建项目并将生成的build目录内容发布到main分支。请确保您的GitHub仓库已启用了GitHub Actions。

ChatGPT 给的这个脚本除了不能用外,还是挺好用的。难道这就是号称将替代程序员的高智能 AI 的日常表现嘛。无奈,接下来又去 GitHub Marketplace 逛了一圈。也许是没有用对正确的搜索关键字,并没有找到合适的脚本。

突然想到 GitHub Pages action 似乎能实现这个功能,虽然这个脚本是用来发布 GitHub Pages 的。经测试发现还挺好用的。

在项目 dev 分支根目录下创建 .github/workflows/build.yml 文件,内容如下:

YAMLname: Build and Release

on:
  push:
    branches:
      - dev

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 1
          
      - name: Build project
        run: make build
        
      - name: Release project
        uses: peaceiris/actions-gh-pages@v3
        with:
          deploy_key: ${{ secrets.DEPLOY_TOKEN }}
          publish_dir: ./build
          keep_files: false
          enable_jekyll: true
          publish_branch: main

脚本中 ${{ secrets.DEPLOY_TOKEN }} 的设置参考文章《使用 GitHub Actions 自动部署 Hugo 站点

特别要注意的是脚本第 25 和 26 行的配置。其中 keep_files: false 表示不保留旧文件,让 main 分支中的文件和当前 build 目录下生成的文件保持一致;另外默认情况下脚本会在分支根目录下创建一个名为 .nojekyll 的文件,设置 enable_jekyll: true 避免生成此文件。