Gitlab CI/CD 无法从 .gitlab-ci.yml git push

Noi*_*Noi 6 push gitlab gitlab-ci

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

我尝试了几种方法来修复它:

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
Run Code Online (Sandbox Code Playgroud)

对于此代码,我得到:

fatal: unable to access 'https://gitlab-ci-token:[MASKED]@gitlab.{curr_repo}.git/': The requested URL returned error: 403
Run Code Online (Sandbox Code Playgroud)

我也试图在开头添加这一行:

git remote set-url origin 'https://{MY_USER_NAME}:"\"${PASSWORD}\""@gitlab.{curr_repo}.git'
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

fatal: Authentication failed for 'https://{MY_USER_NAME}:"\"${PASSWORD}\""@{curr_repo}.git/'
Run Code Online (Sandbox Code Playgroud)

我还补充说:

  • git config --global user.name {MY_USER_NAME}
  • git config --global user.email {MY_EMAIL}

请帮助我,谢谢

Jak*_*kow 8

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

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

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

在此处输入图片说明

然后你可以使用你的项目访问令牌作为 url 中的环境变量。

git push "https://gitlab-ci-token:$PROJECT_ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git"
Run Code Online (Sandbox Code Playgroud)

至少这就是我们在管道中使用它的方式。我希望这能帮助你进一步。

  • 作业令牌现在拥有的不仅仅是只读权限:“令牌与导致作业运行的用户具有相同的访问 API 的权限。用户可以通过采取诸如推送提交、触发手动操作等操作来导致作业运行。工作,或成为预定管道的所有者。” - [官方文档](https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html) (3认同)

Nik*_*yev 7

简单的 GitLab CI 阶段的完整示例,提交回自己的存储库

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
Run Code Online (Sandbox Code Playgroud)

我想谈谈几个重要的方面:

  • file_to_be_modified.txt - 示例中的任何修改文件都应该已经存在于存储库中,如果您需要添加新的文件,则需要至少包含git add命令

  • project_access_token_name - 是使用的项目访问令牌的名称,而不是令牌值本身(请参见下面的屏幕截图);如有必要,您应该为您的 GitLab 项目手动创建它

  • PROJECT_VARIABLE_WITH_ACCESS_TOKEN_VALUE - 是项目变量的名称(参见下面的屏幕截图),您应该为您的 GitLab 项目手动创建此变量,并用所选项目访问令牌的值填充它;顺便说一句,您可以将令牌的文字值添加到阶段代码中,但出于安全原因这可能不好

  • --rebase --autostash - 请注意,自动存储您的更改而不是简单地尝试拉推它们将帮助您在发生冲突时保证推送(即使我们的新 GitLab 阶段可能在其启动之间发生冲突),但文件将保留冲突痕迹而不是正确的内容;因为很难自动解决冲突,所以假设您使用其他工具来控制这种情况(例如,在冲突状态上进一步构建将会失败)

  • 这个简单的示例将导致无限的提交流,可能真实阶段应该包含一些only条件等。

截图

GitLab 项目访问令牌页面

GitLab 项目访问令牌页面

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

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

添加项目变量弹出窗口

添加项目变量弹出窗口