如何在Github Actions中基于文件内目标标题列表触发任务?
在GitHub Actions中实现从文件读取目标标题并匹配Issue标题的需求
可以实现这个需求,核心思路是通过一个前置任务读取存储目标标题的文件,判断Issue标题是否包含列表中任一关键词,将匹配结果作为输出传递给后续任务,后续任务根据该结果决定是否执行。以下是两种具体实现方式:
方法一:使用Python脚本实现
1. 准备目标标题文件
在项目根目录创建target-titles.csv文件,每行存放一个目标关键词(也可以用逗号分隔同一行,后续脚本对应修改处理逻辑):
Target Title1 Target Title2 Target Title3
2. 编写Python判断脚本
创建check_title.py脚本,读取目标列表并判断Issue标题是否匹配:
import os def main(): # 获取GitHub Actions传递的Issue标题 issue_title = os.environ.get('ISSUE_TITLE', '') # 读取目标标题列表,过滤空行 with open('target-titles.csv', 'r') as f: target_titles = [line.strip() for line in f if line.strip()] # 判断Issue标题是否包含任一目标关键词 matches = any(target in issue_title for target in target_titles) # 输出GitHub Actions可识别的结果,供后续任务使用 print(f"::set-output name=title_matched::{str(matches).lower()}") if __name__ == "__main__": main()
3. 编写GitHub Actions工作流
创建.github/workflows/issue-trigger-job.yml文件:
name: Trigger Job on Matched Issue Title on: issues: types: [opened] jobs: # 前置任务:检查Issue标题是否匹配 check-title: runs-on: ubuntu-latest # 定义输出结果,供后续任务调用 outputs: title_matched: ${{ steps.check.outputs.title_matched }} steps: - name: 拉取代码仓库 uses: actions/checkout@v4 - name: 配置Python环境 uses: actions/setup-python@v5 with: python-version: '3.x' - name: 检查标题匹配情况 id: check env: # 将当前Issue的标题传入环境变量 ISSUE_TITLE: ${{ github.event.issue.title }} run: python check_title.py # 目标任务:仅当标题匹配时运行 my_job: name: My Target Job runs-on: ubuntu-latest # 依赖前置任务的结果 needs: check-title # 根据前置任务的输出判断是否执行 if: needs.check-title.outputs.title_matched == 'true' steps: - name: 执行自定义任务 run: echo "任务已启动:Issue标题匹配到目标关键词!"
方法二:使用Shell脚本实现(无需Python环境)
1. 准备目标标题文件
同样创建target-titles.txt文件,每行一个目标关键词:
Target Title1 Target Title2 Target Title3
2. 编写Shell判断脚本
创建check_title.sh脚本:
#!/bin/bash # 接收传入的Issue标题参数 ISSUE_TITLE="$1" MATCHED="false" # 逐行读取目标关键词并匹配 while read -r TARGET; do if [[ -n "$TARGET" && "$ISSUE_TITLE" == *"$TARGET"* ]]; then MATCHED="true" break fi done < target-titles.txt # 输出匹配结果 echo "::set-output name=title_matched::$MATCHED"
3. 编写GitHub Actions工作流
创建.github/workflows/issue-trigger-job-shell.yml文件:
name: Trigger Job on Matched Issue Title (Shell) on: issues: types: [opened] jobs: check-title: runs-on: ubuntu-latest outputs: title_matched: ${{ steps.check.outputs.title_matched }} steps: - name: 拉取代码仓库 uses: actions/checkout@v4 - name: 赋予脚本执行权限 run: chmod +x check_title.sh - name: 检查标题匹配情况 id: check run: ./check_title.sh "${{ github.event.issue.title }}" my_job: name: My Target Job runs-on: ubuntu-latest needs: check-title if: needs.check-title.outputs.title_matched == 'true' steps: - name: 执行自定义任务 run: echo "任务已启动:Issue标题匹配到目标关键词!"
关键说明
- 两种方式都通过前置任务完成匹配判断,将结果通过GitHub Actions的输出机制传递给目标任务,避免了冗长的
contains串联写法。 - 目标关键词列表只需维护对应的文件即可,无需修改工作流代码,可读性和可维护性更强。
内容的提问来源于stack exchange,提问作者yoon
相关产品推荐
相关产品推荐

