Не удается нажать с gitlab-ci.yml

Вместе с моими коллегами мы работаем над библиотекой C ++, которая с каждым днем ​​становится все более важной. Мы уже создали утилиты непрерывной интеграции с помощью файла gitlab-ci.yml, который позволяет нам:

  • Сборка и тестирование в режиме отладки
  • Сборка и тестирование в режиме выпуска
  • Выполняйте проверки безопасности, такие как утечки памяти, с помощью Valgrind и проверяйте, есть ли в нашей библиотеке какой-либо четкий символ, который мы не хотим внутри него.
  • Создать документацию

Все, что заставило нас выбрать GitLab!

Мы хотели бы профилировать всю нашу библиотеку и выдвинуть тесты в отдельный проект. Мы уже сделали что-то подобное для нашей документации, используя метод SSH-ключа, но на этот раз мы хотели бы избежать этого.

Мы пробовали такой сценарий:

test_ci_push:
  tags:
    - linux
    - shell
    - light
  stage: profiling
  allow_failure: false
  only:
    - new-benchmark-stage
  script:
    - git clone http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git &> /dev/null
    - cd benchmarks
    - touch test.dat
    - echo "This is a test" > test.dat
    - git config --global user.name "${GITLAB_USER_NAME}"
    - git config --global user.email "${GITLAB_USER_EMAIL}"
    - git add --all
    - git commit -m "GitLab Runner Push"
    - git push http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git HEAD:master
    - cd ..

Мы также попробовали простую git push origin master отправить обновленные файлы, но каждый раз получали один и тот же ответ:

remote: You are not allowed to upload code for this project.
fatal: unable to access 'http://gitlab-ci-token:[email protected]/developers/benchmarks.git/': The requested URL returned error: 403

Оба проекта находятся под одним и тем же site, и я имею право использовать оба. Где я здесь что-то не так делаю?


person baptiste    schedule 28.09.2017    source источник


Ответы (3)


Токен gitlab ci больше похож на ключ развертывания на github.com, поэтому он имеет доступ только для чтения к репозиторию. Чтобы на самом деле протолкнуть, вам нужно будет сгенерировать личный токен доступа и использовать его вместо этого.

Сначала вам нужно сгенерировать токен, как показано здесь, в документации gitlab. Убедитесь, что вы проверили как читаемый пользователь, так и области API. Также это работает только в GitLab 8.15 и выше. Если вы используете старую версию и не хотите обновляться, я могу показать вам альтернативный метод, но он более сложный и менее безопасный.

В итоге ваш gitlab-ci.yml должен выглядеть примерно так:

test_ci_push:
  tags:
    - linux
    - shell
    - light
  stage: profiling
  allow_failure: false
  only:
    - new-benchmark-stage
  script:
    - git clone http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git &> /dev/null
    - cd benchmarks
    - echo "This is a test" > test.dat
    - git config --global user.name "${GITLAB_USER_NAME}"
    - git config --global user.email "${GITLAB_USER_EMAIL}"
    - git add --all
    - git commit -m "GitLab Runner Push"
    - git push http://${YOUR_USERNAME}:${PERSONAL_ACCESS_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git HEAD:master
    - cd ..
person Clive Makamara    schedule 29.09.2017
comment
Ok ! Теперь мне нужно выяснить, как использовать этот токен в .yml ›‹ - person baptiste; 29.09.2017
comment
Я обновил свой ответ, чтобы вам было проще получить то, что вам нужно;) - person Clive Makamara; 29.09.2017
comment
Я хочу использовать свой токен пользователя для выполнения git push в CI. Я создал API access token и использую его в дополнение к моему URL-адресу git https. Это не работает, там написано, что у меня нет разрешений на push, пока я владелец. Как я могу сделать ? (Без SSH) - person Dimitri Kopriwa; 25.05.2018
comment
К каждому токену доступа прикреплены области действия, токену доступа требуется область действия api, иначе вы ничего не сможете с ним сделать. - person Clive Makamara; 25.05.2018
comment
Я проверил все области, включая область api, и все еще не могу отправить в свой репозиторий. Вы уверены, что это возможно с помощью токена? Раньше я использовал ssh, настроенный вручную, потому что думал, что это единственное решение. - person Dimitri Kopriwa; 27.05.2018
comment
Спасибо! Этот шаг push - все, что мне нужно, чтобы понять, как протолкнуть мои изменения package.json для управления версиями npm! - person Jimmy Hoffa; 29.06.2018
comment
Небольшое примечание к коду вашего скрипта: вам не нужно сначала touch test.dat. При перенаправлении stdout в файл с использованием > этот файл создается автоматически. - person Mecki; 24.04.2019

Хотя предыдущие ответы более или менее хороши, есть несколько важных моментов.

  before_script:
    - git config --global user.name "${GITLAB_USER_NAME}"
    - git config --global user.email "${GITLAB_USER_EMAIL}"
  script:
    - <do things>
    - git push "https://${GITLAB_USER_NAME}:${CI_GIT_TOKEN}@${CI_REPOSITORY_URL#*@}" "HEAD:${CI_COMMIT_TAG}"

Во-первых, нам нужно только указать имя пользователя / адрес электронной почты, чтобы git.

Во-вторых, наличие его в сценарии before не очень важно, но позволяет упростить повторное использование при выполнении «расширения».

Наконец, нажатие https - это нормально, но поскольку мы не используем сохраненный ключ ssh, нам следует избегать всего, что может раскрыть токен. Во-первых, хотя gitlab не будет печатать токен в этой команде, git с радостью сообщит нам, что для нового восходящего потока задано значение https://username:thetokeninplaintexthere@url Итак, ваш токен представлен в виде обычного текста, поэтому не используйте -u для установки восходящего потока.

Кроме того, в этом нет необходимости, мы делаем только одно нажатие.

Более того, при определении URL-адреса я обнаружил, что использование существующего CI_REPOSITORY_URL является наиболее надежным решением (например, при перемещении репо или еще много чего). Поэтому мы просто заменяем имя пользователя / токен в строке URL.

person oliver    schedule 25.03.2019

Вы также можете указать пользователя и пароль (пользователя с правом записи) в качестве секретных переменных и использовать их.

Пример:

before_script:
 - git remote set-url origin https://$GIT_CI_USER:[email protected]/$CI_PROJECT_PATH.git
 - git config --global user.email '[email protected]'
 - git config --global user.name 'MyUser'

Вы должны определить GIT_CI_USER и GIT_CI_PASS как секретные переменные (вы всегда можете создать специального пользователя для этой цели).

С этой конфигурацией вы обычно можете работать с git. Я использую этот подход для размещения тегов после выпуска (с Axion Release Gradle Pluing - http://axion-release-plugin.readthedocs.io/en/latest/index.html)

Пример работы по выпуску:

release:
  stage: release
  script:
    - git branch
    - gradle release -Prelease.disableChecks -Prelease.pushTagsOnly
    - git push --tags
  only:
   - master
person Przemek Nowak    schedule 17.05.2018