GitLab CI запрещает доступ к push с использованием ключа развертывания с доступом для записи - PullRequest
1 голос
/ 18 марта 2019

Я добавил ключ развертывания с правом записи в мой репозиторий GitLab. Мой .gitlab-ci.yml файл содержит:

- git clone git@gitlab.domain:user/repo.git
- git checkout master
- git add myfile.pdf
- git commit -m "Generated PDF file"
- git push origin master

Ключ развертывания работает при клонировании хранилища. Нажатие невозможно, даже если ключ развертывания имеет доступ для записи.

remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@domain/user/repo.git/': The requested URL returned error: 403

1 Ответ

1 голос
/ 09 июля 2019

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

Проблема

Проблема вызвана тем, что удаленный 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

...