Можно ли сделать 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. Поэтому я использую следующий обходной путь:
- Клонируйте репозиторий во временное местоположение через https с токеном доступа пользователя.
- Сделайте некоторую работу с Git (например, слияние или тегирование).
- Нажмите изменения назад.
У меня есть работа в .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
так что вы можете нажать && тянуть без пароля имени пользователя