Thank you for reading this post, don't forget to subscribe!
1. Пример создания webhook
2.Пример ci/cd pipeline с webhook
1. Пример создания webhook
Возникла необходимость сборки приложения из разных проектов гитлаб.
Есть следующая группа гитлаб balance-online:
в ней есть несколько проектов и я создаю новый test:
переходим в проект devops где будет настроена наш pipeline ci/cd
запоминаем Project ID: 81
и
Заходим в Settings проекта -> CI/CD -> Pipeline triggers -> Add trigger
запоминаем значение e6a330cbb145453bfbafc57ef9cbfd
Созданный токен будет использоваться в настройке проекта test
если пролистать ниже там есть такая запись:
1 2 3 4 |
Use webhook Add the following webhook to another project for Push and Tag push events. The project will be rebuilt at the corresponding event. http://gitnexus.test.local/api/v4/projects/81/ref/REF_NAME/trigger/pipeline?token=TOKEN |
строка
http://gitnexus.test.local/api/v4/projects/81/ref/REF_NAME/trigger/pipeline?token=TOKEN
пригодится далее
Заходим в проект test и переходим в Settings -> Integrations ->
URL
редактируем нашу строку
http://gitnexus.test.local/api/v4/projects/81/ref/REF_NAME/trigger/pipeline?token=TOKEN
здесь
projects/81/ это (Project ID: 81) проекта devops
REF_NAME - то имя ветки (мы укажем master)
?token=TOKEN - это токен который мы регали ранее в Pipeline triggers (в нашем случае это e6a330cbb145453bfbafc57ef9cbfd)
добавим его переменную на которую дальше будет ориентироваться, назовём её по имени проекта:
&variables[name_projeckt]=test
строка будет иметь следующий вид:
http://gitnexus.test.local/api/v4/projects/81/ref/master/trigger/pipeline?token=e6a330cbb145453bfbafc57ef9cbfd&variables[name_projeckt]=test
Ставим галочку в Push events
Enable SSL verification -> add webhook
Далее в проекте devops в .gitlab-ci.yml добавляем проверку типа:
if [ "${name_projeckt}" == "test" ]; then echo "TEEEEEEEEEEEEEST"; fi
и теперь когда я буду пушить в проект test ветку master будет срабатывать ci/cd из проекта devops
2.Пример ci/cd pipeline с webhook
У нас в проекте devops имеется следующий файл .gitlab-ci.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
variables: NAMESPACE: test-services kubeconfig_url: /home/gitlab-runner/.kube # в конце слэш "/" не нужен stages: - build_and_push_image - deploy_service .predefine_env: tags: - runer-gitnexus-shell only: refs: - master .authorizate_to_gitlab: &authorizate_to_gitlab | docker logout $CI_REGISTRY echo -n $kubernetes_password | docker login -u kubernetes --password-stdin $CI_REGISTRY build_and_push_image: extends: .predefine_env stage: build_and_push_image before_script: - docker logout $CI_REGISTRY - *authorizate_to_gitlab - echo "CI_REGISTRY = $CI_REGISTRY" - echo "CI_REGISTRY_USER = $CI_REGISTRY_USER" - echo "CI_SERVER_HOST = $CI_SERVER_HOST" - echo "CI_PROJECT_NAMESPACE = $CI_PROJECT_NAMESPACE" script: - > if [ -n "${name_project}" ]; then git clone http://$CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD@$CI_SERVER_HOST/$CI_PROJECT_NAMESPACE/$name_project.git cd $name_project echo $CI_COMMIT_TAG git fetch --tags export TAG=$(git describe --tags --abbrev=0) echo $TAG echo "docker build -t $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$name_project:$TAG ." docker build -t $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$name_project:$TAG . echo "docker push $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$name_project:$TAG" docker push $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$name_project:$TAG echo "docker rmi $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$name_project:$TAG" docker rmi $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$name_project:$TAG fi - echo "name_project = $name_project" after_script: - docker logout $CI_REGISTRY deploy_service: extends: .predefine_env stage: deploy_service before_script: - *authorizate_to_gitlab - mkdir -p $kubeconfig_url - echo $kubeconfig | base64 -d > config; ls -l; pwd - mv config $kubeconfig_url/ - ls -lah $kubeconfig_url/ script: - > if [ -n "${name_project}" ]; then echo $name_project echo $TAG git clone http://$CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD@$CI_SERVER_HOST/$CI_PROJECT_NAMESPACE/$name_project.git cd $name_project/ export TAG=$(git describe --tags --abbrev=0) echo $TAG cd ../ cd $name_project/helm helm upgrade --install --atomic --timeout 3m --kubeconfig=$kubeconfig_url/config -n $NAMESPACE test-$name_project test-$name_project/ --values test-$name_project/values.yaml --set-string image_app.tag=$TAG ; fi after_script: - echo $name_project - docker logout $CI_REGISTRY - helm list --kubeconfig=$kubeconfig_url/config -n $NAMESPACE - kubectl --kubeconfig=$kubeconfig_url/config get pod -n $NAMESPACE - kubectl --kubeconfig=$kubeconfig_url/config get service -n $NAMESPACE - kubectl --kubeconfig=$kubeconfig_url/config get ingress -n $NAMESPACE - rm -rf $kubeconfig_url/config |
отмечу что файл config в котором находится token kubernetes кластера я добавил как переменную $kubeconfig (в виде base64)
сконвертировать можно следующим образом:
cat ~/.kube/config | openssl base64 | tr -d '\n'
и в самом ci/cd pipeline вызываю командой:
echo $kubeconfig | base64 -d > config;
почему сделал именно так а не добавил переменную с типом file - потому что гитлаб старый и обновлять его разработчики боятся и не хотят поэтому вот такой костыльный вариант.
аутентификация в gitlab-registry у меня проходит под отдельным пользователем kubernetes пароль от него добавлен в переменной $kubernetes_password
echo -n $kubernetes_password | docker login -u kubernetes --password-stdin $CI_REGISTRY
сначала я пробовал использовать встроенную переменную:
$CI_REGISTRY_USER - пользователь под которым ты заходишь в gitlab и запускаешь ci/cd pipeline
$CI_REGISTRY_PASSWORD - пароль твоего пользователя
$CI_REGISTRY - адрес registry
и вот в таком виде проходить аутентификацию:
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
но так не прокатит, так как по webhook это не передаётся
Также я завязал всё на имя тэга образа, т.е. пока не будет передан тэг сборка не будет идти.
В сам проект пушим следующим образом:
git add .
git commit -m "test 23"
git tag -a v23 -m "test"
git push origin --tags
git push
и после этого сработает webhook, начнётся сборка и деплой.