使用HTTPS从gitlab CI作业克隆私有仓库,而无需将我的凭据暴露给CLI

时间:2019-07-22 09:48:08

标签: git gitlab gitlab-ci gitlab-ci-runner

我有一个gitlab ci作业,可以为我做一些工作,但这取决于另一个回购,因此我需要在此工作中克隆另一个回购。我无法使用https克隆,因为gitlab会询问我用户名和密码,并且gitlab ci是非交互式的。
那么如何在gitlab ci作业中使用https克隆gitlab仓库。
提前谢谢。

5 个答案:

答案 0 :(得分:1)

如果您正在运行gitlab版本8.12或更高版本,则权限模型已重新设计。 CI环境变量CI_JOB_TOKEN与这个新的权限模型一起出现。高级版GitLab使用此环境变量作为触发器,但是您可以使用它来克隆存储库。

dummy_stage:
  script:
    - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.instance/group/project.git

答案 1 :(得分:0)

您应该使用SSH和只读deploy key克隆该存储库,可能将令牌存储在masked variable中。

答案 2 :(得分:0)

我找到了一种验证克隆身份的方法。首先,我导航至gitlab帐户设置,然后导航至访问令牌标签。enter image description here 然后使用任何名称创建新的访问令牌,您可以将到期日期留空(但为了安全起见,我已经设置了到期日期),然后选择所需的正确范围。就我而言,我已阅读回购范围。

然后我使用生成的访问令牌通过https克隆我的存储库,如下所示

https://oauth2:YOUR_ACCESS_TOKEN@gitlab.com/PATH/TO/YOUR/REPO.git

要防止CLI公开您的访问令牌,您必须在gitlab的CI变量列表中添加已屏蔽的访问令牌。因此,执行克隆时,将不会显示您的访问令牌。 然后按以下方式访问它

https://oauth2:$ACCESS_TOKEN@gitlab.com/PATH/TO/YOUR/REPO.git

答案 3 :(得分:0)

搜索Google和stackoverflow一段时间后,我没有找到问题的答案,所以我想在这里分享我的解决方案。

上下文

我有一个回购,其中包含一些克隆外部存储库的脚本。出于某些原因,使用这些存储库进行身份验证的唯一方法是HTTPS。

在GitLab CI作业期间,由于git提示输入用户名和密码,因此git克隆失败。

客观

我希望git使用我的凭据“登录”一次,并停止在每个git clone语句(如Docker does)上提示输入凭据。

解决方案

假设我在名为SERVICE_USERSERVICE_PASS的GitLab CI变量中设置了一些服务凭据。我将在需要执行git操作的每项作业的开头添加以下步骤。

Windows

git config --global credential.helper C:/git_creds.bat
Set-Content -Value "@echo off" -Path C:/git_creds.bat
Add-Content -Value "echo username=$SERVICE_USER" -Path C:/git_creds.bat
Add-Content -Value "echo password=$SERVICE_PASS" -Path C:/git_creds.bat

# to test it
git clone https://my-scm-provider.com/project.git

Linux

git config --global credential.helper "/bin/bash /git_creds.sh"
echo '#!/bin/bash' > /git_creds.sh
echo "sleep 1" >> /git_creds.sh
echo "echo username=$SERVICE_USER" >> /git_creds.sh
echo "echo password=$SERVICE_PASS" >> /git_creds.sh

# to test it
git clone https://my-scm-provider.com/project.git

我添加了sleep 1,因为我遇到了失败的克隆并读取了this answer

当心

如果未在Docker容器中执行CI作业,请执行此操作。

凭据在CI环境根目录的git_creds中公开。我可以负担得起这样的操作,因为我的配置项是在容器中执行的。由于容器数据不是持久性数据,因此git_creds文件在每次作业后都会被删除。关于密码,我使用GitLab掩码变量将其从日志中隐藏。

关键字:https git clone无头非交互式凭据帮助器

答案 4 :(得分:0)

我在 / 上遇到文件权限错误,所以我将其更改为 ~/,它似乎工作得很好。不错!