问题描述
在 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内容如下:
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 }}
|