是否可以在没有 SSH 的情况下在 Gitlab-CI 中进行 git 推送?
Is it possible to do a git push within a Gitlab-CI without SSH?
我们想知道在技术上是否可以像 GitHub 那样,使用 https
协议而不是 ssh
和 来做一个 git push
在 curl 请求中直接使用用户名和密码。
我看到有人似乎认为这是可能的,但我们无法证明。
是否有任何证据或证人可以确认允许您使用用户访问令牌或 CI 中的 gitlab-ci-token
进行推送的功能?
当我在存储库中进行更改时,我无法通过 https 从 Docker 执行程序返回被 gitlab-runner 克隆。因此,我使用以下解决方法:
- 使用用户访问令牌.
通过https将存储库克隆到某个临时位置
- 做一些 Git 工作(例如合并或标记)。
- 将更改推回。
我在.gitlab-ci.yml
工作:
tagMaster:
stage: finalize
script: ./tag_master.sh
only:
- master
except:
- tags
然后我有一个 shell 脚本 tag_master.sh
和 Git 命令:
#!/usr/bin/env bash
OPC_VERSION=`gradle -q opcVersion`
CI_PIPELINE_ID=${CI_PIPELINE_ID:-00000}
mkdir /tmp/git-tag
cd /tmp/git-tag
git clone https://deployer-token:$DEPLOYER_TOKEN@my.company.com/my-user/my-repo.git
cd my-repo
git config user.email deployer@my.company.com
git config user.name 'Deployer'
git checkout master
git pull
git tag -a -m "[GitLab Runner] Tag ${OPC_VERSION}-${CI_PIPELINE_ID}" ${OPC_VERSION}-${CI_PIPELINE_ID}
git push --tags
这个效果很好。
我给了我的 before_script.sh
可以在任何 .gitlab-ci.yml
中使用
before_script:
- ./before_script.sh
您只需在项目中设置一个名为 GL_TOKEN
或 GITLAB_TOKEN
的受保护环境变量。
if [[ -v "GL_TOKEN" || -v "GITLAB_TOKEN" ]]; then
if [[ "${CI_PROJECT_URL}" =~ (([^/]*/){3}) ]]; then
mkdir -p $HOME/.config/git
echo "${BASH_REMATCH[1]/:\/\//://gitlab-ci-token:${GL_TOKEN:-$GITLAB_TOKEN}@}" > $HOME/.config/git/credentials
git config --global credential.helper store
fi
fi
它不需要更改默认的 git 策略,并且使用默认的 gitlab-ci-token
.
可以很好地处理非受保护的分支
在受保护的分支上,您可以像往常一样使用git push
命令。
我们停止使用 SSH 密钥,Vít Kotačka 的回答帮助我们理解了之前失败的原因。
仅供参考,个人访问令牌具有帐户级别的访问权限,这通常过于宽泛。 Deploy Key 更好,因为它只有项目级别的访问权限,并且可以在创建时授予写入权限。您可以提供 public SSH 密钥作为部署密钥,私钥可以来自 CI/CD 变量。
这基本上是我用于标记的工作:
release_tagging:
stage: release
image: ubuntu
before_script:
- mkdir -p ~/.ssh
# Settings > Repository > Deploy Keys > "DEPLOY_KEY_PUBLIC" is the public key of the utitlized SSH pair
# Settings > CI/CD > Variables > "DEPLOY_KEY_PRIVATE" is the private key of the utitlized SSH pair, type is 'File' and ends with empty line
- mv "$DEPLOY_KEY_PRIVATE" ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- 'which ssh-agent || (apt-get update -y && apt-get install openssh-client git -y) > /dev/null 2>&1'
- eval "$(ssh-agent -s)"
- ssh-add ~/.ssh/id_rsa > /dev/null 2>&1
- (ssh-keyscan -H $CI_SERVER_HOST >> ~/.ssh/known_hosts) > /dev/null 2>&1
script:
# .gitconfig
- touch ~/.gitconfig
- git config --global user.name $GITLAB_USER_NAME
- git config --global user.email $GITLAB_USER_EMAIL
# fresh clone
- mkdir ~/source && cd $_
- git clone git@$CI_SERVER_HOST:$CI_PROJECT_PATH.git
- cd $CI_PROJECT_NAME
# Version tag
- git tag -a "v$(cat version)" -m "version $(cat version)"
- git push --tags
我们想知道在技术上是否可以像 GitHub 那样,使用 https
协议而不是 ssh
和 来做一个 git push
在 curl 请求中直接使用用户名和密码。
我看到有人似乎认为这是可能的,但我们无法证明。
是否有任何证据或证人可以确认允许您使用用户访问令牌或 CI 中的 gitlab-ci-token
进行推送的功能?
当我在存储库中进行更改时,我无法通过 https 从 Docker 执行程序返回被 gitlab-runner 克隆。因此,我使用以下解决方法:
- 使用用户访问令牌. 通过https将存储库克隆到某个临时位置
- 做一些 Git 工作(例如合并或标记)。
- 将更改推回。
我在.gitlab-ci.yml
工作:
tagMaster:
stage: finalize
script: ./tag_master.sh
only:
- master
except:
- tags
然后我有一个 shell 脚本 tag_master.sh
和 Git 命令:
#!/usr/bin/env bash
OPC_VERSION=`gradle -q opcVersion`
CI_PIPELINE_ID=${CI_PIPELINE_ID:-00000}
mkdir /tmp/git-tag
cd /tmp/git-tag
git clone https://deployer-token:$DEPLOYER_TOKEN@my.company.com/my-user/my-repo.git
cd my-repo
git config user.email deployer@my.company.com
git config user.name 'Deployer'
git checkout master
git pull
git tag -a -m "[GitLab Runner] Tag ${OPC_VERSION}-${CI_PIPELINE_ID}" ${OPC_VERSION}-${CI_PIPELINE_ID}
git push --tags
这个效果很好。
我给了我的 before_script.sh
可以在任何 .gitlab-ci.yml
before_script:
- ./before_script.sh
您只需在项目中设置一个名为 GL_TOKEN
或 GITLAB_TOKEN
的受保护环境变量。
if [[ -v "GL_TOKEN" || -v "GITLAB_TOKEN" ]]; then
if [[ "${CI_PROJECT_URL}" =~ (([^/]*/){3}) ]]; then
mkdir -p $HOME/.config/git
echo "${BASH_REMATCH[1]/:\/\//://gitlab-ci-token:${GL_TOKEN:-$GITLAB_TOKEN}@}" > $HOME/.config/git/credentials
git config --global credential.helper store
fi
fi
它不需要更改默认的 git 策略,并且使用默认的 gitlab-ci-token
.
在受保护的分支上,您可以像往常一样使用git push
命令。
我们停止使用 SSH 密钥,Vít Kotačka 的回答帮助我们理解了之前失败的原因。
仅供参考,个人访问令牌具有帐户级别的访问权限,这通常过于宽泛。 Deploy Key 更好,因为它只有项目级别的访问权限,并且可以在创建时授予写入权限。您可以提供 public SSH 密钥作为部署密钥,私钥可以来自 CI/CD 变量。
这基本上是我用于标记的工作:
release_tagging:
stage: release
image: ubuntu
before_script:
- mkdir -p ~/.ssh
# Settings > Repository > Deploy Keys > "DEPLOY_KEY_PUBLIC" is the public key of the utitlized SSH pair
# Settings > CI/CD > Variables > "DEPLOY_KEY_PRIVATE" is the private key of the utitlized SSH pair, type is 'File' and ends with empty line
- mv "$DEPLOY_KEY_PRIVATE" ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- 'which ssh-agent || (apt-get update -y && apt-get install openssh-client git -y) > /dev/null 2>&1'
- eval "$(ssh-agent -s)"
- ssh-add ~/.ssh/id_rsa > /dev/null 2>&1
- (ssh-keyscan -H $CI_SERVER_HOST >> ~/.ssh/known_hosts) > /dev/null 2>&1
script:
# .gitconfig
- touch ~/.gitconfig
- git config --global user.name $GITLAB_USER_NAME
- git config --global user.email $GITLAB_USER_EMAIL
# fresh clone
- mkdir ~/source && cd $_
- git clone git@$CI_SERVER_HOST:$CI_PROJECT_PATH.git
- cd $CI_PROJECT_NAME
# Version tag
- git tag -a "v$(cat version)" -m "version $(cat version)"
- git push --tags