如何在Jenkins任务完成后触发GitHub Action(非Jenkins脚本触发)
实现Jenkins任务完成后触发GitHub Action的两种方案
方案一:通过Jenkins Post-build步骤触发GitHub Repository Dispatch(无需修改核心构建脚本)
如果不想改动Jenkins任务里的构建逻辑脚本(比如Jenkinsfile),可以通过Jenkins UI配置Post-build操作,发送请求触发GitHub的Repository Dispatch事件,从而启动指定的GitHub Action。
操作步骤:
- 生成GitHub个人访问令牌(PAT):在GitHub账号设置里创建一个带
repo权限的令牌,用于调用GitHub API。 - 配置Jenkins Post-build操作:
进入「Example Jenkins Job」的配置页面,找到「Post-build Actions」,添加「Execute shell」(Linux/macOS)或「Execute Windows batch command」(Windows):
替换curl -X POST \ -H "Authorization: token YOUR_GITHUB_PAT" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/你的GitHub用户名/目标仓库名/dispatches \ -d '{"event_type": "jenkins_job_completed", "client_payload": {"job_name": "Example Jenkins Job", "build_number": "'$BUILD_NUMBER'"}}'YOUR_GITHUB_PAT、你的GitHub用户名、目标仓库名为实际值,BUILD_NUMBER是Jenkins内置环境变量,会自动填充当前构建编号。 - 编写GitHub Action触发规则:
在目标GitHub仓库的.github/workflows/triggered-by-jenkins.yml中添加配置:name: Triggered by Jenkins Job Completion on: repository_dispatch: types: [jenkins_job_completed] jobs: post-jenkins-task: runs-on: ubuntu-latest steps: - name: Print Jenkins job info run: | echo "触发来源:Jenkins任务 ${{ github.event.client_payload.job_name }}" echo "Jenkins构建编号:${{ github.event.client_payload.build_number }}" - name: 执行后续任务 run: | # 在这里添加你需要执行的操作,比如部署、自动化测试等
方案二:通过GitHub Action轮询Jenkins构建状态(完全不修改Jenkins配置)
如果完全不想改动Jenkins的任何配置,可以用GitHub Action定时轮询Jenkins的构建状态API,当检测到「Example Jenkins Job」最近一次构建成功完成时,执行后续任务。
操作步骤:
- 配置GitHub Secrets:
在目标GitHub仓库的「Settings」→「Secrets and variables」→「Actions」中添加两个Secrets:JENKINS_URL:你的Jenkins服务器完整地址(比如https://jenkins.yourcompany.com)JENKINS_CREDENTIALS:Jenkins的「用户名:API令牌」(API令牌可在Jenkins个人设置中生成)
- 编写GitHub Action配置:
在.github/workflows/poll-jenkins.yml中添加:
注意:确保Jenkins服务器允许GitHub Actions的IP访问,必要时调整防火墙或反向代理规则。name: Poll Jenkins Job Status on: schedule: # 每5分钟轮询一次,可根据需求调整频率 - cron: '*/5 * * * *' workflow_dispatch: # 允许手动触发调试 jobs: check-and-trigger: runs-on: ubuntu-latest steps: - name: 获取Jenkins最新构建状态 id: get-build-info run: | # 拉取最新构建的状态和时间戳 BUILD_DATA=$(curl -s -u ${{ secrets.JENKINS_CREDENTIALS }} \ ${{ secrets.JENKINS_URL }}/job/Example%20Jenkins%20Job/lastBuild/api/json) BUILD_STATUS=$(echo $BUILD_DATA | jq -r '.result') BUILD_TIMESTAMP=$(echo $BUILD_DATA | jq -r '.timestamp') # 计算当前时间与构建完成时间的差值(分钟) CURRENT_TIMESTAMP=$(date +%s000) TIME_DIFF=$(( (CURRENT_TIMESTAMP - BUILD_TIMESTAMP) / 60000 )) echo "build_status=$BUILD_STATUS" >> $GITHUB_OUTPUT echo "time_diff=$TIME_DIFF" >> $GITHUB_OUTPUT - name: 执行后续任务(当构建成功且完成时间在10分钟内) if: steps.get-build-info.outputs.build_status == 'SUCCESS' && steps.get-build-info.outputs.time_diff < 10 run: | echo "Jenkins任务 Example Jenkins Job 已成功完成,开始执行后续操作" # 在这里添加你的任务逻辑,比如部署、发送通知等
内容的提问来源于stack exchange,提问作者Kode_12
相关产品推荐
相关产品推荐

