当前位置: 首页 > 知识库问答 >
问题:

如何在gitlab CI管道中推动回购?

司徒志
2023-03-14

在我的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。电子邮件“cipipeline@dhgitlab.dunnhumby.co.uk“
$git config user.name”CI Pipeline“
$cd/group/project
$mv public/graph.png.
$git add graph.png
$git commit-m”提交图形。png[ci skip]“
[distached HEAD 22a50d1]提交graph.png[ci skip]
1个文件更改,0个插入(),0个删除(-)
创建模式100644 graph.png
$echo$ci_COMMIT_REF_NAME
jamiet/my branch
$git push origin HEAD:$ci_COMMIT_REF_NAME
致命:无法访问”https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@例如。com/group/project/project。git/':服务器证书验证失败。CAfile:/etc/ssl/certs/ca证书。crt文件:无

我不确定自己做错了什么,对SSL了解不够,无法理解这个错误。有人能提供建议吗?

顺便说一下,我们自己也在主持gitlab。

共有3个答案

公羊俊德
2023-03-14

您可以将CI_SERVER_CLS_CA_FILE添加到sslCAInfogit 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

@Sjoerd在评论中导出GIT_SSL_CAINFO的方法要短一些。

export GIT_SSL_CAINFO=$CI_SERVER_TLS_CA_FILE

Gitlab创建CI_服务器\u TLS_CA_文件,并将git配置为使用它最初克隆存储库。由于某些原因,此配置稍后不再可用。

钮巴英
2023-03-14

仍然需要一些手指俯卧撑,但这里有一种不那么脆弱的从它自己的CI推送到存储库的方法,我在日常工作中使用。它直接从分离的头部推送到掌握:

  1. 生成一个RSA密钥并将其添加为具有写访问权限的Project Deploy Key(公共部分)。
  2. 将私有部分从项目设置中作为SSH_PUSH_KEY放入CI/CD变量中。确保将其设置为受保护。
  3. 添加一个CI_KNOWN_HOSTS变量,带有GitLab实例的SSH指纹(还记得ssh问你第一次尝试连接主机的情况吗?那。)。

使用ssh-keyscan

my.gitlab.instance.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArlUMUmNj59PpoLyy4EsKbwhPUfXxuAzFN7dMKDXVvKMmN8344HqQV1tRx6fcmH+0BXK1JAP4f10V0VnYti3e1c5f9dhpl8pIqKLMJgdGDq3MLqjihL3bp5xm8nDsPTm5FoEPPYK1I3M2wr18pBB19evz64NHrK5R/HO5LyTrybVasFumt8cZoH6crnCFgfQWV1mHAG3j41Q0z4yxu6g8zBWESZcVVn90HxQH7+LDHx11122233344491MQGl5fZcKqVWsWQVEssaK87iBsWUxvsuoeVUrj4YRcmbi6F4+ZZZZZZZwwww3ZboWsSWxTk5ESR6WWHccBm8GQflXyY3ZQ==
"This CI job pushes to its own repo":
    stage: my_push_stage
    resource_group: this_option_comes_handy_when_pushing
    only:
        - triggers
    before_script:
        - mkdir ~/.ssh/
        - echo "${CI_KNOWN_HOSTS}" > ~/.ssh/known_hosts
        - echo "${SSH_PUSH_KEY}" > ~/.ssh/id_rsa
        - chmod 600 ~/.ssh/id_rsa
        - git config user.email "ci@example.com"
        - git config user.name "CI"
        - git remote remove ssh_origin || true  # Local repo state may be cached
        - git remote add ssh_origin "git@$CI_SERVER_HOST:$CI_PROJECT_PATH.git"
    script:
        - touch "xyz"  # Make an edit
        - git add "xyz"
        - git commit -m "My CI commit"
        - git push ssh_origin HEAD:master  # ❗ this pushes to master, 
                                           # use $CI_BUILD_REF_NAME if you want to push to current branch
        - git tag MyCiTag  # If you need to add a tag you can do that too
        - git push --tags ssh_origin

狄玮
2023-03-14

我发现这个GitLab论坛链接很有用,正如用户建议的那样,您需要生成SSH密钥,将其与专门从事此工作的新GitLab用户关联,并将密钥添加到runner。一个小缺点是,您需要在gitlab中使用swap origin作为原始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_REPOSITORY_URL | 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_COMMIT_REF_NAME} || true

仅使用当前版本的GitLab,您就需要更改源变量名称,如下所示:

export CI_PUSH_REPO=`echo $CI_REPOSITORY_URL | perl -pe 's#.*@(.+?(\:\d+)?)/#git@\1:#'`
 类似资料:
  • 问题内容: 我正在使用使用Groovy样式脚本编写的Jenkins脚本化管道,并创建了一个Jenkinsfile来描述管道。我需要使用与git repo name相同的文件夹名称创建工作区,然后在工作区文件夹中签出代码。我的问题是,在执行之前,是否有办法知道git repo名称或git repo url? 问题答案: 这个相对丑陋的代码是我用来获取repoName的代码。关键是存储库的URL存储在

  • 问题内容: 我有很多数据要插入(SET \ INCR)到redis DB,所以我正在寻找通过 node.js* 进行管道 \ 大量插入的操作。 * 我在node.js中找不到任何好的示例/ API,因此任何帮助都将非常有用! 问题答案: 是的,我必须同意缺少示例,但是我设法创建了一个流,在该流上我批量发送了几个插入命令。 您应该为redis流安装模块: 这就是您使用流的方式: 另外,您可以根据需要

  • 问题内容: 在Linux终端中,当一个命令的输出太长而无法在一页中读取时,我可以这样做: 这样我就可以读取cat文件的输出并上下滚动。 如何在IPython中执行此操作? 例如,我尝试了一下,但没有成功: 我最初的问题是通过Shift + Page Up不能看到来自的输出,并且我不想更改滚动缓冲区。 问题答案: 在IPython中,您可以使用标准的寻呼机(通常是)来显示对象。另外,您可以增加终端的

  • 我想把我的形象推广到Docker Hub。这项任务似乎很简单,但我对细节一无所知。 变量的值应该是什么,以及如何构造它?这些说明似乎可以解释,但我不明白。

  • 我想在过滤器返回空数组时显示一条消息,例如“未找到结果” 这是我的ngFor列表,它有一个过滤器 如果没有过滤器,这很容易,但是因为有过滤器,我不知道怎么说过滤器没有返回结果。 这是我的过滤器: 这一切都有效,但我只需要向用户显示,过滤器没有返回结果,而是返回消息,而不是空屏幕。

  • 问题内容: 如何在node.js中创建命名管道? PS:目前,我正在按如下方式创建命名管道。但是我认为这不是最好的方法 问题答案: 看起来,Node核心不支持名称管道-从Ben Noordhuis 11/10/11开始: Windows具有命名管道的概念,但是自您提到以来,我假设您的意思是UNIX FIFO。 我们不支持它们,可能永远也不会(在非阻塞模式下的FIFO可能会死锁事件循环),但是如果您