作为CI/CD的一部分,GitHub Actions为代码库的DevOps提供了运行环境。GitHub上的代码库可以无缝地定义和执行自己的工作流。

GitHub Actions中的概念

  • workflow,可配置的自动化流程,用以运行一个或多个jobs。YAML格式,存放在代码库的.github/workflows路径下。一个代码库中可以有多个工作流。一个工作流还可以引用另一个工作流。
  • event,代码库中发生的具体活动,用以触发workflow的执行。
  • jobs,一个job就是工作流中包含的一组steps,在同一个runner中执行。一个job内的steps是共享数据的。不同job之间默认无依赖可以并行,也可以配置依赖关系,顺序执行。
  • action,一个action是预定义的、一组可重用的jobs,在工作流中执行一项完整的任务。如常见的actions/checkout@v6。在Actions · GitHub Marketplace查找可用的actions。
  • runner,一个runner就是一个server,如Ubuntu Linux, MS Windows,和MacOS,用以运行被触发的workflow。一个runner一次只能运行一个job。工作流的每次运行,都是在一个全新的VM中。
  • steps,一个step可以是一个可执行的脚本,也可以是一个要执行的action。

定义工作流的模板

GitHub Actions starter-workflows - GitHub Docs中提供了大量预定义的工作流模板,分类如下:

  • 持续集成CI
  • 部署Deployment
  • 测试Testing
  • 代码质量Code-quality
  • 代码审查Code-review
  • 依赖管理Dependency-management
  • 监控Monitoring
  • 自动化Automation
  • 工具Utilities
  • 主页Pages
  • Hugo

触发工作流执行的方式

定义定时执行的工作流

GitHub Actions定义了schedule事件以实现定时执行的工作流,基于代码库的默认分支,如master。工作流文件及其所在的.github/workflows/路径也必须在默认分支上。

name: Clash Daily Execution

on:
  schedule:
    - cron: "35 3 * * *"
      timezone: "Asia/Shanghai"

  workflow_dispatch:

jobs:
  run-script:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v7

      - name: Set up Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.x'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          # pip install -r requirements.txt

      - name: Run Python script and save logs
        id: run_script
        run: |
          python src/my-clash.py > log.txt 2>&1
        continue-on-error: true

      - name: Send email notification
        uses: dawidd6/action-send-mail@v3
        with:
          server_address: smtp.office365.com
          server_port: 465
          secure: true
          username: ${{ secrets.MAIL_USERNAME }}
          password: ${{ secrets.MAIL_PASSWORD }}
          subject: "Daily Script Execution Log - ${{ github.run_id }}"
          to: ${{ secrets.TO_EMAIL }}
          from: ${{ secrets.FROM_EMAIL }}
          body: file://log.txt
      - name: Clean up log file
        if: always()
        run: |
          rm -f log.txt
          echo "log.txt has been successfully deleted."

工作流的执行时间默认是UTC时间,可以通过timezone表达为本地时间。虽然工作流中设置了执行时间,但工作流每次的真正执行时间可能受到GitHub Actions工作流负载的影响,甚至可能被取消。不建议将执行时间设置为整点的开始。

在运行的脚本内部,如果使用了相对路径访问其他文件,则还需要配置working-directory: ./src。

通过Python解释器执行脚本文件,而非直接执行脚本文件,只要拥有脚本文件的读取权限即可,默认已经拥有。

发邮件这里直接使用了dawidd6/action-send-mail@v3,详见dawidd6/action-send-mail。关于定制action参考Creating a composite action - GitHub Docs

使用Secrets定义变量的方式,参考Using secrets in GitHub Actions - GitHub Docs

对于GitHub上的公共代码库,如果代码库在60天内没有任何活动,则建立的定时工作流将被禁用(Disable),必须重新开启(Enable)工作流。可以通过GitHub在代码库的首页,手工开启工作流;也可以通过REST API: PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