如何在gitlab CI管道中推送到仓库?

时间:2018-08-06 21:43:19

标签: gitlab gitlab-ci

在我的CI管道中,我正在生成一个工件public/graph.png,该工件可视化了我的代码的某些方面。在以后的步骤中,我想将其从CI管道中提交给仓库。这是.gitlab-ci.yml的相关部分:

commit-graph:
  stage: pages
  script:
    - git config user.email "cipipeline@example.com"
    - git config user.name "CI Pipeline"
    - cd /group/project
    - mv public/graph.png .
    - git add graph.png
    - git commit -m "committing graph.png [ci skip]"
    - echo $CI_COMMIT_REF_NAME
    - git push origin HEAD:$CI_COMMIT_REF_NAME

当管道在gitlab中运行时,失败并显示:

  

$ git config user.email“ cipipeline@dhgitlab.dunnhumby.co.uk”
  $ git config user.name“ CI管道”
  $ cd / group / project
  $ mv public / graph.png。
  $ git add graph.png
  $ git commit -m“ committing graph.png [ci skip]”
  [分离的HEAD 22a50d1]提交graph.png [ci跳过]
   已更改1个文件,0个插入(+),0个删除(-)
   创建模式100644 graph.png
  $ echo $ CI_COMMIT_REF_NAME
  杰米/我的分支
  $ git push origin HEAD:$ CI_COMMIT_REF_NAME
  严重:无法访问“ https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@example.com/group/project/project.git/”:服务器证书验证失败。 CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile:无

不确定我在做什么错,并且对SSL的了解不足以理解该错误。有人可以建议吗?

我们正在自己托管gitlab。

5 个答案:

答案 0 :(得分:3)

解决了。在推送之前发出git config --global http.sslverify "false"可解决该特定问题(它暴露了另一个问题,但这是另一个线程:))

答案 1 :(得分:1)

我发现此GitLab forum链接很有帮助 根据用户的建议,您需要生成SSH密钥,将其与专门用于此工作的新GitLab用户关联,并将密钥添加到运行器。小缺点是您需要在gitlab中将交换源用于原始ssh源(而不是在作业中使用的沙盒源),这会导致提交者更改为提到的新帐户,而不是触发管道的人。 来自链接的来源:

# for your information
whoami
printenv

# we need to extract the ssh/git URL as the runner uses a tokenized URL
export CI_PUSH_REPO=`echo $CI_BUILD_REPO | perl -pe 's#.*@(.+?(\:\d+)?)/#git@\1:#'`

# runner runs on a detached HEAD, create a temporary local branch for editing
git checkout -b ci_processing
git config --global user.name "My Runner"
git config --global user.email "runner@gitlab.example.org"
git remote set-url --push origin "${CI_PUSH_REPO}"

# make your changes
touch test.txt

# push changes
# always return true so that the build does not fail if there are no changes
git push origin ci_processing:${CI_BUILD_REF_NAME} || true

仅在当前版本的GitLab上,您需要如下更改源变量名称:

export CI_PUSH_REPO=`echo $CI_REPOSITORY_URL | perl -pe 's#.*@(.+?(\:\d+)?)/#git@\1:#'`

答案 2 :(得分:0)

我可以根据tsr的答案https://stackoverflow.com/a/57800614/5269825从Gitlab-CI与选定的用户进行较小的更改:

# set remote URL to https://oauth2:<AccessToken>@server.com/project.git
CI_PUSH_REPO=`echo "$CI_REPOSITORY_URL $ACCESS_TOKEN_PARAM" | sed 's/^.*\(@.*\)\s\(.*\)/https:\/\/oauth2:\2\1/g'`
git config http.sslverify false
git remote set-url --push origin "${CI_PUSH_REPO}"
git config user.name "Token Owner"
git config user.email "tokenowner@email.com"

# runner runs on a detached HEAD, create a temporary local branch for editing
git checkout -b ci_processing
# make your changes

# push changes
# always return true so that the build does not fail if there are no changes
git push origin ci_processing:${CI_BUILD_REF_NAME} || true

ACCESS_TOKEN_PARAM必须在项目的CI / CD变量配置中进行配置。

使用Oauth2和访问令牌的想法来自https://stackoverflow.com/a/52074198/5269825https://stackoverflow.com/a/52154378/5269825

此外,推动更改可以触发新的渠道!

答案 3 :(得分:0)

在我的情况下,deploy keys选项与Gitlab Shell Runner是最佳的(与个人令牌或CI令牌相比-仅支持基本身份验证)。万一有人在努力从Gitlab CI推送到,则可以通过与Gitlab服务器共享运行程序的公钥来完成

答案 4 :(得分:0)

您可以将CI_SERVER_CLS_CA_FILE添加到sslCAInfo git config中。

checkout alchemy:
    stage: prepare
    script:
        - git config --global "http.${CI_SERVER_URL}.sslCAInfo" "$CI_SERVER_TLS_CA_FILE"
        - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/sparklemuffin/alchemy.git

在从管道克隆其他存储库时,我遇到了同样的问题。服务器证书验证失败,失败。我不明白为什么会这样,Gitlab本身克隆了存储库而没有任何问题。因此,我设置了CI_DEBUG_TRACE: "true"并发现,Gitlab创建了此文件,将git配置为使用它来最初克隆存储库。由于某种原因,此配置以后将不再可用。 CI_SERVER_TLS_CA_FILE仍然存在。