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的变量设置机制,将凭证内容设置为全局作业变量,让后续步骤可以继承:
- 第一步(登录):读取凭证并设置为Pipeline变量
# 读取本地存储的凭证内容 CREDENTIAL_CONTENT=$(cat $(Agent.TempDirectory)/[OUR-EXPORTED-LOGIN]) # 将内容设置为Pipeline变量,后续步骤自动注入环境 echo "##vso[task.setvariable variable=SNAPCRAFT_STORE_CREDENTIALS]$CREDENTIAL_CONTENT"
- 第二步(发布):直接执行发布命令,Pipeline会自动将变量注入当前步骤的环境中
snapcraft release [SNAPNAME] "$(Revision)" "candidate"
- 第三步(登出):清除Pipeline变量
# 清空变量内容并标记为保密(可选) echo "##vso[task.setvariable variable=SNAPCRAFT_STORE_CREDENTIALS;isSecret=true;]"
内容的提问来源于stack exchange,提问作者user22669655
相关产品推荐
相关产品推荐

