Gitlab CI/CD 无法 git 从 .gitlab-ci.yml 推送
Gitlab CI/CD cannot git push from .gitlab-ci.yml
我正在 .gitlab-ci.yml 中编写 GitLab CI/CD 管道脚本
我想检查某个特定文件是否在另一个回购协议中发生了变化,如果是这样,我想复制该文件,提交并推送到当前回购协议。
一切正常,直到我到达 '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
对于这段代码,我得到:
fatal: unable to access 'https://gitlab-ci-token:[MASKED]@gitlab.{curr_repo}.git/': The requested URL returned error: 403
我也试着在开头添加这一行:
git remote set-url origin 'https://{MY_USER_NAME}:"\"${PASSWORD}\""@gitlab.{curr_repo}.git'
我收到此错误消息:
fatal: Authentication failed for 'https://{MY_USER_NAME}:"\"${PASSWORD}\""@{curr_repo}.git/'
我还补充说:
- git 配置 --global user.name {MY_USER_NAME}
- git 配置 --global user.email {MY_EMAIL}
请帮帮我,
谢谢
工作令牌仅对您的存储库具有读取权限。
A unique job token is generated for each job and provides the user read access all projects that would be normally accessible to the user creating that job. The unique job token does not have any write permissions, but there is a proposal to add support.
您不能使用部署令牌,因为它们不能对存储库进行写访问 (possible tokens)。
您可以使用对存储库具有读写访问权限的项目访问令牌。
然后您可以在 url.
中使用您的项目访问令牌作为环境变量
git push "https://gitlab-ci-token:$PROJECT_ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git"
至少我们是这样在管道中使用它的。
我希望这对你有进一步的帮助。
简单 GitLab CI 阶段的完整示例,提交回其自己的 repo
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 new,您将需要
至少包含 git add
命令
project_access_token_name - 是使用的项目访问令牌的名称,而不是令牌值本身(见下面的截图);如有必要,您应该为您的 GitLab 项目手动创建它
PROJECT_VARIABLE_WITH_ACCESS_TOKEN_VALUE - 是项目变量的名称(见下面的截图),你应该为你的 GitLab 项目手动创建这个变量并且用所选项目访问令牌的值填充它;顺便说一句,您可以将令牌的文字值添加到阶段代码中,但出于安全原因,这可能不好
--rebase --autostash - 请注意,自动存储您的更改而不是简单地尝试拉推它们将帮助您保证推送以防万一冲突(甚至我们新的 GitLab 阶段可能在其启动之间发生冲突)但文件将留下冲突痕迹而不是正确的内容;因为很难自动解决冲突,假设你用其他工具控制这种情况(例如,进一步构建冲突状态只会失败)
这个简单的例子会导致无限的提交流,可能真正的阶段应该包含一些only
条件等
截图
GitLab 项目访问令牌页面
GitLab 项目 CI/CD 设置菜单,在哪里可以找到变量设置
添加项目变量弹窗
我正在 .gitlab-ci.yml 中编写 GitLab CI/CD 管道脚本 我想检查某个特定文件是否在另一个回购协议中发生了变化,如果是这样,我想复制该文件,提交并推送到当前回购协议。 一切正常,直到我到达 '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
对于这段代码,我得到:
fatal: unable to access 'https://gitlab-ci-token:[MASKED]@gitlab.{curr_repo}.git/': The requested URL returned error: 403
我也试着在开头添加这一行:
git remote set-url origin 'https://{MY_USER_NAME}:"\"${PASSWORD}\""@gitlab.{curr_repo}.git'
我收到此错误消息:
fatal: Authentication failed for 'https://{MY_USER_NAME}:"\"${PASSWORD}\""@{curr_repo}.git/'
我还补充说:
- git 配置 --global user.name {MY_USER_NAME}
- git 配置 --global user.email {MY_EMAIL}
请帮帮我, 谢谢
工作令牌仅对您的存储库具有读取权限。
A unique job token is generated for each job and provides the user read access all projects that would be normally accessible to the user creating that job. The unique job token does not have any write permissions, but there is a proposal to add support.
您不能使用部署令牌,因为它们不能对存储库进行写访问 (possible tokens)。 您可以使用对存储库具有读写访问权限的项目访问令牌。
然后您可以在 url.
中使用您的项目访问令牌作为环境变量git push "https://gitlab-ci-token:$PROJECT_ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git"
至少我们是这样在管道中使用它的。 我希望这对你有进一步的帮助。
简单 GitLab CI 阶段的完整示例,提交回其自己的 repo
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 new,您将需要 至少包含
git add
命令project_access_token_name - 是使用的项目访问令牌的名称,而不是令牌值本身(见下面的截图);如有必要,您应该为您的 GitLab 项目手动创建它
PROJECT_VARIABLE_WITH_ACCESS_TOKEN_VALUE - 是项目变量的名称(见下面的截图),你应该为你的 GitLab 项目手动创建这个变量并且用所选项目访问令牌的值填充它;顺便说一句,您可以将令牌的文字值添加到阶段代码中,但出于安全原因,这可能不好
--rebase --autostash - 请注意,自动存储您的更改而不是简单地尝试拉推它们将帮助您保证推送以防万一冲突(甚至我们新的 GitLab 阶段可能在其启动之间发生冲突)但文件将留下冲突痕迹而不是正确的内容;因为很难自动解决冲突,假设你用其他工具控制这种情况(例如,进一步构建冲突状态只会失败)
这个简单的例子会导致无限的提交流,可能真正的阶段应该包含一些
only
条件等
截图
GitLab 项目访问令牌页面
GitLab 项目 CI/CD 设置菜单,在哪里可以找到变量设置
添加项目变量弹窗