Hus*_*ain 2 jenkins jenkins-groovy jenkins-pipeline github-actions
是否有任何方法或解决方案可以从 Jenkins 声明性管道调用 GitHub Actions 工作流程?
Jenkinsfile 应包含什么内容来调用所述操作?
您应该能够调用 API 来创建工作流调度事件。请参阅Riku Rouvila
的
“如何使用 HTTP 请求触发 GitHub 操作”
生成 GitHub 令牌:创建启用必要范围的 GitHub 令牌。Settings从您的 GitHub 帐户的> Developer settings> Personal access tokens>创建此令牌Generate new token。
设置您的 GitHub 存储库:您的 GitHub 存储库必须在目录中包含 GitHub Actions 工作流程文件 (.yml或.yaml) .github/workflows。
Jenkins 设置:必须安装 Jenkins 并配置必要的插件(例如“ Pipeline ”)以支持声明式管道。
我将使用try-catch 块添加错误处理机制并捕获 API 请求期间可能发生的 HTTP 错误。
pipeline {
agent any
stages {
stage('Invoke GitHub Actions Workflow') {
steps {
script {
try {
def url = "https://api.github.com/repos/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME/actions/workflows/YOUR_WORKFLOW_FILE_NAME.yml/dispatches"
def response = sh(script: 'curl -X POST -H "Accept: application/vnd.github.v3+json" -H "authorization: Bearer YOUR_GITHUB_TOKEN" -d \'{"ref":"YOUR_BRANCH_NAME"}\' "${url}"', returnStdout: true).trim()
echo "Response: ${response}"
} catch (Exception e) {
echo "Failed to invoke GitHub Actions Workflow: ${e.getMessage()}"
currentBuild.result = 'FAILURE'
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在脚本中:
YOUR_GITHUB_USERNAME、YOUR_REPOSITORY_NAME、YOUR_WORKFLOW_FILE_NAME.yml、YOUR_GITHUB_TOKEN和替换YOUR_BRANCH_NAME为适当的值。YOUR_GITHUB_TOKEN最好将其存储为 Jenkins 机密以确保安全。验证 Jenkins 控制台作业执行后的输出,以确认 GitHub Actions 工作流程的成功调用。并使用 Jenkins 凭证管理来安全地处理您的机密。
我可以通过这种方式触发操作,但我得到的是空响应;我怎样才能得到以这种方式触发的操作的结果?”
获取已触发的 GitHub Actions 工作流的结果涉及一个多步骤过程,因为通过 API 触发工作流调度事件不会直接返回工作流运行的详细信息。
您需要轮询 GitHub API 以了解工作流运行的状态,直到其完成。这将涉及
触发工作流程:如上所示,通过 Jenkins 管道中的curl 命令使用 GitHub API 触发工作流程。
检索工作流程运行 ID:触发工作流程后,您需要检索工作流程运行的 ID 以获取其详细信息。这可以通过查询 GitHub API 以获取存储库的工作流运行列表来完成。您可能需要在此步骤之前引入轻微的延迟,以允许 GitHub 注册新的工作流程运行。
轮询工作流程完成:获得工作流程运行 ID 后,继续定期轮询 GitHub API 以检查工作流程运行的状态,直至其完成。
检索工作流程结果:工作流程运行完成后,使用 GitHub API 获取工作流程运行详细信息,以检索运行的最终结果。
这是一个简化的 Jenkinsfile,演示了上述策略,使用 Jenkins 中的“ Pipeline Utility Steps ”插件来使用该readJSON功能:
pipeline {
agent any
stages {
stage('Invoke GitHub Actions Workflow and Get Result') {
steps {
script {
try {
// Step 1: Trigger the Workflow
def url = "https://api.github.com/repos/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME/actions/workflows/YOUR_WORKFLOW_FILE_NAME.yml/dispatches"
sh(script: 'curl -X POST -H "Accept: application/vnd.github.v3+json" -H "authorization: Bearer YOUR_GITHUB_TOKEN" -d \'{"ref":"YOUR_BRANCH_NAME"}\' "${url}"', returnStdout: true).trim()
// Step 2 & 3: Get Workflow Run ID and Poll for Completion
def workflowRunsUrl = "https://api.github.com/repos/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME/actions/runs"
def workflowRunID
def status = "queued"
// Introduce a delay before polling for workflow run ID
sleep time: 10, unit: 'SECONDS'
while (status == "queued" || status == "in_progress") {
def response = sh(script: "curl -H 'Accept: application/vnd.github.v3+json' -H 'authorization: Bearer YOUR_GITHUB_TOKEN' ${workflowRunsUrl}", returnStdout: true).trim()
def runs = readJSON text: response
workflowRunID = runs.workflow_runs[0].id
status = runs.workflow_runs[0].status
if (status == "queued" || status == "in_progress") {
sleep time: 10, unit: 'SECONDS'
}
}
// Step 4: Retrieve the Workflow Result
def workflowRunDetailUrl = "${workflowRunsUrl}/${workflowRunID}"
def detailResponse = sh(script: "curl -H 'Accept: application/vnd.github.v3+json' -H 'authorization: Bearer YOUR_GITHUB_TOKEN' ${workflowRunDetailUrl}", returnStdout: true).trim()
def workflowRunDetails = readJSON text: detailResponse
echo "Workflow Run Details: ${workflowRunDetails}"
} catch (Exception e) {
echo "Failed to invoke GitHub Actions Workflow or retrieve results: ${e.getMessage()}"
currentBuild.result = 'FAILURE'
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
while循环不断轮询 GitHub API,直到工作流运行状态从“queued”或“in_progress”更改为最终状态。readJSON实用程序用于解析从 GitHub API 返回的 JSON 响应,以提取必要的详细信息,例如工作流运行 ID 和状态。YOUR_GITHUB_USERNAME、YOUR_REPOSITORY_NAME、 、YOUR_WORKFLOW_FILE_NAME.yml、YOUR_GITHUB_TOKEN和替换YOUR_BRANCH_NAME为实际值。| 归档时间: |
|
| 查看次数: |
4691 次 |
| 最近记录: |