如何在GitLab CI Job中向所属仓库推送标签,无需传递个人凭证?
解决方案
方案1:使用GitLab内置CI_JOB_TOKEN(推荐,同时适配SaaS与私有化部署)
该方案完全依赖GitLab原生能力,不需要额外生成自定义凭证,两种环境适配逻辑完全一致,且临时令牌自动过期,安全性远高于固定凭证。
- 操作步骤:
- 进入对应项目的「设置」→「CI/CD」→「作业令牌访问权限」,开启允许作业令牌对仓库的写入权限(GitLab 16.x及以上版本默认关闭写入权限,需手动开启)
- 直接修改CI配置中gradle命令的认证参数即可,
CI_JOB_TOKEN是GitLab CI自动注入的内置变量,无需手动创建:
.release-template: stage: release image: adoptopenjdk:11-jdk-hotspot dependencies: - deliver script: - | ./gradlew reckonTagPush -Preckon.scope=$scope -Preckon.stage=$stage \ -Dorg.ajoberstar.grgit.auth.username=gitlab-ci-token \ -Dorg.ajoberstar.grgit.auth.password=$CI_JOB_TOKEN artifacts: paths: - build/ #only: # - master when: manual #ONLY MANUAL RELEASES, ONLY FROM MASTER release-major: extends: .release-template variables: scope: major stage: final release-minor: extends: .release-template variables: scope: minor stage: final release-patch: extends: .release-template variables: scope: patch stage: final
方案2:使用带写入权限的Deploy Key(兼容低版本私有化部署GitLab)
如果你的私有化部署GitLab版本较低,不支持CI_JOB_TOKEN写入仓库,可以使用该方案:
- 操作步骤:
- 本地生成SSH密钥对,运行命令
ssh-keygen -t ed25519 -C "gitlab-reckon-deploy-key",全程不需要设置密码 - 进入项目「设置」→「仓库」→「部署密钥」,点击「添加密钥」,把生成的公钥(.pub文件内容)粘贴进去,务必勾选「授予写入权限」选项
- 进入项目「设置」→「CI/CD」→「变量」,新增变量:
- 变量名:
GRGIT_SSH_KEY - 变量值:粘贴生成的私钥内容
- 勾选「掩码变量」、「保护变量」(可选,仅保护分支可用)后保存
- 变量名:
- 修改CI配置的script部分,在执行gradle命令前先配置SSH密钥,grgit会自动识别SSH认证,不需要再传用户名密码参数:
- 本地生成SSH密钥对,运行命令
.release-template: stage: release image: adoptopenjdk:11-jdk-hotspot dependencies: - deliver script: - mkdir -p ~/.ssh && echo "$GRGIT_SSH_KEY" > ~/.ssh/id_ed25519 && chmod 600 ~/.ssh/id_ed25519 - ssh-keyscan $CI_SERVER_HOST >> ~/.ssh/known_hosts - ./gradlew reckonTagPush -Preckon.scope=$scope -Preckon.stage=$stage artifacts: paths: - build/ #only: # - master when: manual #ONLY MANUAL RELEASES, ONLY FROM MASTER # 下游作业配置与原有逻辑一致,无需修改
内容的提问来源于stack exchange,提问作者Martin Ahrer
相关产品推荐
相关产品推荐

