如何将标签推送到 CI 中的分支?
How to push tag to a branch in a CI?
我想在我的 Pull Request 中添加一个手动作业,以便在我 运行 手动作业时标记我的源分支。此标记将触发对我的 bitrise 配置的构建。
但是,当我尝试推送我的标签时,我遇到了这个问题。
注意:我试图将我的标签推送到的分支不受保护。
$ git checkout $CI_COMMIT_REF_NAME
Switched to a new branch 'feature/gitlab-ci'
Branch feature/gitlab-ci set up to track remote branch feature/gitlab-ci from origin.
$ git tag build-bitrise
$ git push --tags
remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:[MASKED]@gitlab.com/my-app/my-app.git/': The requested URL returned error: 403
Cleaning up file based variables
00:01
ERROR: Job failed: exit code 1
我的工作是这样做的:
- git remote show origin
- git fetch
- git checkout $CI_COMMIT_REF_NAME
- git tag build-bitrise
- git push --tags
在我的“before_scripts”步骤中,我这样做:
before_script:
# Install ssh-agent through openssh-client if not present
- 'which ssh-agent || ( apt-get update -qy && apt-get install openssh-client -qqy )'
# Add the private key to this user
- eval $(ssh-agent -s) && ssh-add <(echo "$SSH_PRIVATE_KEY") && mkdir -p ~/.ssh
# Config git to avoid first usage questions. Set the identity
- git config --global user.email "my-secret-email@gmail.com" && git config --global user.name "Louis Lecocq"
其中 SSH_PRIVATE_KEY 是一个变量,它是我在 ENV 中的 GITLAB 配置文件的 copy/paste。
感谢阅读和抽空
我认为您当前的方法不起作用,因为它仍在使用 https
而不是 ssh
来根据错误消息执行 git tag
,所以没有使用您的方法SSH_PRIVATE_KEY
:
fatal: unable to access 'https://gitlab-ci-token:[MASKED]@gitlab.com/my-app/my-app.git/': The requested URL returned error: 403
您可以通过在执行 git push --tags
之前手动更新 git remote
来实现此功能(未经测试),即:
git remote set-url origin git@gitlab.com:my-group/my-app/my-app
使用 SSH_PRIVATE_KEY
的替代方法是使用 API 键。您可以从 https://gitlab.com/-/profile/personal_access_tokens 创建具有 API 访问权限的个人访问令牌,然后将密钥添加到 CI/CD Variables
,例如 API_KEY
。
然后在你的脚本部分,你可以有类似的东西:
script:
- # something to do before pushing the tag
# sometimes the remote might already exist (if using the same runner), let's just remove it and don't fail
- git remote remove https-origin || true
# add new https-origin remote which uses the API_KEY
- git remote add https-origin https://gitlab-ci-token:${API_KEY}@gitlab.com/my-group/my-app.git
# tag your build
- git tag build-bitrise
# push only the build-bitrise tag using the https-origin ref, and skip CI build
- git push https-origin -o ci.skip refs/tags/build-bitrise
注意,建议为 API_KEY 使用机器人帐户,否则 API_KEY 将具有与您的用户相同的权限,并且可能会被其他能够看到的维护者泄露CI/CD 变量中的键等
我想在我的 Pull Request 中添加一个手动作业,以便在我 运行 手动作业时标记我的源分支。此标记将触发对我的 bitrise 配置的构建。
但是,当我尝试推送我的标签时,我遇到了这个问题。 注意:我试图将我的标签推送到的分支不受保护。
$ git checkout $CI_COMMIT_REF_NAME
Switched to a new branch 'feature/gitlab-ci'
Branch feature/gitlab-ci set up to track remote branch feature/gitlab-ci from origin.
$ git tag build-bitrise
$ git push --tags
remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:[MASKED]@gitlab.com/my-app/my-app.git/': The requested URL returned error: 403
Cleaning up file based variables
00:01
ERROR: Job failed: exit code 1
我的工作是这样做的:
- git remote show origin
- git fetch
- git checkout $CI_COMMIT_REF_NAME
- git tag build-bitrise
- git push --tags
在我的“before_scripts”步骤中,我这样做:
before_script:
# Install ssh-agent through openssh-client if not present
- 'which ssh-agent || ( apt-get update -qy && apt-get install openssh-client -qqy )'
# Add the private key to this user
- eval $(ssh-agent -s) && ssh-add <(echo "$SSH_PRIVATE_KEY") && mkdir -p ~/.ssh
# Config git to avoid first usage questions. Set the identity
- git config --global user.email "my-secret-email@gmail.com" && git config --global user.name "Louis Lecocq"
其中 SSH_PRIVATE_KEY 是一个变量,它是我在 ENV 中的 GITLAB 配置文件的 copy/paste。
感谢阅读和抽空
我认为您当前的方法不起作用,因为它仍在使用 https
而不是 ssh
来根据错误消息执行 git tag
,所以没有使用您的方法SSH_PRIVATE_KEY
:
fatal: unable to access 'https://gitlab-ci-token:[MASKED]@gitlab.com/my-app/my-app.git/': The requested URL returned error: 403
您可以通过在执行 git push --tags
之前手动更新 git remote
来实现此功能(未经测试),即:
git remote set-url origin git@gitlab.com:my-group/my-app/my-app
使用 SSH_PRIVATE_KEY
的替代方法是使用 API 键。您可以从 https://gitlab.com/-/profile/personal_access_tokens 创建具有 API 访问权限的个人访问令牌,然后将密钥添加到 CI/CD Variables
,例如 API_KEY
。
然后在你的脚本部分,你可以有类似的东西:
script:
- # something to do before pushing the tag
# sometimes the remote might already exist (if using the same runner), let's just remove it and don't fail
- git remote remove https-origin || true
# add new https-origin remote which uses the API_KEY
- git remote add https-origin https://gitlab-ci-token:${API_KEY}@gitlab.com/my-group/my-app.git
# tag your build
- git tag build-bitrise
# push only the build-bitrise tag using the https-origin ref, and skip CI build
- git push https-origin -o ci.skip refs/tags/build-bitrise
注意,建议为 API_KEY 使用机器人帐户,否则 API_KEY 将具有与您的用户相同的权限,并且可能会被其他能够看到的维护者泄露CI/CD 变量中的键等