首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gitlab CI/CD不能从.gitlab-ci.yml推送

Gitlab CI/CD不能从.gitlab-ci.yml推送
EN

Stack Overflow用户
提问于 2020-12-10 12:20:41
回答 2查看 8K关注 0票数 12

我正在用.gitlab-ci.yml编写GitLab CI/CD管道脚本,我想检查一个特定的文件是否在另一个回购中更改,如果是,我想复制该文件,提交并推送到当前的回购。一切都正常,直到我到达‘推’部分。

我试过几种方法来修复它:

代码语言:javascript
复制
stages:
    - build

build:
  stage: build
  script:
    - echo "Building"
    - git checkout -b try
    - git remote add -f b https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.{otherRepo}.git
    - git remote update
    - CHANGED=$(git diff try:mobile_map.conf b/master:mobile_map.conf)
    - if [ -n "${CHANGED}" ]; then
        echo 'changed';
        FILE=$(git show b/master:mobile_map.conf > mobile_map.conf);
        git add mobile_map.conf;
        git commit -m "updating conf file";
        git push;
      else
        echo 'not changed';
      fi
    - git remote rm b

对于这段代码,我得到:

代码语言:javascript
复制
fatal: unable to access 'https://gitlab-ci-token:[MASKED]@gitlab.{curr_repo}.git/': The requested URL returned error: 403

此外,我还试图在开头添加这一行:

代码语言:javascript
复制
git remote set-url origin 'https://{MY_USER_NAME}:"\"${PASSWORD}\""@gitlab.{curr_repo}.git'

我得到了一条错误信息:

代码语言:javascript
复制
fatal: Authentication failed for 'https://{MY_USER_NAME}:"\"${PASSWORD}\""@{curr_repo}.git/'

我还补充说:

代码语言:javascript
复制
 - git config --global user.name {MY_USER_NAME}
 - git config --global user.email {MY_EMAIL}

请帮帮我,谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-13 17:22:39

作业令牌只具有对存储库的读取权限。

为每个作业生成唯一的作业令牌,并为创建该作业的用户提供用户通常可以访问的所有项目的读取访问权限。唯一的作业令牌没有任何写权限,但是有一个添加支持的建议。

您不能使用deploy,因为它们不能对存储库(可能的令牌)进行写访问。您可以使用具有读写访问存储库的项目-访问-令牌

您可以使用项目访问令牌:

  • 如果您有高级许可层或更高级别,则在GitLab SaaS上。试用许可证不能使用项目访问令牌。
  • 在GitLab的自管理实例上,使用任何许可层。如果你有自由层:..。

然后,您可以将您的项目访问令牌用作url中的环境变量。

代码语言:javascript
复制
git push "https://gitlab-ci-token:$PROJECT_ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git"

至少我们在输油管道里就是这么用的。我希望这能进一步帮助你。

票数 18
EN

Stack Overflow用户

发布于 2021-11-28 21:56:47

简单GitLab CI阶段的完整示例,提交回其自己的回购

代码语言:javascript
复制
ci_section_name:
  # N.B. This stage produces an extra commit to the repo!
  stage: stage_name
  script:
  - apt-get update && apt-get install -y git
  - echo "hello" >> file_to_be_modified.txt  # your real job may do smth else
  after_script:
  - git config user.name "Name On Your Choice"
  - git config user.email "email_on_your_choice@$CI_SERVER_HOST"
  - git pull "https://project_access_token_name:$PROJECT_VARIABLE_WITH_ACCESS_TOKEN_VALUE@$CI_SERVER_HOST/$CI_PROJECT_PATH.git" $CI_COMMIT_BRANCH --rebase --autostash
  - git commit -a -m "Message on your choice"
  - git push "https://project_access_token_name:$PROJECT_VARIABLE_WITH_ACCESS_TOKEN_VALUE@$CI_SERVER_HOST/$CI_PROJECT_PATH.git" HEAD:$CI_COMMIT_BRANCH

我想在以下几个重要方面谈一谈:

  • file_to_be_modified.txt -示例中的任何修改文件都应该已经存在于repo中,如果您需要添加smth,则至少需要包含git add命令。
  • project_access_token_name -是已使用的项目访问令牌的名称,而不是令牌值本身(参见下面的屏幕截图);如果有必要,您应该为您的GitLab项目手工创建它
  • PROJECT_VARIABLE_WITH_ACCESS_TOKEN_VALUE -是项目变量的名称(请参见下面的屏幕快照),您应该为您的GitLab项目手工创建这个变量,并使用所选的项目访问令牌的值填充它;顺便说一句,您可以将令牌的文字值添加到阶段代码中,但出于安全考虑,这可能是不好的
  • -rebase-自动存储-注意,自动保存您的更改而不是简单地试图推送它们将有助于您保证在发生冲突时进行推送(即使我们的新的GitLab阶段在其启动之间可能发生冲突),但是文件将留下冲突跟踪而不是正确的内容;因为很难自动解决冲突,因此应该使用另一种工具来控制这种情况(例如,进一步构建冲突状态就会失败)。
  • 这个简单的例子将导致无限的提交流,可能实际阶段应该包含一些only条件,等等。

截图

GitLab项目访问令牌页

GitLab项目CI/CD设置菜单,在哪里查找变量设置

添加项目变量弹出。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65234416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档