Thank you for reading this post, don't forget to subscribe!
Описание задачи: Создание 2х образов и выкатка их на 2 сервера.
перед запуском, настроим docker,
Установим докер если он не стоит:
yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce
usermod -aG docker $(whoami)
systemctl enable docker.service
systemctl start docker
Во первых правим Docker конфиг:
cat /etc/docker/daemon.json
# первый блок для гитлаба
{
"insecure-registries": ["GITLAB_IP:4567"]
}
{
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"experimental":true
}
Во вторых:
systemctl restart docker
логинимся вручную:
docker login IP_GITLAB:4567
вводим наш логин и пароль, после чего автоматически создаётся файл:
/root/.docker/config.json
proxies добавляется если необходимо использовать прокси сервер
[codesyntax lang="bash" container="none" capitalize="no" strict="no"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "auths": { "<span style="font-size: 12pt; font-family: georgia, palatino, serif;"><span lang="ru" style="font-weight: bold; color: #444444;">IP_GITLAB</span></span>:4567": { "auth": "YWJhYmtpbjpnZmhqa20xMjM=" } }, "HttpHeaders": { "User-Agent": "Docker-Client/18.09.0 (linux)" }<strong>, "proxies": { "default": { "httpProxy": "http://PROXY_SERVER:3128", "noProxy": "*.domain.local" } }</strong> } |
[/codesyntax]
В третьих:
Пользователь gitlab-runner должен быть добавлен в слудющие группы:
uid=992(gitlab-runner) gid=988(gitlab-runner) groups=988(gitlab-runner),10(wheel),994(docker)
Добавить можно следующим образом:
usermod -a -G docker gitlab-runner
usermod -a -G wheel gitlab-runner
Рестартуем Docker:
systemctl restart docker
В четвёртых:
Должна быть создана группа wheel, и добавлены следующие правила sudo
cat /etc/sudoers | grep wheel
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) NOPASSWD: ALL
С сервера с которого runer будет производить деплой, должны быть раскиданы ssh ключи (из под пользователя gitlab-runner )
[gitlab-runner@centos7 ~]$ ssh-keygen
[gitlab-runner@centos7 ~]$ ssh-copy-id gitlab-runner@noda1
[gitlab-runner@centos7 ~]$ ssh-copy-id gitlab-runner@noda2
Приступим
1. в гитлабе создаём проект, например testweb под своим пользователем в данном случае это user1
2. выкачиваем наш проект git clone http://IP_GITLAB/user1/testweb.git
3. создаём gitlabrunner, заходим под root в gtilab далее переходим в:
Admin area->Overview->Runners
После чего на сервере, где должен быть установлен/запущен раннер ЛУЧШЕ ИСПОЛЬЗОВАТЬ мультиранер выполняем команду:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
yum install gitlab-ci-multi-runner
gitlab-ci-multi-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
gitlab-ci-multi-runner start
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://IP_GITLAB/ здесь вводим адрес нашего гитлаба(посмотреть можно в Admin area->Overview->Runners)
Please enter the gitlab-ci token for this runner:
FyMR7FxzmodxqLqPEWSq токен который можно посмотреть в Admin area->Overview->Runners
Please enter the gitlab-ci description for this runner:
web_sborka1 название нашего ранера (любое)
Please enter the gitlab-ci tags for this runner (comma separated):
web_sborka1 любой тэг
Registering runner… succeeded runner=FyMR7Fxz
Please enter the executor: docker, shell, virtualbox, docker+machine, kubernetes, docker-ssh, parallels, ssh, docker-ssh+machine:
shell тип ранера
4. в домашней директории нашего проекта создаём 2 докерфайла:
dockerfile_apache_php53
dockerfile_apache_php54
содержимое данных файлов следующее.
cat dockerfile_apache_php53
FROM centos:6
MAINTAINER mid
RUN yum -y install httpd mod_ssl \
&& yum -y install php php-common php-gd php-mysql php-xml php-mbstring
EXPOSE 8053
ENV HOSTNAME apache_php53
ENV NAME apache_php53
VOLUME ["/etc/httpd/conf.d/", "/var/www/"]
ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]
cat dockerfile_apache_php54
FROM centos:6
MAINTAINER mid
RUN yum -y install wget \
&& wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm \
&& wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm \
&& rpm -Uvh epel-release-6-8.noarch.rpm remi-release-6.rpm \
&& yum -y install yum-utils \
&& yum-config-manager --enable remi-php54 \
&& yum -y install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo \
&& sed -i 's|Listen 80|Listen 8054|' /etc/httpd/conf/httpd.conf \
&& sed -i 's|#ServerName www.example.com:80|ServerName www.example.com:8054|' /etc/httpd/conf/httpd.conf
EXPOSE 8054
ENV HOSTNAME apache_php54
ENV NAME apache_php54
VOLUME ["/etc/httpd/conf.d/", "/var/www/"]
ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]
В файле предоставленном ниже описывается сборка образов и их деплой. Т.е. в первой стадии из наших докерфайлов будут созданы image и загружены в gitlab-registry,Сборка будет производиться на сервере noda0 на котором установлен runer web_sborka1
Во второй стадии будет производиться деплой на нужные нам сервера, так как данные действия будут производиться с сервера noda0 необходимо, чтобы пользователь gitlab-runner был создан на всех серверах, и добавлен в группу wheel у которой есть права через sudo выполнять действия от root, также необходимо разнести ssh ключи.
Мы будем использовать якоря они необходимы для того чтобы вызывать один и тот же код несколько раз. В нашем случае мы будем переопределять для якоря переменную HOST во время деплоя на различные сервера
cat .gitlab-ci.yml
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
stages: #Тут описываются стадии, в нашем случае их 2, создание образа, запуск контейнеров. - create_image - run_container variables: #Здесь описываем переменные project_name: 'testweb' #Имя проекта tag1: 'apache_php53' tag2: 'apache_php54' ssh_dostup: 'ssh ${LOGIN}@${HOST}' # В данной переменной используем короткую запись для удалённого подключения. Переменная LOGIN предварительно добавлена в гитлаб(чтоб не указывать её в открытом виде, в данной переменной пользователь gitlab-runner) (чтобы её задать, необходимо из под пользователя ababkin переходим в наш проект testweb далее settings -> CI/CD -> Variables и задаём имя ключ->значение после чего сохраняем) .autorizate_to_gitlab: &autorizate_to_gitlab | ssh ${LOGIN}@${HOST} docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} GITLAB_SERVER:4567 # Данная запись является ЯКОРЕМ, т.е. её можно вызывать сколько угодно рас и она будет выполнять описанные в ней действия (в данном случае подключение будет производиться к серверу указанному ниже в перенной HOST) .refrash_container_container1: &refrash_container_container1 | ssh ${LOGIN}@${HOST} "docker rm -f $tag1 || true" ssh ${LOGIN}@${HOST} "docker rmi -f GITLAB_SERVER:4567/ababkin/$project_name:$tag1 || true" ssh ${LOGIN}@${HOST} "docker pull GITLAB_SERVER:4567/ababkin/$project_name:$tag1" ssh ${LOGIN}@${HOST} "docker run -d --restart=always --name apache_php53 --hostname=apache_php53 -p 8053:8053 -v /etc/httpd/conf.d/docker53:/etc/httpd/conf.d/ -v /var/www/:/var/www/ GITLAB_SERVER:4567/ababkin/$project_name:$tag1" # В данном якоре будет производиться (1. удаление контейнера apache_php53 2.Удаление образа apache_php53 3.Скачивание из registry образа apache_php53 4.Запуск контейнера apache_php53) .refrash_container_container2: &refrash_container_container2 | ssh ${LOGIN}@${HOST} "docker rm -f $tag2 || true" ssh ${LOGIN}@${HOST} "docker rmi -f GITLAB_SERVER:4567/ababkin/$project_name:$tag2 || true" ssh ${LOGIN}@${HOST} "docker pull GITLAB_IP:4567/ababkin/$project_name:$tag2" ssh ${LOGIN}@${HOST} "docker run -d --restart=always --name apache_php54 --hostname=apache_php54 -p 8054:8054 -v /etc/httpd/conf.d/docker54:/etc/httpd/conf.d/ -v /var/www/:/var/www/ GITLAB_IP:4567/ababkin/$project_name:$tag2" create_image: # Первая стадия сборки образов variables: # Описание переменных HOST: 'IP1' # Определяем переменную HOST которая будет использоваться в якорях stage: create_image tags: - web_sborka1 # Указываем какой ранер будет производить все действия. only: #с помощью директивы only. Она определяет ветки, для которых будет создаваться пайплайн, а с помощью ключевого слова tags можно разрешить создавать пайплайн для тегов. К сожалению, директива only есть только для задач — её нельзя указать при описании стадии - master # Указываем что действия производятся на ветке мастер before_script: - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} GITLAB_IP:4567 # До запуска действий в скрипте логинимся в гитлабе script: - docker build -f dockerfile_apache_php53 -t GITLAB_IP:4567/ababkin/$project_name:$tag1 . - docker push GITLAB_IP:4567/ababkin/$project_name:$tag1 - docker rmi GITLAB_IP:4567/ababkin/$project_name:$tag1 - docker build -f dockerfile_apache_php54 -t GITLAB_IP:4567/ababkin/$project_name:$tag2 . - docker push GITLAB_IP:4567/ababkin/$project_name:$tag2 - docker rmi GITLAB_IP:4567/ababkin/$project_name:$tag2 after_script: - docker logout GITLAB_IP:4567 # Разлогиниваемся when: manual # Данные действия производятся вручную run_container1: # Запускаем сборку первого контейнера. variables: HOST: 'IP' # Определяем переменную которая будет использоваться в якоре. stage: run_container # Стадия запуск контейнера tags: - web_sborka1 only: - master before_script: - *autorizate_to_gitlab # Вызов якоря для авторизации в гитлабе - $ssh_dostup "if docker53 ; then sudo mkdir -p /etc/httpd/conf.d/docker53 ; else echo "OK dir exist"; fi" # Использование условия, которое проверяет наличие директории, если не создана,то создаёт. - $ssh_dostup "if docker54 ; then sudo mkdir -p /etc/httpd/conf.d/docker54 ; else echo "OK dir exist"; fi" script: - *refrash_container_container1 # Вызов якоря для установки первого контейнера - *refrash_container_container2 after_script: - $ssh_dostup "docker logout GITLAB_IP:4567" # Разлогиниваемся when: manual # Запускается вручную run_container2: variables: HOST: 'IP2' stage: run_container tags: - web_sborka1 only: - master before_script: - *autorizate_to_gitlab - $ssh_dostup "if docker53 ; then sudo mkdir -p /etc/httpd/conf.d/docker53 ; else echo "OK dir exist"; fi" - $ssh_dostup "if docker54 ; then sudo mkdir -p /etc/httpd/conf.d/docker54 ; else echo "OK dir exist"; fi" script: - *refrash_container_container1 - *refrash_container_container2 after_script: - $ssh_dostup "docker logout GITLAB_IP:4567" when: manual |
[/codesyntax]
5. Теперь необходимо загрузить данные вgit:
в директории с проектом выполняем:
git add .
git commit -m "our commit"
[master c8fd9bb] container manua35
1 file changed, 1 insertion(+)
git push -u origin master
после нужно ввести логин и пароль нашего пользователя в гитлабе. (Далее можно будет делать git push без указания ветки(add и commit также необходимы))
6. Для запуск а заданий вгитлабезаходим под пользователем ababkin - переходим в наш проект testweb - Repository - Commits - выбираем необходимый нам коммит, нажимаем на значёк рядом с "Pipeline"
и видим 3 задания:
Create_image Run_container1 Run_container2
которые мы можем запустить вручную.
-----------------------------------------------------------------------------------------------------------------------------------------------------
ниже предоставлен ещё один вариант .gitlab-ci.yml, он выполняет ту же задачу, но ранерами запущенными на серверах
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
stages: # описание всех стадий, в данном проекте их 2 - create_image - run_container variables: # описание переменных dir: '/root/TEEEEEEEEEEEEST/testweb' # директория в которой расположен наш проект project_name: 'testweb' tag1: 'apache_php53' tag2: 'apache_php54' tag3: '' create_image: # первая стадия, сборка образов и загрузка их в gitlab-registry stage: create_image tags: - web_sborka1 # название нашего ранера only: #с помощью директивы only. Она определяет ветки, для которых будет создаваться пайплайн, а с помощью ключевого слова tags можно разрешить создавать пайплайн для тегов. К сожалению, директива only есть только для задач — её нельзя указать при описании стадии - master # работает только на ветке мастер before_script: # до запуска билда логинимся в gitlabe - docker login -u $loginababkin -p $password GITLAB_IP:4567 # переменные $loginababkin и $password были предварительно добавлены в гитлаб(чтоб не указывать их в открытом виде) (из под пользователя ababkin переходим в наш проект testweb далее settings -> CI/CD -> Variables и задаём имя ключ->значение после чего сохраняем) - pwd script: #(Здесь описываем наши действия) - docker build -f dockerfile_apache_php53 -t GITLAB_IP:4567/ababkin/$project_name:$tag1 . #(собираем образ из докерфайла, используем переменные $project_name:$tag1 для того чтобы потом загрузить образ в наш registry) - docker push GITLAB_IP:4567/ababkin/$project_name:$tag1 # загружаем образ в registry - docker rmi GITLAB_IP:4567/ababkin/$project_name:$tag1 # удаляем образ - docker build -f dockerfile_apache_php54 -t GITLAB_IP:4567/ababkin/$project_name:$tag2 . - docker push GITLAB_IP:4567/ababkin/$project_name:$tag2 - docker rmi GITLAB_IP:4567/ababkin/$project_name:$tag2 after_script: # после окончания работы скрипта разлогиниваемся из registry - docker logout GITLAB_IP:4567 when: manual # при добавлении данного параметра, запуск задачи будет производиться вручную run_container: # вторая стадия stage: run_container tags: - runer_1 # ранер который запустит наши контейнеры на сервере 1 only: - master before_script: - pwd - docker login -u $loginababkin -p $password GITLAB_IP:4567 script: - docker rm -f $tag1 || true # тут получается - если контейнера нет, то выполнится команда true, которая просто вернет exit 0 и пайплайн дальше будет работать - docker rm -f $tag2 || true - docker rmi -f GITLAB_IP:4567/ababkin/$project_name:$tag1 || true - docker rmi -f GITLAB_IP:4567/ababkin/$project_name:$tag2 || true - docker pull GITLAB_IP:4567/ababkin/$project_name:$tag1 - docker pull GITLAB_IP:4567/ababkin/$project_name:$tag2 - docker run -d --restart=always --name apache_php53 --hostname=apache_php53 -p 8053:8053 -v /etc/httpd/conf.d/docker53:/etc/httpd/conf.d/ -v /var/www/:/var/www/ GITLAB_IP:4567/ababkin/$project_name:$tag1 - docker run -d --restart=always --name $tag2 --hostname=$tag2 -p 8054:8054 -v /etc/httpd/conf.d/$tag2:/etc/httpd/conf.d/ -v /var/www/:/var/www/ GITLAB_IP:4567/ababkin/$project_name:$tag2 after_script: - docker logout GITLAB_IP:4567 when: manual |
[/codesyntax]