GitHub Actions

image

官方文档:https://docs.github.com/zh/actions

GitHub Actions 是 GitHub 提供的持续集成(CI)和持续交付(CD)平台,旨在帮助开发者自动化构建、测试和部署代码。

1. 什么是 GitHub Actions?

GitHub Actions 是一种自动化工具,允许开发者直接在 GitHub 上构建、测试和部署代码。

它通过 YAML 文件定义工作流,可以根据仓库中的事件触发这些工作流,例如创建、合并或关闭拉取请求。

2. GitHub Actions 的基本概念

2.1. 工作流(Workflow)

  • 一次持续集成运行的过程。工作流文件存放在 .github/workflows 目录中。
  • 文件名可以任意取,但后缀名必须是 .yml 或 .yaml。

2.2. 任务(Job)

  • 一个工作流由一个或多个任务组成,每个任务可以并行或串行运行。每个任务在一个独立的虚拟机或容器中运行。

2.3. 步骤(Step)

  • 每个任务由多个步骤组成,每个步骤执行一个具体的操作。步骤可以是运行命令、调用脚本或使用预定义的操作。

2.4. 操作(Action)

  • 步骤中执行的具体命令或脚本,可以是预定义的操作或自定义脚本。
  • 操作可以从 GitHub Marketplace 获取,也可以自己编写。

3. 如何创建 GitHub Actions 工作流

3.1. 创建工作流文件

在你的 GitHub 仓库中,导航到 .github/workflows 目录。如果该目录不存在,可以手动创建。然后在该目录下创建一个以 .yml 为后缀的 YAML 文件,例如 ci.yml。

3.2. 定义工作流

在 YAML 文件中定义工作流的名称、触发事件和具体步骤。以下是一个简单的示例:

name: CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

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

    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'

    - name: Install dependencies
      run: npm install

    - name: Run tests
      run: npm test

这个工作流在每次推送或拉取请求时触发,执行以下步骤:

  • 检出代码:使用 actions/checkout@v2 操作从仓库中检出代码。
  • 设置 Node.js 环境:使用 actions/setup-node@v2 操作设置 Node.js 版本。
  • 安装依赖:运行 npm install 命令安装项目依赖。
  • 运行测试:运行 npm test 命令执行测试。

注:actions/checkout 与 actions/setup-node 目前已更新至 v4,Node.js 建议使用 20 LTS,示例保留原文写法,新项目建议用新版本。

3.3. 使用预配置的工作流模板

GitHub 提供了一些预配置的工作流模板,可以按原样使用或根据需要进行自定义。这些模板涵盖了常见的编程语言和框架,例如 Node.js、Python、Java 等。

3.4. 监控和故障排除

GitHub Actions 提供了详细的日志记录功能,帮助你监控工作流的运行状态并进行故障排除。你可以在 GitHub 仓库的 “Actions” 选项卡中查看每次工作流运行的详细日志。

4. 示例:部署静态网站

以下是一个部署静态网站的示例工作流:

name: Deploy static website

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

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

    - name: Build website
      run: |
        npm install
        npm run build

    - name: Deploy to GitHub Pages
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: ./public

这个工作流在每次推送到 main 分支时触发,执行以下步骤:

  • 检出代码:使用 actions/checkout@v2 操作从仓库中检出代码。
  • 构建网站:运行 npm install 和 npm run build 命令构建静态网站。
  • 部署到 GitHub Pages:使用 peaceiris/actions-gh-pages@v3 操作将构建后的文件部署到 GitHub Pages。

5. Git Tag

[!NOTE]
electron-builder 默认只在有 Git tag 时才会发布。确保在准备发布新版本时创建一个新的 Git tag:

git tag v1.0.0  # 使用实际的版本号
git push --tags

完成这些步骤后,重新运行你的 CI/CD 流程应该就能成功发布到 GitHub 了。

如果你只是想在本地构建而不发布,可以使用:

npm run build

而不是 npm run dist。这样就只会构建应用而不会尝试发布。

5.1. 环境变量

您使用的命令中,“dandan” 不是一个有效的 EnvironmentVariableTarget。

PowerShell 中的 SetEnvironmentVariable 方法需要一个有效的目标,可以是 Process、User 或 Machine。

根据您想要设置环境变量的范围,您可以使用以下命令之一:

5.2. 为当前进程设置(临时)

$env:GH_TOKEN = "ghp_YourTokenHere"

5.3. 为当前用户设置(持久化)

[Environment]::SetEnvironmentVariable("GH_TOKEN", "ghp_YourTokenHere", "User")

