Github Action实践练习2_缓存、制品与邮件通知

问题描述

在 GitHub Actions 里,不同的 Job 默认运行在完全不同的、干净的虚拟机上。 这就带来了两个致命问题:

  • 慢(需要 Cache):Job1 用 pip install 下载了 100MB 的依赖,跑完销毁了。Job2 如果也要跑 Python,还得重新下载 100MB。
  • 看不见(需要 Artifact):Job1 编译生成了一个 report.txt 文件,但是因为磁盘不共享,所有Job2找不到这个文件!

解决方案:

  • Cache(缓存):把下载好的包存到 GitHub 的缓存服务器里,下次如果 requirements.txt 没变,直接解压,10秒搞定。
  • Artifact(制品):把 Job1 生成的文件打包上传到 GitHub 服务器,Job2 再下载下来解压。

解决实践

为了解决上面的问题,写一条包含两个 Job 的流水线:

  • Job 1 (构建与测试):安装 Python 依赖(用 Cache 加速),运行代码生成一个 result.txt 文件(用 Artifact 保存)。
  • Job 2 (通知):等 Job 1 成功后,把 result.txt 下载下来,读取内容,调用第三方action发送邮件。

具体操作

在仓库目录下创建build.py(模拟生成报告)和requirement.txt(测试缓存)。

requirement.txt内容如下:

1
2
requests
pytest

build.py内容如下:

1
2
3
4
5
import time
time.sleep(2) # 模拟耗时代码
with open("result.txt", "w", encoding="utf-8") as f:
    f.write("Python项目构建成功!\n测试用例全部通过")
print("构建完成,已生成 result.txt")

.github/workflows下创建cache-notify.yaml工作流文件:

补充:secrets.MAIL_USERNAME是需要自己在对应的仓库添加的密钥。

添加方法为:打开仓库->Settings->Secrets and variables->Actions->New repository secret

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
name: Cache & Artifact & Notify

on:
  push:
    branches:
      - main

jobs:
  # ==========================================
  # Job 1: 构建(负责缓存和生成制品)
  # ==========================================
  build:
    runs-on: ubuntu-24.04
    env:
      BRANCH: ${{ github.ref_name }}
      
    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      # 1. Cache 缓存
      # setup-python 官方自带了 cache 参数,比手写 actions/cache 更简单!
      # 它会根据 requirements.txt 的哈希值来判断是否需要重新下载
      - name: Setup Python with Cache
        uses: actions/setup-python@v6
        with:
          python-version: '3.13'
          cache: 'pip'           # <- 神奇的一行:开启 pip 缓存

      - name: Install dependencies
        run: pip install -r requirements.txt

      - name: Run build script
        run: python build.py

      # 2. Artifact 制品传递
      # 把 Job1 生成的 result.txt 上传
      - name: Upload result file
        uses: actions/upload-artifact@v7
        with:
          name: build-report      # 制品的名字
          path: result.txt        # 要上传的文件路径
          retention-days: 1       # 保留1天(避免占用 GitHub 存储空间)

  # ==========================================
  # Job 2: 通知(负责接收制品并调用第三方Action)
  # ==========================================
  notify:
    runs-on: ubuntu-24.04
    # 3. Job 依赖
    # 必须等 build 这个 job 成功后,notify 才会跑
    needs: build
    
    steps:
      # 4. 下载制品
      # 把 Job1 上传的文件下载到当前机器
      - name: Download result file
        uses: actions/download-artifact@v8
        with:
          name: build-report

      # 读取文件内容,赋值给环境变量,供下一步使用
      - name: Read result
        run: |
            echo "MSG_CONTENT<<EOF" >> $GITHUB_ENV
            cat result.txt >> $GITHUB_ENV
            printf "\nEOF\n" >> $GITHUB_ENV            

      - name: Send email notification
        uses: dawidd6/action-send-mail@v16
        with:
          # 必填:邮件服务器
          server_address: smtp.qq.com      # 例如 QQ 邮箱;163 用 smtp.163.com;Gmail 用 smtp.gmail.com
          server_port: 465                  # QQ/163 用 465(SSL);Gmail 也推荐 465
          secure: true

          # 必填:SMTP 账号 & 密码(推荐用 Secrets)
          username: ${{ secrets.MAIL_USERNAME }}   # 完整邮箱地址
          password: ${{ secrets.MAIL_PASSWORD }}   # 邮箱“授权码”/应用密码,不是登录密码

          # 必填:收件人(可以是多个,逗号分隔)
          to: ${{ secrets.NOTIFY_EMAIL }}          # 接收通知的邮箱

          # 必填:发件人(建议和SMTP账号一致)
          from: GitHub Actions <${{ secrets.MAIL_USERNAME }}>

          # 必填:邮件主题
          subject: "【GitHub 通知】${{ github.repository }}${{ github.ref_name }} 构建结果"

          # 可选:正文(支持多行)
          body: |
            仓库:${{ github.repository }}
            分支:${{ github.ref_name }}
            触发人:${{ github.actor }}
            提交信息:${{ github.event.head_commit.message }}

            构建报告:
            ${{ env.MSG_CONTENT }}            
网站总访客数:Loading
网站总访问量:Loading
使用 Hugo 构建
主题 StackJimmy 设计