You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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存在两个关键问题:

  1. 未映射子Action的输出:虽然声明了continuous-change-number和continuous-change-link输出,但没有将底层调用的paved-road-continuous-change Action的实际输出赋值给它们,导致上层作业读取到空值。
  2. 未传递输入参数:主工作流传入的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 }}

验证

修改完成后,重新运行工作流:

  1. generate-continuous-change作业会正确获取到paved-road-continuous-change生成的变更请求号和链接
  2. 第二个作业通过needs.generate-continuous-change.outputs.continuous-change-number就能读取到有效值,SN_RECORD环境变量和deployParameters中的serviceNow字段都会被正确赋值

内容的提问来源于stack exchange,提问作者gcpdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:57:32