[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



Запускаю приложение на серверах


$ 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/webmak1/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/webmak1/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/webmak1/cicd-pipeline-train-schedule-cd/blob/master/views/index.jade


Запускаю jenkins job.


Все ок.