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

Azure经典Pipeline步骤中环境变量丢失致Snapcraft发布失败

Azure经典Pipeline中Snapcraft跨步骤丢失SNAPCRAFT_STORE_CREDENTIALS环境变量的解决办法

问题现象

  • 在Azure经典Pipeline中将Snapcraft登录、发布、登出拆分为三个独立步骤时,发布步骤执行失败,报错提示找不到密钥环或SNAPCRAFT_STORE_CREDENTIALS环境变量未正确导出
  • 具体报错内容:
Starting Snapcraft 7.5.2
craft-store error: No keyring found to store or retrieve credentials from.
Ensure the keyring is working or SNAPCRAFT_STORE_CREDENTIALS is correctly exported into the environment
For more information, check out: https://snapcraft.io/docs/snapcraft-authentication
  • 将发布命令合并到登录步骤中可正常执行,说明跨步骤时SNAPCRAFT_STORE_CREDENTIALS环境变量被意外清除

原因分析

Azure经典Pipeline的每个独立步骤默认运行在单独的shell进程里,用export命令设置的环境变量仅对当前shell进程有效,无法传递到后续步骤的进程中。即便在同一个作业内,只要步骤是独立的shell实例,环境变量就不会自动继承。

解决办法

方法1:合并命令到同一步骤

把登录、发布、登出的命令放在同一个脚本步骤中,确保所有操作在同一个shell环境下执行,环境变量自然会生效:

# 导入凭证并设置环境变量
export SNAPCRAFT_STORE_CREDENTIALS=$(cat $(Agent.TempDirectory)/[OUR-EXPORTED-LOGIN])
# 执行发布操作
snapcraft release [SNAPNAME] "$(Revision)" "candidate"
# 清除环境变量
unset SNAPCRAFT_STORE_CREDENTIALS

方法2:使用Pipeline变量传递凭证

通过Azure Pipeline的变量设置机制,将凭证内容设置为全局作业变量,让后续步骤可以继承:

  1. 第一步(登录):读取凭证并设置为Pipeline变量
# 读取本地存储的凭证内容
CREDENTIAL_CONTENT=$(cat $(Agent.TempDirectory)/[OUR-EXPORTED-LOGIN])
# 将内容设置为Pipeline变量,后续步骤自动注入环境
echo "##vso[task.setvariable variable=SNAPCRAFT_STORE_CREDENTIALS]$CREDENTIAL_CONTENT"
  1. 第二步(发布):直接执行发布命令,Pipeline会自动将变量注入当前步骤的环境中
snapcraft release [SNAPNAME] "$(Revision)" "candidate"
  1. 第三步(登出):清除Pipeline变量
# 清空变量内容并标记为保密(可选)
echo "##vso[task.setvariable variable=SNAPCRAFT_STORE_CREDENTIALS;isSecret=true;]"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:07:46