GitLab CI如何将一个阶段解密的密钥文件正确传递到后续流水线阶段
问题根源
你当前decryption阶段的artifacts配置使用了untracked: true,但你的公私钥是已经提交到Git仓库的已跟踪文件,untracked参数只会收集不在Git跟踪列表内的文件,因此解密后的密钥文件不会被作为制品传递到下一个阶段,build阶段拉取到的仍是仓库里原始的加密版本。
修复方案
1. 调整decryption阶段的artifacts配置
显式指定要传递的解密后文件路径,不要仅依赖untracked参数,配置参考如下:
decryption: stage: decryption allow_failure: false before_script: - mkdir -p ~/.ssh - eval $(ssh-agent -s) - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' script: - chmod 660 ./keys/vault_password.txt - echo $ANSIBLE_VAULT_PASSWORD > ./keys/vault_password.txt - chmod 660 ./keys/private.key - chmod 660 ./keys/public.key - ansible-vault decrypt --vault-password-file ./keys/vault_password.txt ./keys/private.key - ansible-vault decrypt --vault-password-file ./keys/vault_password.txt ./keys/public.key # 调试完成后请删除以下打印明文密钥的代码,避免泄露 - echo "$(cat ./keys/private.key)" - echo "$(cat ./keys/public.key)" artifacts: # 显式指定要传递的解密后文件路径 paths: - ./keys/private.key - ./keys/public.key # 密钥类制品设置短过期时间,降低泄露风险 expire_in: 1 hour
2. 适配后续阶段的密钥传递需求
如果需要把密钥从build阶段继续传递到deploy阶段,给build阶段的artifacts也加上密钥路径配置即可:
build: stage: build allow_failure: false dependencies: - decryption script: - rm -rf vendor/drupal/coder - composer install - ./vendor/bin/robo ci:build - ls -la vendor/drupal/coder # 调试完成后请删除以下打印明文密钥的代码 - echo "$(cat ./keys/private.key)" - echo "$(cat ./keys/public.key)" artifacts: name: "mycompany_build_{$CI_COMMIT_SHA}" expire_in: '1 week' paths: - ./build # 新增密钥路径,传递到后续deploy阶段 - ./keys/private.key - ./keys/public.key
如果deploy阶段不需要依赖build的其他制品,也可以直接给deploy阶段设置dependencies: [decryption],直接从decryption阶段拉取密钥,不需要经过build阶段中转。
额外安全建议
- 调试完成后务必删除所有打印明文密钥的代码,避免密钥泄露到流水线日志
- 优先使用GitLab内置的CI/CD加密变量存储敏感信息,尽量不要把加密后的密钥提交到代码仓库,进一步降低风险
内容的提问来源于stack exchange,提问作者Dynamdilshan
相关产品推荐
相关产品推荐

