====== 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, который распределяет сборки по папкам.