是否可以在没有SSH的情况下在Gitlab-CI中进行git推送?

时间:2018-05-27 14:18:47

标签: gitlab gitlab-ci gitlab-ci-runner gitlab-8

我们想知道在技术上是否可以像在GitHub中一样使用git push协议进行https而不使用ssh使用直接使用用户名和卷曲请求中的密码。

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

是否有任何证据或见证可以确认允许您使用用户访问令牌或CI中的gitlab-ci-token进行推送的功能?

4 个答案:

答案 0 :(得分:1)

当我在 gitlab-runner https Docker 执行程序返回>。因此,我使用以下解决方法:

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

    找到了一份工作
    tagMaster:
      stage: finalize
      script: ./tag_master.sh
      only:
      - master
      except:
      - tags
    

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

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

    这很有效。

答案 1 :(得分:1)

仅供参考,使用SSH可能是最好的方法,因为个人访问令牌具有帐户级别的访问权限。如果改为选择使用Deploy Key,则可以将其提供为公用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

答案 2 :(得分:0)

我要提供before_script.sh内的.gitlab-ci.yml

before_script:
  - ./before_script.sh

您需要做的就是在项目中设置一个名为GL_TOKENGITLAB_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ítKotačka的回答帮助我们了解了以前为什么失败。

答案 3 :(得分:-2)

我认为您必须将您的公钥添加到gitlab中的以下地址

gitlab.com/profile/keys

所以你可以推动&&拉没有用户名密码