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

如何在GitHub Enterprise Releases发布Azure DevOps构件?脚本报错求助

解决Azure DevOps流水线构件发布到GitHub Enterprise Releases的问题

问题分析

你遇到的Bash脚本退出码3,通常由以下原因导致:

  • Azure DevOps代理环境缺少jq工具(默认Ubuntu代理未预装)
  • GitHub Enterprise API地址错误(未使用标准/api/v3前缀)
  • 构件文件路径无效,找不到目标文件
  • GitHub PAT权限不足(缺少repo类权限)
  • 目标tag已存在,导致创建Release请求失败
  • 脚本未捕获curl请求错误,后续步骤使用无效的上传URL

修正后的可行脚本

以下脚本添加了错误处理、环境依赖安装、API路径修正,适配GitHub Enterprise:

- task: Bash@3
  inputs:
    targetType: 'inline'
    script: |
      # 安装jq工具(解决Azure DevOps代理无jq的问题)
      sudo apt-get update && sudo apt-get install -y jq

      # 配置核心变量
      GHE_DOMAIN="github.azc.ext.xx.com"
      REPO_OWNER="client"
      REPO_NAME="SysInfo"
      TAG="v1.0.0"
      RELEASE_TITLE="My first release"
      RELEASE_BODY="This is a test release"
      # 替换为流水线构件的实际路径,比如Build.ArtifactStagingDirectory下的文件
      ARTIFACT_PATH="$(Build.ArtifactStagingDirectory)/your-artifact.zip"
      PAT=$(GithubToken)

      # 检查构件文件是否存在
      if [ ! -f "$ARTIFACT_PATH" ]; then
          echo "##[error]构件文件不存在: $ARTIFACT_PATH"
          exit 1
      fi

      # 创建Release(GHE必须使用/api/v3前缀的API地址)
      CREATE_RELEASE_URL="https://${GHE_DOMAIN}/api/v3/repos/${REPO_OWNER}/${REPO_NAME}/releases"
      RESPONSE=$(curl -s -w "%{http_code}" -X POST \
          -H "Authorization: token ${PAT}" \
          -H "Accept: application/vnd.github.v3+json" \
          -d "{\"tag_name\":\"${TAG}\",\"name\":\"${RELEASE_TITLE}\",\"body\":\"${RELEASE_BODY}\",\"draft\":false,\"prerelease\":false}" \
          "${CREATE_RELEASE_URL}")

      # 分离响应内容与HTTP状态码
      HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
      RESPONSE_BODY=$(echo "$RESPONSE" | sed '$d')

      # 校验Release创建结果
      if [ "$HTTP_CODE" -ne 201 ]; then
          echo "##[error]创建Release失败: ${RESPONSE_BODY}"
          exit 1
      fi

      # 提取上传URL并清理占位符
      UPLOAD_URL=$(echo "$RESPONSE_BODY" | jq -r '.upload_url' | sed 's/{?name,label}//')
      ARTIFACT_FILENAME=$(basename "$ARTIFACT_PATH")

      # 上传构件文件
      UPLOAD_RESPONSE=$(curl -s -w "%{http_code}" -X POST \
          -H "Authorization: token ${PAT}" \
          -H "Accept: application/vnd.github.v3+json" \
          -H "Content-Type: application/octet-stream" \
          --data-binary @"${ARTIFACT_PATH}" \
          "${UPLOAD_URL}?name=${ARTIFACT_FILENAME}")

      # 校验上传结果
      UPLOAD_HTTP_CODE=$(echo "$UPLOAD_RESPONSE" | tail -n1)
      if [ "$UPLOAD_HTTP_CODE" -ne 201 ]; then
          echo "##[error]上传构件失败: $(echo "$UPLOAD_RESPONSE" | sed '$d')"
          exit 1
      fi

      echo "##[section]Release创建及构件上传成功"

关键修正说明

  • 新增jq安装步骤,解决环境依赖缺失问题
  • 使用GitHub Enterprise标准API路径(带/api/v3前缀),修复原脚本的URL错误
  • 添加HTTP状态码校验,明确捕获请求失败场景
  • 增加构件文件存在性检查,避免路径错误导致的失败
  • 使用Azure DevOps内置变量$(Build.ArtifactStagingDirectory)定位流水线构件,替换原脚本中不合理的README.md路径

注意事项

  • 确保Azure DevOps中的GithubToken是保密变量,并勾选「允许在脚本中访问」
  • GitHub PAT需具备repo权限(私有仓库)或public_repo权限(公共仓库)
  • 若目标tag已存在,需修改TAG值,或添加target_commitish参数指定提交SHA来复用tag
  • 若使用Windows代理,需改用PowerShell脚本,调整依赖安装(如用choco install jq)和请求命令(如Invoke-RestMethod)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:22:45