GitHub Actions中定义日常执行的工作流
作为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
触发工作流执行的方式
- event,主要是代码库中发生的各种各样的event,详见Events that trigger workflows - GitHub Docs。
- POST REST API到/repos/{owner}/{repo}/dispatches,从代码库外部触发repository_dispatch事件以执行工作流,详见REST API endpoints for repositories - GitHub Docs。
- 定时schedule,本文详解
- 手工,通过workflow_dispatch事件
定义定时执行的工作流
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。
更多推荐




所有评论(0)