Можно ли сделать git push внутри Gitlab-CI без SSH?

Мы хотим знать, возможно ли это технически, как в GitHub, сделать git push с помощью https протокол и не ssh и без непосредственного использования имени пользователя и пароля в запросе curl.

Я видел людей, которые, кажется, думают, что это возможно, мы не смогли доказать это.

Существуют ли какие-либо доказательства или свидетельства, которые могут подтвердить такую ​​функцию, которая позволяет выдвигать данные с помощью токена доступа пользователя или gitlab-ci-token в пределах CI?

3 ответа

Решение

Я даю 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 помогли нам понять, почему раньше это не получалось.

К вашему сведению, использование 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

Я не смог протолкнуть обратно через https от исполнителя Docker, когда внес изменения в репозиторий, который был клонирован gitlab-runner. Поэтому я использую следующий обходной путь:

  1. Клонируйте репозиторий во временное местоположение через https с токеном доступа пользователя.
  2. Сделайте некоторую работу с Git (например, слияние или тегирование).
  3. Нажмите изменения назад.

У меня есть работа в .gitlab-ci.yml:

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

и тогда у меня есть сценарий оболочки 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

Это хорошо работает.

Я думаю, что вы должны добавить свой открытый ключ в Gitlab ниже адрес

gitlab.com/profile/keys

так что вы можете нажать && тянуть без пароля имени пользователя

Другие вопросы по тегам