Требуется автоматизировать процесс сборки приложения. Имеются исходники на Git ресурсе. Необходимо собрать из них проект и положить в Docker контейнер. Никаких средств оркестрации на этом хосте нет и не будет. На хосте установлен только докер. Все приложения должны крутиться в контейнерах. Соответственно Jenkins тоже должен жит в контейнере.
Решил автоматизировать сборку. Пошел в сторону Jenkins in Docker. Почитал скупую информацию, обронил слезу и начал мучать ИИ. Что получилось.
Избыточный docker-compose.yml так как по документации указано что есть 2 способа работы Jenkins через Docker. На официальном сайте используем sshagent . На официальном ресурсе github используем Jenkins через dind. Интересные подход к документации разработчиков, подумал и решил пробовать сразу 2я способами.
services:
jenkins:
image: jenkins/jenkins:lts
privileged: true # Запуск с правами привилегированного контейнера
ports:
- "7070:8080"
- "50000:50000"
volumes:
- jenkins_home:/var/jenkins_home
environment:
- DOCKER_HOST=tcp://docker:2376
- DOCKER_TLS_CERTDIR=/certs
networks:
jenkins: # Правильное определение сети
aliases:
- docker # Установка псевдонима для сети
docker-dind:
image: docker:24.0.7-dind
privileged: true # Привилегированный доступ для DinD
volumes:
- jenkins_home:/var/jenkins_home # Общий том с Jenkins для доступа к файлам
networks:
- jenkins
entrypoint: ["dockerd-entrypoint.sh"] # Установите точку входа
command: ["--storage-driver=overlay2"] # Передайте параметры в Docker Daemon
ports:
- "2376:2376"
networks:
jenkins:
volumes:
jenkins_home:
Несколько часов попробовав завести Jenkins через dind плюнул и ушел мучать sshagent
pipeline {
agent any // Вы можете указать конкретный агент, если нужно
stages {
stage('Clone Repository') {
steps {
git 'https://github.com/traefik/whoami.git'
}
}
stage('Build Repository') {
steps {
sshagent(['ssh-user-credential-id']) {
sh "ssh -o StrictHostKeyChecking=no user@host 'echo password | sudo -S docker build -t zaya /var/lib/docker/volumes/pipline_jenkins_home/_data/workspace/sborka'"
}
}
}
}
}
В итоге собрал костыльную автоматизированную сборку. Да, нужно вынести отдельного пользователя и дать права на докер чтоб не светить пароль. Но возник вопрос, как при сборке через ssh хост узнает по какому адресу был клонирован git проект? Изначально я думал что проект будет лежать по наименованию который я сам назвал. Но зайдя по адресу где лежит проект я также увидел куча клонов созданных самим Jenkins без моего ведома.
sborka - основной
sborka@2
sborka@2@temp
sborka@temp
Опыта с CICD у меня 6 часов. Может я что-то упустил. Или технология эта все еще сырая. И стоит на что-то другое посмотреть? Или есть у Jenkins красивое и элегантное решение как делать сборку из контейнера?