[A Cloud Guru, Linux Academy] Внедрение полного конвейера CI/CD [RUS, 2020]
05. Непрерывная доставка
Этапы (stages) и шаги (steps)
Пример:
https://github.com/linuxacademy/cicd-pipeline-train-schedule-pipelines/blob/example-solution/Jenkinsfile
Подготовка окружения для тестов
Стартую Vagrant с 2 виртуалками как здесь.
Создаю пользователя “deploy”. И убеждаюсь, что могу подключиться по SSH данным пользователем с хоста, где установлен Jenkins.
Controller и Node
Создаю пользователя “deploy”
$ sudo su -
# adduser --disabled-password --gecos "" deploy
# usermod -aG sudo deploy
# passwd deploy
# sed -i "s/.*PasswordAuthentication.*/PasswordAuthentication yes/g" /etc/ssh/sshd_config
# service sshd reload
Не спрашивать sudo пароль:
# vi /etc/sudoers
%sudo ALL=(ALL:ALL) ALL
меняю на:
#%sudo ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
Убеждаюсь, что могу подключиться по SSH
$ ssh [email protected]
$ ssh [email protected]
Запускаю приложение на серверах
$ sudo mkdir -p /opt/train-schedule/
$ cd /opt/train-schedule/
$ sudo git clone https://github.com/linuxacademy/cicd-pipeline-train-schedule-cd .
Устанавливаю Node
$ sudo apt install -y nodejs npm
$ sudo apt install -y unzip
$ cd /opt/train-schedule/
$ sudo npm install
$ sudo npm start
Попробовали, что запускается
http://192.168.0.11:3000/
http://192.168.0.12:3000/
OK
Создаем сервис systemctl
$ sudo vi /etc/systemd/system/train-schedule.service
[Unit]
Description=nodejs-app
After=network.target
[Service]
Environment=NODE_PORT=3000
Type=simple
User=ubuntu
WorkingDirectory=/opt/train-schedule
ExecStart=/usr/bin/nodejs bin/www
Restart=on-failure
[Install]
WantedBy=multi-user.target
$ sudo systemctl enable train-schedule.service
$ sudo systemctl start train-schedule.service
$ sudo systemctl status train-schedule.service
// Выгрузить если что-то пошло не так
// # systemctl stop train-schedule.service
// # systemctl disable train-schedule.service
http://192.168.0.11:3000/
OK
$ sudo chown -R deploy /opt/train-schedule/
Развертывание с Jenkins Pipelines
https://stackoverflow.com/questions/61105368/how-to-use-github-personal-access-token-in-jenkins/61105369#61105369
20. Развертывание с Jenkins Pipelines - Часть 1
Jenkins
Manage Jenkins -> Manage Plugins -> Available
- Publish Over SSH
Jenkins
Manage Jenkins -> Configure System
Publish over SSH
SSH Servers -> Add
Server1
Name: staging
Nostname: 192.168.0.11
Username:
Remote Directory: /
Server2
Name: production
Nostname: 192.168.0.12
Username:
Remote Directory: /
SAVE
Подготовка проекта на GitHub
Fork:
https://github.com/linuxacademy/cicd-pipeline-train-schedule-cd
В
https://github.com/wildmakaka/cicd-pipeline-train-schedule-cd
Удалить все бранчи кроме мастер.
Setup Jenkins
Jenkins -> Manage Jenkins -> Manage Credentials
Stores scoped to Jenkins -> Jenkins
Global credentials (unrestricted) -> Add Credentials
Username: deploy
Password: deploy
ID: webserver_login
Description: Webserver Login
OK
Создание нового задания
Jenkins -> New Item
Name: train-schedule
Type: Multibranch Pipeline
Branch Sources -> Github -> Credentials -> Add Jenkins
Kind: Username with password
Username: <Github-User-Name>
Password: <Github-API-Key>
ID: github_api_key_2
Description: GitHub API Key 2
Add
Credentials: GitHub API Key 2
Repostitory HTTPS URL: https://github.com/wildmakaka/cicd-pipeline-train-schedule-cd
Validate
Save
На этом шаге только сборка. Нет доставки.
20. Развертывание с Jenkins Pipelines - Часть 2
Заменить содержимое Jenkinsfile на
https://github.com/linuxacademy/cicd-pipeline-train-schedule-cd/blob/example-solution/Jenkinsfile
Меняю текст
https://github.com/wildmakaka/cicd-pipeline-train-schedule-cd/blob/master/views/index.jade
Запускаю jenkins job.
Все ок.