развернуть после того, как gitlab runner завершит сборку

Я хочу использовать бегуны gitlab для развертывания успешно созданного образа докера, но я не уверен, как использовать для этого этап развертывания в .gitlab-ci.yml. Журнал сборки показывает, что база данных правильно создана в образе докера во время процесса сборки.

Я использую докер локально на Mac (OSX 10.11.6) для создания контейнера докеров. Gitlab работает удаленно. Я зарегистрировал конкретного локального раннера для обработки сборки. Когда я отправляю изменения в свой проект, gitlab CI запускает сценарий сборки для создания тестовой базы данных. Что происходит с изображением после его создания? На моем локальном компьютере нет образа докера для завершенной сборки. Gitlab-runner-prebuilt-x86_64 - это образ Linux для barebones, который не связан со сборкой.

https://docs.gitlab.com/ce/ci/docker/using_docker_build.html

http://container-solutions.com/running-docker-in-jenkins-in-docker/

>gitlab-ci-multi-runner list
Listing configured runners                          ConfigFile=/Users/username/.gitlab-runner/config.toml
local-docker-executor                               Executor=docker Token=[token] URL=http://gitlab.url/ci

>docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
gitlab-runner-prebuilt-x86_64   f6fdece             [id1]        25 hours ago        50.87 MB
php7                            latest              [id2]        26 hours ago        881.8 MB
ubuntu                          latest              [id3]        13 days ago         126.6 MB
docker                          latest              [id4]        2 weeks ago         104.9 MB

.gitlab-ci.yml:

image: php7:latest

# build_image:
#   script:
#     - docker build -t php7 .

# Define commands that run before each job's script
# before_script:
#   - docker info

# Define build stages
  # First, all jobs of build are executed in parallel.
  # If all jobs of build succeed, the test jobs are executed in parallel.
  # If all jobs of test succeed, the deploy jobs are executed in parallel.
  # If all jobs of deploy succeed, the commit is marked as success.
  # If any of the previous jobs fails, the commit is marked as failed and no jobs of further stage are executed.
stages:
  - build
  - test
  - deploy     

variables:
  db_name: db_test
  db_schema: "db_test_schema.sql"

build_job1:
  stage: build
  script:
    - service mysql start
    - echo "create database $db_name" | mysql -u root
    - mysql -u root $db_name < $db_schema
    - mysql -u root -e "show databases; use $db_name; show tables;"
    #- echo "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('root');" | mysql -u root   
    #- echo "run unit test command here"
  #Defines a list of tags which are used to select Runner  
  tags:
    - docker

deploy_job1:
  stage: deploy
  #this script is run inside the docker container
  script:
    - whoami
    - pwd
    - ls -la
    - ls /
    #Usage: docker push [OPTIONS] NAME[:TAG]
    #Push an image or a repository to a registry
    - docker push deploy:latest
  #gitlab runners will look for and run jobs with these tags 
  tags:
    - docker

config.toml:

concurrent = 1
check_interval = 0

[[runners]]
  name = "local-docker-executor"
  url = "http://gitlab.url/ci"
  token = "[token]"
  executor = "docker"
  builds_dir = "/Users/username/DOCKER_BUILD_DIR"
  [runners.docker]
    tls_verify = false
    image = "ubuntu:latest"
    privileged = false
    disable_cache = false
    volumes = ["/cache"]
  [runners.cache]

Dockerfile:

FROM ubuntu:latest

#https://github.com/sameersbn/docker-mysql/blob/master/Dockerfile
ENV DEBIAN_FRONTEND noninteractive                                      
ENV MYSQL_USER mysql                                                    
ENV MYSQL_DATA_DIR /var/lib/mysql                                       
ENV MYSQL_RUN_DIR /run/mysqld                                           
ENV MYSQL_LOG_DIR /var/log/mysql                                        
ENV DB_NAME "db_test"                                               
ENV DB_IMPORT "db_test_schema.sql"                                  

