====== Jenkins ====== Документация: https://www.jenkins.io/doc/\\ Jenkins с открытыми пайплайнами: https://ci.xwiki.org/ Статьи:\\ [[https://habr.com/ru/company/yoomoney/blog/538664/|Jenkins Pipeline. Что это и как использовать в тестировании]]\\ [[https://infostart.ru/1c/articles/1198035/|Многопоточный CI-контур для 1С c Packer, Vagrant и Jenkins]] Видео:\\ [[https://www.youtube.com/watch?v=QaDNk1a8xFU&list=PLEiEAq2VkUUKGrfcoNYRgqam5YBERN8xa&index=4|Jenkins Tutorial For Beginners]]\\ [[https://www.youtube.com/playlist?list=PLmxB7JSpraiew9igtD89o33AaniUrmUzm|Kirill Semaev - Jenkins playlist]]\\ [[https://www.youtube.com/playlist?list=PLy7NrYWoggjw_LIiDK1LXdNN82uYuuuiC|Technoworld with Nana - Jenkins Tutorial for Beginners]]\\ [[https://www.youtube.com/watch?v=w3kapbN5r7g&list=PLvBBnHmZuNQJeznYL2F-MpZYBUeLIXYEe|CloudBeesTV - Jenkins tutorials]] ([[https://www.youtube.com/c/CloudBeesTV/search?query=docker|Jenkins + Docker]]) ===== Docker ===== Тонкость в том, что если Jenkins работает в контейнере, то желательно запускать сборки на хостовом Докере, а не городить вложенные контейнеры. Что для этого нужно: - Примонтировать ''/var/run/docker.sock'' внутрь контейнера Jenkins. - Установить docker-cli в контейнере Jenkins. - Создать группу ''docker'' в контейнере Jenkins и включить туда пользователя ''jenkins''. - GID группы ''docker'' в контейнере Jenkins должен совпадать с GID группы ''docker'' хоста. # На хосте нужно задать системную переменную export DOCKERGID=$(grep ^docker /etc/group |cut -d: -f 3) # Она нужна, чтобы её значение использовать параметре ARG в Dockerfile https://stackoverflow.com/questions/47390515/docker-compose-args-from-shell # This docker-compose file intent to run a Jenkins container connected to the host machine Docker daemon. # # A discussion about potential security issues and improvements on this approach can be found at: # https://forums.docker.com/t/using-docker-in-a-dockerized-jenkins-container/322/11 # # Source: http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ version: '3.1' volumes: jenkins-data: services: jenkins: image: jenkinsci/blueocean restart: always ports: - 8080:8080 - 50000:50000 tty: true volumes: - jenkins-data:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock https://gist.github.com/adelmofilho/5e4b2a57b402e218300332dd0a88a881 FROM jenkins/jenkins USER 0 ARG DOCKERGID=998 # Docker RUN apt-get update \ && apt-get install software-properties-common apt-transport-https ca-certificates gnupg-agent dialog apt-utils -y \ && curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - \ && add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" \ && apt-get update \ && apt-get install docker-ce-cli -y # Setup users and groups RUN addgroup --gid ${DOCKERGID} docker RUN usermod -aG docker jenkins USER 1000 https://stackoverflow.com/questions/63095927/give-permission-to-jenkins-to-access-unix-var-run-docker-sock Для варианта с Alpine: FROM jenkins/jenkins:alpine USER 0 ARG DOCKERGID=998 # Docker RUN apk -U update && apk add docker-cli # Setup users and groups RUN addgroup -g ${DOCKERGID} docker RUN addgroup jenkins docker USER 1000 [[https://www.jenkins.io/doc/book/pipeline/docker/#using-a-remote-docker-server|Using a remote Docker server]]\\ [[https://itnext.io/docker-inside-docker-for-jenkins-d906b7b5f527|Docker inside Docker for Jenkins]]\\ [[https://www.google.com/search?q=jenkins+%2Fvar%2Frun%2Fdocker.sock|Google: jenkins /var/run/docker.sock]]\\ docker run --rm --name jenkins -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.303.1-jdk8 docker run --rm --name jenkins -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:2.303.1-jdk8 docker run --rm --name jenkins -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:2.303.2-jdk8 docker run --rm --name jenkins -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:2.303.2-jdk11 https://gist.github.com/darinpope/39e4718919d22bc22f470ad3e94f8df1 ===== Проекты ===== Freestyle - для простых одиночных задач, например, тестирования. Несколько таких проектов можно объединить, чтобы они шли один за другим.\\ Pipeline - полный цикл сборки, может иметь несколько этапов (stages). Применяется к одной ветке.\\ Multibranch pipeline - пайплайн для сразу нескольких веток репозитория. ==== Credentials ==== Scope: * Global - доступны везде * System - только для сервера Jenkins (не применяются к проектам) * Внутри Multibranch pipeline тоже есть пункт с настройкой учётных данных, ограниченные действием внутри конкретного проекта. Связаны с плагином Folders, который распределяет сборки по папкам.