GitHub Actions多作业间ServiceNow变更号传递失败求助
修复GitHub Actions跨作业传递ServiceNow变更请求号为空的问题
问题描述
我有一个包含多作业的GitHub Actions工作流:
- 第一个作业
generate-continuous-change调用自定义Action生成ServiceNow变更请求号,并将其设为作业输出变量 - 第二个作业
setup-build-publish-deploy通过needs关联第一个作业,期望读取该变更号并传入Spinnaker部署的deployParameters中
目前能确认ServiceNow工单已成功创建,但第二个作业的Set Up ENVs步骤中输出的SN_RECORD为空,导致Spinnaker无法获取到变更请求号。
现有代码
主工作流代码
name: Build and Deploy to Dev GKE run-name: Build and Deploy to Dev GKE for ${{ github.ref_name }} - ${{ github.event.head_commit.message }} on: workflow_dispatch: inputs: ref_name: description: 'Branch Name' required: false type: choice options: - development - release push: branches: [ "release", "development" ] env: BRANCH: ${{ inputs.ref_name || github.ref_name }} PROJECT_ID: assrt-dev DEPLOYMENT_NAME: assrt-${{inputs.ref_name || github.ref_name }} SLACK_CHANNEL: assort_kims-deployment TLS_CERTIFICATE: 'wildcard-assrt-dev-20250825' SECURITY_POLICY: 'gcp-thd-cloud-armor-policy' WORKLOAD_IDENTITY_PROVIDER: 'projects/761746662140/locations/global/workloadIdentityPools/github-actions/providers/github-provider' SERVICE_ACCOUNT: 'ass@assrt-dev.iam.gserviceaccount.com' NAMESPACE: 'mya-kims' jobs: generate-continuous-change: runs-on: ${{ fromJSON( vars.RUNNER_LABELS ) }} outputs: continuous-change-number: ${{ steps.generate-change.outputs.continuous-change-number }} continuous-change-link: ${{ steps.generate-change.outputs.continuous-change-link }} steps: - name: CR for Continuous Change id: generate-change uses: one-thd/myassrt-workflows/.github/actions/createChangeRequest@master with: cd-model-number: "CD0002503" snow-lifecycle: "QA" chg-description: "Dev Change Request" env: VANTAGE_CLIENT_ID: ${{ secrets.VANTAGE_NP_USERNAME }} VANTAGE_CLIENT_SECRET: ${{ secrets.VANTAGE_NP_PASSWORD }} setup-build-publish-deploy: name: Setup, Build, Publish, and Deploy runs-on: one-thd-onprem-np needs: [ generate-continuous-change ] environment: ${{github.ref_name}} permissions: contents: 'read' id-token: 'write' steps: - name: Checkout uses: actions/checkout@v4 - name: Set Up ENVs run: | echo "SN_RECORD=${{ needs.generate-continuous-change.outputs.continuous-change-number }}" >> $GITHUB_ENV if [[ ${{env.BRANCH}} == development ]]; then echo "SPINNAKER_ENV=dev" >> $GITHUB_ENV; fi if [[ ${{env.BRANCH}} == release ]]; then echo "SPINNAKER_ENV=release" >> $GITHUB_ENV; fi - name: Setup, build & Publish uses: one-thd/myassrt-workflows/.github/actions/setupBuildPublish@master with: jdk-version: '17' distribution: 'temurin' image-name: my-assrt/snapshot/${{env.REPO_NAME}}:${{env.SHORT_SHA}} registry: 'gcr' project-id: ${{env.PROJECT_ID}} workload_identity_provider: ${{env.WORKLOAD_IDENTITY_PROVIDER}} service_account: ${{env.SERVICE_ACCOUNT}} # artifact-instance: docker-static env: ARTIFACTORY_USER: ${{ secrets.ARTIFACTORY_USER }} ARTIFACTORY_TOKEN: ${{ needs.authifactory.outputs.ARTIFACTORY_TOKEN }} - name: Set Manifest & Deploy to Spinnaker uses: one-thd/myassrt-workflows/.github/actions/spinnakerDeployGKE@master with: namespace: ${{ env.BRANCH }} repoName: ${{ env.REPO_NAME }} branchName: ${{ env.BRANCH }} ingressName: ${{ env.DEPLOYMENT_NAME }}-ingress deploymentName: ${{ env.DEPLOYMENT_NAME }} tlsCertificate: ${{ env.TLS_CERTIFICATE }} securityPolicy: ${{ env.SECURITY_POLICY }} imageName: ${{ env.IMAGE }} dnsName: ${{env.DEPLOYMENT_NAME}}.${{ env.PROJECT_ID }}.gcp.homedepot.com triggerUrl: https://api.spinnaker.homedepot.com/webhooks/webhook/${{env.REPO_NAME}}-${{env.SPINNAKER_ENV}} deployParameters: "{\"serviceNow\": \"${{ needs.generate-continuous-change.outputs.continuous-change-number }}\",\"appVersion\": \"${{env.IMAGE }}\", \"namespace\": \"${{env.NAMESPACE}}\"}" env: IMAGE: my-assrt/snapshot/${{env.REPO_NAME}}:${{env.SHORT_SHA}}
自定义createChangeRequest Action代码
name: create a change request in SN inputs: cd-model-number: type: string default: "CD0002366" snow-lifecycle: type: string default: "PR" chg-description: type: string default: "Default change description" outputs: continuous-change-number: description: 'Change Number for Continuous Change' continuous-change-link: description: 'Change Link for Continuous Change' runs: using: 'composite' steps: - name: Create Change Request uses: one-thd/paved-road-actions/paved-road-continuous-change@v1.3.2 with: chg-description: 'Creating CR in Service Now for prod via GH actions'
问题根源
自定义createChangeRequest Action存在两个关键问题:
- 未映射子Action的输出:虽然声明了
continuous-change-number和continuous-change-link输出,但没有将底层调用的paved-road-continuous-changeAction的实际输出赋值给它们,导致上层作业读取到空值。 - 未传递输入参数:主工作流传入的
cd-model-number、snow-lifecycle、chg-description参数没有传递给底层Action,可能导致生成的工单不符合预期。
修复方案
修改createChangeRequest Action的代码,完成输出映射和参数传递:
name: create a change request in SN inputs: cd-model-number: type: string default: "CD0002366" snow-lifecycle: type: string default: "PR" chg-description: type: string default: "Default change description" outputs: continuous-change-number: description: 'Change Number for Continuous Change' # 映射子步骤的输出到当前Action的输出 value: ${{ steps.create-cr.outputs.continuous-change-number }} continuous-change-link: description: 'Change Link for Continuous Change' value: ${{ steps.create-cr.outputs.continuous-change-link }} runs: using: 'composite' steps: - name: Create Change Request # 给子步骤添加ID,用于引用其输出 id: create-cr uses: one-thd/paved-road-actions/paved-road-continuous-change@v1.3.2 with: # 传递当前Action的输入参数到底层Action cd-model-number: ${{ inputs.cd-model-number }} snow-lifecycle: ${{ inputs.snow-lifecycle }} chg-description: ${{ inputs.chg-description }}
验证
修改完成后,重新运行工作流:
generate-continuous-change作业会正确获取到paved-road-continuous-change生成的变更请求号和链接- 第二个作业通过
needs.generate-continuous-change.outputs.continuous-change-number就能读取到有效值,SN_RECORD环境变量和deployParameters中的serviceNow字段都会被正确赋值
内容的提问来源于stack exchange,提问作者gcpdev
相关产品推荐
相关产品推荐

