Сервер непрерывной интеграции и доставки Jenkins доступен в Docker Hub.
Это полнофункциональный сервер Jenkins. https://jenkins.io/.
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
ПРИМЕЧАНИЕ. Прочтите раздел «Подключение агентов» ниже, чтобы узнать о роли сопоставления портов 50000
. ПРИМЕЧАНИЕ. Если вы видите сообщение «Этот экземпляр Jenkins находится в автономном режиме», прочтите раздел «Конфигурация DNS ».
Это сохранит рабочую область в /var/jenkins_home
. Там хранятся все данные Jenkins, включая плагины и настройки. Вероятно, вы захотите сделать это явным томом, чтобы можно было управлять им и подключать его к другому контейнеру для обновлений:
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk17
Это автоматически создаст том докера «jenkins_home» на хост-компьютере. Тома Docker сохраняют свое содержимое даже тогда, когда контейнер остановлен, запущен или удален.
ПРИМЕЧАНИЕ. Избегайте использования привязки из папки на хост-компьютере в /var/jenkins_home
, так как это может привести к проблемам с правами доступа к файлам (пользователь, используемый внутри контейнера, может не иметь прав на папку на хост-компьютере). Если вам действительно нужно связать монтирование jenkins_home, убедитесь, что каталог на хосте доступен пользователю jenkins внутри контейнера (пользователь jenkins — uid 1000) или используйте параметр -u some_other_user
с docker run
.
docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
Это запустит Jenkins в отдельном режиме с добавлением переадресации портов и тома. Вы можете получить доступ к журналам с помощью команды docker logs CONTAINER_ID, чтобы проверить первый токен входа. Идентификатор контейнера будет возвращен из вывода команды выше.
Если вы привязываете монтирование к тому, вы можете в любое время просто создать резервную копию этого каталога (то есть jenkins_home).
Использование привязки не рекомендуется, поскольку это может привести к проблемам с разрешениями. Относитесь к каталогу jenkins_home так же, как к базе данных — в Docker вы обычно размещаете базу данных на томе.
Если ваш том находится внутри контейнера, вы можете использовать команду docker cp $ID:/var/jenkins_home
для извлечения данных или другие параметры, чтобы определить, где находятся данные тома. Обратите внимание, что некоторые символические ссылки в некоторых ОС могут быть преобразованы в копии (это может сбить с толку jenkins со ссылками LastStableBuild и т. д.).
Для получения дополнительной информации посетите раздел документации Docker «Использование томов».
Вы можете определить количество исполнителей на встроенном узле Jenkins с помощью скрипта groovy. По умолчанию установлено 2 исполнителя, но вы можете расширить образ и изменить его на желаемое количество исполнителей (рекомендуется 0 исполнителей на встроенном узле):
executors.groovy
import jenkins.model.* Jenkins.instance.setNumExecutors(0) // Recommended to not run builds on the built-in node
и Dockerfile
FROM jenkins/jenkins:lts COPY --chown=jenkins:jenkins executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy
Вы можете запускать сборки на контроллере «из коробки». Проект Jenkins рекомендует не включать на контроллере исполнителей.
Чтобы подключить агентов через входящее TCP-соединение , сопоставьте порт: -p 50000:50000
. Этот порт будет использоваться при подключении агентов к контроллеру.
Если вы используете только агенты сборки SSH (исходящие), этот порт не требуется, поскольку соединения устанавливаются с контроллера. Если вы подключаете агентов с помощью веб-сокетов (начиная с Jenkins 2.217), порт агента TCP также не используется.
Возможно, вам придется настроить JVM, на которой работает Jenkins, обычно для настройки свойств системы или настройки памяти кучи. Для этой цели используйте переменные среды JAVA_OPTS
или JENKINS_JAVA_OPTS
:
docker run --name myjenkins -p 8080:8080 -p 50000:50000 --restart=on-failure --env JAVA_OPTS=-Dhudson.footerURL=http://mycompany.com jenkins/jenkins:lts-jdk17
Параметры JVM специально для контроллера Jenkins должны быть установлены через JENKINS_JAVA_OPTS
, поскольку другие инструменты также могут реагировать на переменную среды JAVA_OPTS
.
Ведение журнала Jenkins можно настроить с помощью файла свойств и свойства Java java.util.logging.config.file
. Например:
mkdir data cat > data/log.properties <<EOF handlers=java.util.logging.ConsoleHandler jenkins.level=FINEST java.util.logging.ConsoleHandler.level=FINEST EOF docker run --name myjenkins -p 8080:8080 -p 50000:50000 --restart=on-failure --env JAVA_OPTS="-Djava.util.logging.config.file=/var/jenkins_home/log.properties" -v `pwd`/data:/var/jenkins_home jenkins/jenkins:lts-jdk17
Если вы хотите установить Jenkins за обратным прокси-сервером с префиксом, например: mysite.com/jenkins, вам необходимо добавить переменную среды JENKINS_OPTS="--prefix=/jenkins"
, а затем выполнить следующие процедуры для настройки обратного прокси-сервера: это будет зависеть от того, есть ли у вас Apache или Nginx:
Апач
Нгинкс
Если появляется сообщение «Этот экземпляр Jenkins находится в автономном режиме». появляется при первом запуске, а в журналах контейнера отображаются такие строки, как java.net.UnknownHostException: updates.jenkins.io
, возможно, у вашего контейнера проблемы с разрешением DNS-имен.
Чтобы потенциально решить проблему, запустите контейнер, указав DNS-сервер (например, Cloudflare 1.1.1.1 или Google 8.8.8.8 или любой другой DNS-сервер):
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure --dns 1.1.1.1 --dns 8.8.8.8 jenkins/jenkins:lts-jdk17
Аргументы, которые вы передаете докеру, запускающему образ Jenkins, передаются в программу запуска jenkins, поэтому, например, вы можете запустить:
docker run jenkins/jenkins:lts-jdk17 --version
Это покажет версию Дженкинса, так же, как если бы вы запускали Дженкинса из исполняемой войны.
Вы также можете определить аргументы Jenkins через JENKINS_OPTS
. Это полезно для настройки аргументов средства запуска Jenkins в производном образе Jenkins. В следующем примере Dockerfile этот параметр используется для принудительного использования HTTPS с сертификатом, включенным в образ.
FROM jenkins/jenkins:lts-jdk17 COPY --chown=jenkins:jenkins certificate.pfx /var/lib/jenkins/certificate.pfx COPY --chown=jenkins:jenkins https.key /var/lib/jenkins/pk ENV JENKINS_OPTS="--httpPort=-1 --httpsPort=8083 --httpsKeyStore=/var/lib/jenkins/certificate.pfx --httpsKeyStorePassword=Password12" EXPOSE 8083
Вы также можете изменить порт агента по умолчанию для Jenkins, определив JENKINS_SLAVE_AGENT_PORT
в образце Dockerfile.
FROM jenkins/jenkins:lts-jdk17 ENV JENKINS_SLAVE_AGENT_PORT=50001
или в качестве параметра докера,
docker run --name myjenkins -p 8080:8080 -p 50001:50001 --restart=on-failure --env JENKINS_SLAVE_AGENT_PORT=50001 jenkins/jenkins:lts-jdk17
Примечание . Эта переменная среды будет использоваться для установки системного свойства jenkins.model.Jenkins.slaveAgentPort
.
Если это свойство уже установлено в JAVA_OPTS или JENKINS_JAVA_OPTS , то значение
JENKINS_SLAVE_AGENT_PORT
будет игнорироваться.
Вы можете запустить свой контейнер от имени пользователя root и установить его с помощью apt-get, установить как часть этапов сборки с помощью установщиков инструментов jenkins или создать свой собственный файл Dockerfile для настройки, например:
FROM jenkins/jenkins:lts-jdk17 # if we want to install via apt USER root RUN apt-get update && apt-get install -y ruby make more-thing-here # drop back to the regular jenkins user - good practice USER jenkins
В таком производном образе вы можете настроить свой экземпляр jenkins с помощью скриптов-перехватчиков или дополнительных плагинов. Для этой цели используйте /usr/share/jenkins/ref
как место для определения содержимого JENKINS_HOME по умолчанию, как вы хотите, чтобы целевая установка выглядела:
FROM jenkins/jenkins:lts-jdk17 COPY --chown=jenkins:jenkins custom.groovy /usr/share/jenkins/ref/init.groovy.d/custom.groovy
Вы можете положиться на CLI менеджера плагинов, который передаст для загрузки набор плагинов с их зависимостями. Этот инструмент будет выполнять загрузку из центров обновлений, а для центров обновлений по умолчанию требуется доступ к Интернету.
Во время загрузки CLI будет использовать центры обновлений, определенные следующими переменными среды:
JENKINS_UC
— Главный центр обновлений. Этот центр обновлений может предлагать версии плагинов в зависимости от версий Jenkins LTS Core. Значение по умолчанию: https://updates.jenkins.io.
JENKINS_UC_EXPERIMENTAL
— Экспериментальный центр обновлений. Этот центр предлагает альфа- и бета-версии плагинов. Значение по умолчанию: https://updates.jenkins.io/experimental.
JENKINS_INCREMENTALS_REPO_MIRROR
— определяет зеркало Maven, которое будет использоваться для загрузки плагинов из репозитория Incrementals. Значение по умолчанию: https://repo.jenkins-ci.org/incrementals.
JENKINS_UC_DOWNLOAD
— URL-адрес загрузки Центра обновлений. Значение по умолчанию: $JENKINS_UC/download
JENKINS_PLUGIN_INFO
— расположение информации о плагине. Значение по умолчанию: https://updates.jenkins.io/current/plugin-versions.json.
В изображениях можно переопределить переменные среды.
❗ Обратите внимание, что изменение переменных центра обновлений не приведет к изменению Центра обновлений, используемого средой выполнения Jenkins, это касается только CLI менеджера плагинов.
Установку готовых пользовательских плагинов можно выполнить, скопировав файл HPI плагина в /usr/share/jenkins/ref/plugins/
внутри Dockerfile
:
COPY --chown=jenkins:jenkins path/to/custom.hpi /usr/share/jenkins/ref/plugins/
Вы можете запустить CLI вручную в Dockerfile:
ОТ jenkins/jenkins:lts-jdk17RUN jenkins-plugin-cli --plugins определение модели конвейера github-branch-source:1.8
Кроме того, можно передать файл, содержащий этот набор плагинов (с разрывами строк или без них).
ИЗ jenkins/jenkins:lts-jdk17COPY --chown=jenkins:jenkins plugins.txt /usr/share/jenkins/ref/plugins.txtRUN jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt
Когда контейнер jenkins запускается, он проверит, что JENKINS_HOME
имеет этот справочный контент, и скопирует его туда, если необходимо. Он не будет переопределять такие файлы, поэтому, если вы обновили некоторые плагины из пользовательского интерфейса, они не будут отменены при следующем запуске.
Если вы хотите переопределить, добавьте «.override» к имени эталонного файла. Например, файл с именем /usr/share/jenkins/ref/config.xml.override
перезапишет существующий файл config.xml
в JENKINS_HOME.
Также см. JENKINS-24986.
Вот пример получения списка плагинов с существующего сервера:
JENKINS_HOST=username:[email protected]:port curl -sSL "http://$JENKINS_HOST/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([w-]+).*?<version>([^<]+)()(</w+>)+/1 2n/g'|sed 's/ /:/'
Пример вывода:
cucumber-testresult-plugin:0.8.2 pam-auth:1.1 matrix-project:1.4.1 script-security:1.13 ...
Для изображений, производных от версии 2.x, вы также можете захотеть
RUN echo 2.0 > /usr/share/jenkins/ref/jenkins.install.UpgradeWizard.state
чтобы указать, что эта установка Jenkins полностью настроена. В противном случае появится баннер, предлагающий пользователю установить дополнительные плагины, что может быть неуместно.
Чтобы включить журналы доступа пользователей Jenkins из домашнего каталога Jenkins внутри Docker-контейнера, установите для переменной среды JENKINS_OPTS
значение --accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=/var/jenkins_home/logs/access_log
Соглашение об именах тегов в Docker Hub соответствует формату <repository_name>:<tag>
, где имя репозитория — jenkins/jenkins, а тег указывает версию образа. В случае LTS и последних версий тегами являются lts
и latest
соответственно.
Вы можете использовать эти теги, чтобы получить соответствующие образы Jenkins из Docker Hub и запустить их в своей системе. Например, чтобы получить LTS-версию образа Jenkins, используйте следующую команду: docker pull jenkins/jenkins:lts
Чтобы использовать Docker Compose с Jenkins, вы можете определить файл docker-compose.yml, включающий экземпляр Jenkins и любые другие службы, от которых он зависит. Например, следующий файл docker-compose.yml определяет контроллер Jenkins и агент SSH Jenkins:
сервисы: jenkins:image: jenkins/jenkins:ltsports: - Объемы «8080:8080»: - jenkins_home:/var/jenkins_home ssh-agent:image: jenkins/ssh-agentvolumes: jenkins_home:
Этот файл docker-compose.yml
создает два контейнера: один для Jenkins и один для агента SSH Jenkins.
Контейнер Jenkins основан на образе jenkins/jenkins:lts
и предоставляет веб-интерфейс Jenkins через порт 8080. Том jenkins_home
— это именованный том, который создается и управляется Docker.
Он монтируется в /var/jenkins_home
в контейнере Jenkins и сохраняет конфигурацию и данные Jenkins.
Контейнер ssh-agent основан на образе jenkins/ssh-agent
и запускает SSH-сервер для выполнения агента сборки Jenkins SSH.
Чтобы запустить экземпляр Jenkins и другие службы, определенные в файле docker-compose.yml
, запустите docker compose up -d
.
Это позволит получить необходимые изображения из Docker Hub, если они еще не присутствуют в вашей системе, и запустить службы в фоновом режиме.
Затем вы можете получить доступ к веб-интерфейсу Jenkins по адресу http://localhost:8080
в вашей хост-системе для настройки и управления вашим экземпляром Jenkins (где localhost
указывает на опубликованный порт вашим Docker Engine).
ПРИМЕЧАНИЕ. Если вы видите сообщение «Этот экземпляр Jenkins находится в автономном режиме», прочтите раздел «Конфигурация DNS ». В этом случае добавьте конфигурацию DNS в yaml:
сервисы: jenkins:# ... другие configdns: - 1.1.1.1 - 8.8.8.8# ...другой конфиг
Инструмент менеджера установки плагинов поддерживает обновление файла плагина за вас.
Пример команды:
JENKINS_IMAGE=Дженкинс/Дженкинс:lts-jdk17 docker run -it ${JENKINS_IMAGE} bash -c "stty -onlcr && jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt --available-updates --output txt" > плагины2.txt mv плагины2.txt плагины.txt
Все необходимые данные находятся в каталоге /var/jenkins_home, поэтому от того, как вы с этим справитесь, зависит и способ обновления. Как правило, вы можете скопировать его, а затем снова «вытащить докер» образа — и у вас будет последняя версия LTS — затем вы можете запустить с -v, указывающим на эти данные (/var/jenkins_home), и все будет так, как вы оставил это.
Как всегда, убедитесь, что вы знаете, как управлять докером, особенно работой с томами!
Если вы смонтируете домашний каталог Jenkins на том с именем Docker, то обновление будет состоять из docker pull
и ничего более.
Мы рекомендуем использовать docker compose
, особенно в тех случаях, когда пользователь также запускает параллельный контейнер nginx/apache в качестве обратного прокси-сервера для контейнера Jenkins.
По умолчанию плагины будут обновлены, если они не были обновлены вручную и если версия из образа докера новее, чем версия в контейнере. Версии, установленные образом Docker, отслеживаются через файл маркера.
Чтобы принудительно обновить плагины, которые были обновлены вручную, запустите образ Docker с -e PLUGINS_FORCE_UPGRADE=true
.
Поведение по умолчанию при обновлении образа Docker, который не записывал файлы маркеров, — оставить существующие плагины на месте. Если вы хотите обновить существующие плагины без маркера, вы можете запустить образ докера с -e TRY_UPGRADE_IF_NO_MARKER=true
. Затем плагины будут обновлены, если версия, предоставленная образом Docker, будет более новой.
Если вы хотите внести исправления в этот репозиторий, обратитесь к специальной документации.
Информацию о безопасности этого образа Docker можно найти в специальной документации.
Мы на Gitter, https://gitter.im/jenkinsci/docker.