作为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/checkoutv6。在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主页PagesHugo触发工作流执行的方式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/checkoutv7 - name: Set up Python uses: actions/setup-pythonv6 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 21 continue-on-error: true - name: Send email notification uses: dawidd6/action-send-mailv3 with: server_address: smtp.office365.com server_port: 587 secure: true username: ${{ secrets.MAIL_USERNAME }} password: ${{ secrets.MAIL_PASSWORD }} subject: Daily Script Execution Log - ${{ github.run_id }} to: ${{ secrets.TO_EMAIL }} from: GitHub Actions on Clash 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-mailv3详见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。