5.4. 为系统设置(持久化,需要管理员权限)

[Environment]::SetEnvironmentVariable("GH_TOKEN", "ghp_YourTokenHere", "Machine")

安全提示:不要在命令或文档中直接暴露 GitHub Personal Access Token,这是非常敏感的信息,不应以明文形式存储或分享(原文中的真实令牌已替换为占位符)。如已泄露,请立即到 GitHub 设置中撤销该令牌。

6. GH_TOKEN 一直报错时的有效方法

6.1. 使用个人访问令牌

如果其他方法都不起作用,可以尝试使用个人访问令牌:

git remote set-url origin https://<your-access-token>@github.com/baoyu0/InsightWave.git

注意:pat 后面的 @ 符号。

git remote set-url origin https://[email protected]/baoyu0/InsightWave

6.2. 版本号

版本号用于标识软件的不同版本,帮助用户和开发者了解软件的更新和变化。

6.3. 版本号格式

通常使用语义化版本号(Semantic Versioning),格式为:主版本号.次版本号.修订号(例如:1.0.0)。

6.4. 保持一致性

frontend/package.json 中的 version 字段和 Git 标签应该保持一致,这样可以确保发布的版本与代码实际版本相匹配。

6.5. 自动化版本管理

为了简化这个过程,我们可以使用一个 npm 包来自动管理版本号。以下是具体步骤:

  1. 安装 version-bump-prompt 包:

    npm install --save-dev version-bump-prompt
    
  2. 在 frontend/package.json 中添加以下脚本:

    "scripts": {
      "version": "version-bump-prompt --commit --tag --push"
    }
    
  3. 当您要发布新版本时,只需运行:

    npm run version
    

    这个命令会提示您选择要增加的版本号类型(主版本、次版本或修订版本),然后自动更新 package.json 中的版本号,创建一个提交,添加一个 Git 标签,并推送到远程仓库。

6.6. 在 CI/CD 中使用版本号

您的 CI/CD 工作流程已经配置为在推送带有 v 前缀的标签时触发发布流程。使用上述方法创建的标签会自动触发这个流程。

6.7. 手动管理(如果您更喜欢手动控制)

如果您不想使用自动化工具,您可以手动更新 frontend/package.json 中的 version 字段,然后创建一个匹配的 Git 标签:

git tag v1.0.0
git push origin v1.0.0

这将触发 CI/CD 工作流程,构建应用程序并创建一个新的 GitHub Release。

通过这种方式,您可以确保 package.json 中的版本号与 Git 标签保持同步,从而使您的发布过程更加一致和可靠。

6.8. release 排查

根据您提供的截图和 CI/CD 配置文件,构建过程成功完成,但 release 步骤被跳过了。这是正常的行为,因为 release 作业只在特定条件下运行。让我解释一下原因和如何触发 release:

6.9. release 作业的触发条件

在 ci-cd.yml 文件中,release 作业有一个条件:

if: startsWith(github.ref, 'refs/tags/v')

这意味着只有当推送的是以 “v” 开头的标签时,才会触发 release 作业。

6.10. 当前的推送

从截图中可以看到,这次运行是由普通的推送触发的(“baoyu0 pushed”),而不是标签推送。

6.11. 如何触发 release

要触发 release 作业,您需要创建并推送一个新的版本标签。例如:

git tag v1.0.1
git push origin v1.0.1

6.12. 自动版本更新

您的工作流程中包含了自动更新版本的步骤:

- name: Update version
  run: |
    cd frontend
    npm version patch -m "Bump version to %s [skip ci]"
    git config --global user.email "[email protected]"
    git config --global user.name "GitHub Actions"
    git push
    git push --tags

这个步骤会自动增加补丁版本号并创建一个新的标签。但是,由于提交消息中包含 [skip ci],它不会触发新的 CI 运行。

6.13. 建议

如果您希望自动创建的标签能触发 release,可以移除 [skip ci] 部分。

或者,您可以手动创建和推送标签来触发 release 过程。

6.14. 检查 release

即使 release 作业被跳过,构建的 artifacts 仍然被上传了。您可以在 GitHub Actions 的 “Artifacts” 部分找到它们。

6.15. 总结

当前的行为是正常的。如果您想创建一个新的 release,请推送一个新的版本标签,或者修改自动版本更新步骤以允许它触发新的 CI 运行。

7. 总结

GitHub Actions 是一个强大的工具,可以显著提高开发效率,通过自动化构建、测试和部署流程,帮助团队更快地交付高质量的软件。希望本教程能帮助你快速上手 GitHub Actions,开始自动化你的开发工作流。