Я только что столкнулся с той же проблемой и видел этот вопрос без ответа, поэтому мое решение есть.
Проблема
Проблема вызвана тем, что удаленный URL, используемый git длянажмите код в виде http(s)://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@git.mydomain.com/group/project.git
.Этот URL использует протокол http(s)
, поэтому git не использует настроенный вами ключ развертывания ssh
.
Решение
Решение состоит в том, чтобы изменить push-адрес удаленного origin
так что это соответствует ssh://git@git.mydomain.com/group/project.git
.Самый простой способ сделать это - использовать предопределенную переменную CI_REPOSITORY_URL
.
Вот пример кода, который делает это с помощью sed
:
# Change url from http(s) to ssh
url_host=$(echo "${CI_REPOSITORY_URL}" | sed -e 's|https\?://gitlab-ci-token:.*@|ssh://git@|g')
echo "${url_host}"
# ssh://git@git.mydomain.com/group/project.git
# Set the origin push url to the new one
git remote set-url --push origin "${url_host}"
Кроме того, те, кто использует docker executor, могут захотеть проверить ключ хоста SSH , как предложено в документации gitlab для ключей развертывания для docker executor .
Так что я даюболее полный пример для исполнителя docker .Код в основном из документации gitlab по ssh deploy keys .В этом примере закрытый ключ развертывания хранится в переменной с именем SSH_PRIVATE_KEY
.
create:push:pdf:
before_script:
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "${SSH_PRIVATE_KEY}" | tr -d '\r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- git config --global user.email "email@example.com"
- git config --global user.name "User name"
- gitlab_hostname=$(echo "${CI_REPOSITORY_URL}" | sed -e 's|https\?://gitlab-ci-token:.*@||g' | sed -e 's|/.*||g')
- ssh-keyscan "${gitlab_hostname}" >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- git checkout master
- git add myfile.pdf
- git commit -m "Generated PDF file"
- url_host=$(echo "${CI_REPOSITORY_URL}" | sed -e 's|https\?://gitlab-ci-token:.*@|ssh://git@|g')
- git remote set-url --push origin "${url_host}"
- git push origin master