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

Azure DevOps构建号变量更新与fastlane读取问题求助

解决方案:Azure DevOps 持久化构建号 + Fastlane 变量读取

一、用 counter 函数配置流水线级持久化构建号

在 azure-pipelines.yml 中直接定义基于counter的构建号变量,Azure DevOps会自动后台存储计数器值,每次流水线触发时递增:

variables:
  # 定义唯一计数器标识,初始值1,自动持久化递增
  buildNumber: $[counter('app-build-counter', 1)]
  # 可选:将流水线运行编号设为构建号,便于识别
  name: 'v$(buildNumber)'

二、让 Fastlane 读取构建号变量

Fastlane无法直接读取Azure DevOps流水线变量,需通过环境变量或命令行参数传递:

方式1:环境变量传递

在调用Fastlane的任务中,把buildNumber映射为环境变量:

- task: Bash@3
  displayName: 'Run Fastlane'
  env:
    BUILD_NUMBER: $(buildNumber)
  inputs:
    targetType: 'inline'
    script: |
      bundle exec fastlane [你的lane名称]

在Fastfile中读取环境变量:

lane :upload_to_store do
  build_number = ENV['BUILD_NUMBER']
  # 示例:用构建号配置打包和上传
  gradle(task: 'assembleRelease', build_number: build_number)
  upload_to_play_store(track: 'production', version_code: build_number)
end

方式2:命令行参数传递

调用Fastlane时直接传入构建号参数:

- task: Bash@3
  displayName: 'Run Fastlane'
  inputs:
    targetType: 'inline'
    script: |
      bundle exec fastlane [你的lane名称] build_number:$(buildNumber)

在Fastfile中接收参数:

lane :upload_to_store do |options|
  build_number = options[:build_number]
  # 后续打包上传逻辑同上
end

三、仅在推送成功后递增构建号

默认counter会在流水线启动时递增,若需仅在推送apk/ipa成功后更新,可改用变量组存储构建号,通过API手动更新:

  1. 创建变量组:在Azure DevOps门户「管道 > 库 > 变量组」中,新建变量组(如AppBuildVariables),添加BuildNumber变量,初始值设为1。
  2. 引用变量组:在azure-pipelines.yml中引入变量组:
    variables:
      - group: AppBuildVariables
    
  3. 推送成功后更新变量值:添加PowerShell任务调用Azure DevOps API更新变量组,需给流水线服务账号分配变量组编辑权限:
    - task: PowerShell@2
      displayName: 'Update Build Number'
      condition: succeeded()
      inputs:
        targetType: 'inline'
        script: |
          $orgUrl = "$(System.CollectionUri)"
          $projectName = "$(System.TeamProject)"
          $variableGroupName = "AppBuildVariables"
          $variableName = "BuildNumber"
          $newBuildNumber = [int]$(BuildNumber) + 1
    
          # 获取变量组ID
          $groupsUrl = "$orgUrl$projectName/_apis/distributedtask/variablegroups?api-version=7.1-preview.2&groupName=$variableGroupName"
          $group = Invoke-RestMethod -Uri $groupsUrl -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method Get
          $groupId = $group.value[0].id
    
          # 更新变量值
          $updateUrl = "$orgUrl$projectName/_apis/distributedtask/variablegroups/$groupId?api-version=7.1-preview.2"
          $body = @{
              variables = @{
                  $variableName = @{
                      value = $newBuildNumber.ToString()
                  }
              }
          } | ConvertTo-Json -Depth 10
          Invoke-RestMethod -Uri $updateUrl -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method Put -Body $body -ContentType "application/json"
    
  4. 传递更新后的构建号给Fastlane:同前文环境变量/命令行参数方式,使用$(BuildNumber)即可。

四、解决「本地变量更新但流水线变量未同步」问题

之前的脚本仅修改了当前任务的本地变量,未更新Azure DevOps服务器端存储的变量(如变量组或流水线级变量)。要实现持久化更新,必须通过API修改服务器端的变量存储,而非仅在本地任务中设置临时变量。


内容的提问来源于stack exchange,提问作者Oleg G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:55:17