# RUN apt-get update && \
#       apt-get -y install sudo
# RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo
# USER docker
# CMD /bin/bash

RUN apt-get update                                                      \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server      
 # \
 # && rm -rf ${MYSQL_DATA_DIR}                                          \
 # && rm -rf /var/lib/apt/lists/*

ADD ${DB_IMPORT} /tmp/${DB_IMPORT}


# #RUN /usr/bin/sudo service mysql start                                                    \
# RUN service mysql start                                                   \
#  && mysql -u root -e "CREATE DATABASE $DB_NAME"                           \
#  && mysql -u root $DB_NAME < /tmp/$DB_IMPORT

RUN locale-gen en_US.UTF-8 \
    && export LANG=en_US.UTF-8 \
    && apt-get update \
    && apt-get -y install apache2 libapache2-mod-php7.0 php7.0 php7.0-cli php-xdebug php7.0-mbstring php7.0-mysql php-memcached php-pear php7.0-dev php7.0-json vim git-core libssl-dev libsslcommon2-dev openssl libssl-dev \
    && a2enmod headers 

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
RUN ln -sf /dev/stdout /var/log/apache2/access.log && \
    ln -sf /dev/stderr /var/log/apache2/error.log
RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR


#VOLUME [ "/var/www/html" ]
WORKDIR /var/www/html

EXPOSE 80 3306

#ENTRYPOINT [ "/usr/sbin/apache2" ]
#CMD ["-D", "FOREGROUND"]

#ENTRYPOINT ["/bin/bash"]

person maogenc    schedule 09.09.2016    source источник
comment
Я могу ошибаться, но ваш вопрос больше относится к Dockers, чем к Gitlabs, верно?   -  person rafa.ferreira    schedule 13.09.2016
comment
Я бы хотел, чтобы бегун GitLab развернул мой образ докера. Для этого, похоже, мне нужно, чтобы докер работал как служба на изображении либо через сокет, либо установив докер на образ.   -  person maogenc    schedule 13.09.2016


Ответы (1)


Вы не создаете образ докера на CI.

Вы используете образ php7 из DockerHub для выполнения всех заданий. Это включает задание deploy_job1, которое пытается использовать двоичный файл docker для отправки изображения (deploy:latest), которое не находится внутри этого контейнера. Кроме того, я думаю, что двоичный файл docker не включен в образ php7.

Я предполагаю, что вы хотите протолкнуть образ, который вы создаете локально на своем Mac, не так ли? В этом случае вам нужно использовать другой раннер, исполнитель которого должен быть shell. В этом сценарии у вас будет 2 бегуна, один из которых использует докер для выполнения задания build_job1, а другой - для отправки локально созданного образа. Но есть лучшее решение, которое создает образ докера вручную, и это заставляет GitLab CI создавать его.

Итак, изменение вашего .gitlab-ci.yml (удаление ваших комментариев, добавление мин для объяснения):

# Removed global image definition

stages:
  - build
  - test
  - deploy     

variables:
  db_name: db_test
  db_schema: "db_test_schema.sql"

build_job1:
  stage: build
  # Use image ONLY in docker runner
  image: php7:latest
  script:
    - service mysql start
    - echo "create database $db_name" | mysql -u root
    - mysql -u root $db_name < $db_schema
    - mysql -u root -e "show databases; use $db_name; show tables;"
  # Run on runner with docker executor, this is ok
  tags:
    - docker

deploy_job1:
  stage: deploy
  script:
    # Build the docker image first, and then push it
    - docker build -t deploy:latest .
    - docker push deploy:latest
  # Run on runner with shell executor, set proper tag
  tags:
    - docker_builder

Когда вы регистрируете новый исполнитель, установите исполнителя как shell и теги docker_builder. Я предполагаю, что вы установили движок докеров на свой Mac.

С другой стороны, этот пример не имеет смысла, по крайней мере, для меня. Стадия build ничего не делает, поскольку контейнер недолговечен. Думаю, вам следует сделать это в Dockerfile.

person charli    schedule 16.12.2016