6

我们想知道在技术上是否可以像在 GitHub 中那样做一个git pushusinghttps协议,而不是sshcurl请求中直接使用用户名和密码。

我见过一些人似乎认为这是可能的,但我们无法证明这一点。

是否有任何证据或证人可以确认允许您使用用户访问令牌或gitlab-ci-tokenCI 内推送的此类功能?

4

3 回答 3

2

我给我的before_script.sh,可以在任何.gitlab-ci.yml

before_script:
  - ./before_script.sh

您只需在项目中设置一个名为GL_TOKENor的受保护环境变量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 策略,它可以在使用 default 的非受保护分支上正常工作gitlab-ci-token

在受保护的分支上,您可以git push照常使用该命令。

我们停止使用 SSH 密钥,Vít Kotačka 的回答帮助我们了解了它之前失败的原因。

于 2018-07-16T08:59:47.280 回答
1

当我在由gitlab-runner克隆的存储库中进行更改时,我无法通过Docker执行程序的https进行回推。因此,我使用以下解决方法:

  1. 使用用户访问令牌通过https将存储库克隆到某个临时位置。
  2. 做一些Git工作(如合并或标记)。
  3. 将更改推回。

我有一份工作.gitlab-ci.yml

tagMaster:
  stage: finalize
  script: ./tag_master.sh
  only:
  - master
  except:
  - tags

然后我有一个tag_master.sh带有Git命令的 shell 脚本:

#!/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

这很好用。

于 2018-06-08T14:39:10.787 回答
1

仅供参考,个人访问令牌具有帐户级别的访问权限,这通常过于广泛。部署密钥更好,因为它仅具有项目级别的访问权限,并且可以在创建时授予写入权限。您可以提供公共 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
于 2020-05-21T21:18:19.503 回答