Пример непрерывной интеграции gitlab-ci для запуска контейнеров

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"]

[/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"]

[/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"]

[/codesyntax]