Этот pet-проект послужил мне тренировкой для создания CI (от фиксации в репозитории до загрузки в docker registry) для node.js-приложения. Может кому-нибудь будет это интересно и полезно, поэтому я решил поделиться своей работой.
Если вы начинающий DevOps-инженер и вам хочется попрактиковаться в написании Continuous Integration (CI), этот репозиторий может вам в этом помочь. Мне кажется здесь достаточно для хорошей практики: node.js, webhook, jenkins, docker. Само приложение представляет из себя простой веб-сайт, который обращается к API NASA и отображает завораживающию картинку космоса с интересным описанием. Вот такой простой веб-сайт. Но ведь большего и не надо. Основной акцент сделан на тренировке написания Jenkinsfile
.
Чтобы создать и настроить пайплайн, я использовал jenkins, который был запущен в docker-контейнере. Для поднятия jenkins пользовался официальной документацией. Вот ссылка.
Теперь по порядку. Сначала поднял виртуальную машину CentOS 7 в Яндекс Облаке. Подключился к ВМ по SSH. Обновил пакеты. Установил docker (ссылка на мой другой репозиторий, где со строки 17 по 39 показаны примеры команд для его установки).
Выполнил эту команду на ВМ, чтобы jenkins мог иметь доступ к docker-демону и собирать наше приложение.
sudo chmod 666 /var/run/docker.sock
Если не выполнить команду, скорее всего в jenkins при сборке будет примерно такая ошибка.
+ docker build -t apod-website-node:1.0.53 .
ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied
Уверен есть и другой способ связки, если мне удасться его найти, обязательно поправлю инструкцию. Этот способ мне не особо нравится, потому что он снижает безопасность системы linux.
Далее создал сетевой мост
docker network create jenkins
Запустил контейнер docker:dind
docker run --name jenkins-docker --rm --detach \
--privileged --network jenkins --network-alias docker \
--env DOCKER_TLS_CERTDIR=/certs \
--volume jenkins-docker-certs:/certs/client \
--volume jenkins-data:/var/jenkins_home \
--publish 2376:2376 \
docker:dind --storage-driver overlay2
Создал Dockerfile
со следующей инструкцией
FROM jenkins/jenkins:2.387.2
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
Собрал образ myjenkins-blueocean:2.387.2-1
docker build -t myjenkins-blueocean:2.387.2-1 .
Запустил его
docker run --name jenkins-blueocean --restart=on-failure --detach \
--network jenkins \
--publish 8080:8080 --publish 50000:50000 \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume jenkins-data:/var/jenkins_home \
myjenkins-blueocean:2.387.2-1
И последнее, ввел команду
sudo docker exec jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword
То, что выдало в терминале (это пароль для разблокировки jenkins при первом входе) скопировал, в браузере открыл страницу jenkins по URL-адресу http://<IP адрес ВМ>:8080
, где вставил тот самый пароль для разблокировки. Далее простая настройка уже самого jenkins: какие плагины устанавливать и создание пользователя. Все, jenkins готов 👍.
Делам форк моего репозитория. Далее уже свой репозиторий клонируете себе на локальную машину.
Можете с помощью docker также собрать образ приложения apod-website-node
, т.к. в репозитории есть Dockerfile
.
Стандартная команда для сборки
docker build -t apod-website-node:1.0.0 .
Также стандартная команда для запуска контейнера
docker run -d -p 60937:60937 apod-website-node:1.0.0
Переходите на URL-адрес http://<IP адрес ВМ>:60937
и видите примерно следующее:
Также вы можете попробовать собрать и запустить приложение с помощью node.js на своей локальной машине. Для этого у вас соответсвенно должен быть установлен node.js (у меня была версия v14.21.3
) и npm (у меня была версия 6.14.18
).
Команды также стандартные.
Запуск веб-сайта
npm start
Для интереса еще написал небольшой тест, его запустить можно соответвенно командой
npm test
На главной странице jenkins выбираем Создать Item, придумаваем и вводим имя для пайплайна, далее выбираем чуть ниже Pipeline.
✅ В самом пайплайне отмечаем чек напротив GitHub project, вставляем URL-адрес своего репозитория в GitHub.
✅ Далее чек напротив GitHub hook trigger for GITScm polling в разделе Build Triggers, чтобы пайп запускался автоматически при изменении в репозитории GitHub, а не только при ручном запуске. Чтобы все работало, вам еще необходимо будет перейти в настройки своего репозитория GitHub, выбрать раздел Webhooks, нажать Add webhook. Ввести URL-адрес http://<IP адрес ВМ>:8080/github-webhook/
. Выберите тип содержимого JSON. И все, должно успешно пропинговаться и работать.
✅ В разделе Pipeline выбрать Pipeline script from SCM (т.к. в корневом каталоге существует Jenkinsfile
), где необходимо будет вновь указать URL-адрес своего репозитория GitHub. Сохраняете.
✅ Перейти в настройки jenkins. В разделе Credentials нажать на ссылку (global), затем на кнопку справа вверху Add Credentials. В поле Kind выберите Username with password. Указываете свой логин и пароль от Docker Hub в поле Username и Password соответственно. Вводите идентификатор учетных данных в поле ID. Этот идентификатор будет использоваться в вашем Jenkinsfile
(этап Docker push в пайплайне) для ссылки на учетные данные. В моем случае это docker-hub-credentials. Сохраняете.
✅ И последнее, т.к. это node.js приложение, необходимо установить соответвующий плагин в jenkins. Вот ссылка на документацию плагина. Чтобы его установить достаточно перейти в раздел плагинов jenkins, ввести в поиске nodejs, установить и настроить в разделе Конфигурация глобальных инструментов. Там необходимо будет просто задать имя (в моем случае это просто Node.js).
Попробуйте сделать фиксацию своего репозитория, после чего автоматически должен запуститься ваш пайплайн.
Схема CI На этом все. Надеюсь эта интрукция будет для Вас полезной. Желаю удачи!