在gitlab runner完成构建

时间:2016-09-09 18:07:17

标签: docker deployment gitlab-ci gitlab-ci-runner

我想使用gitlab运行器来部署成功构建的docker镜像,但我不知道如何在.gitlab-ci.yml中使用deploy阶段来执行此操作。构建日志显示在构建过程中在docker镜像上正确创建了数据库。

我在Mac(OSX 10.11.6)上本地使用docker来构建我的docker容器。 Gitlab正在远程运行。我注册了一个特定的本地跑步者来处理构建。当我将更改推送到我的项目时,gitlab CI运行构建脚本来创建测试数据库。它构建后的图像会发生什么?我的本地计算机上列出的已完成构建没有泊坞窗图像。 gitlab-runner-prebuilt-x86_64是一个与构建版本无关的准系统linux映像。

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

1 个答案:

答案 0 :(得分:2)

您未在CI上构建任何泊坞窗图片。

您正在使用DockerHub中的php7映像执行所有作业。这包括尝试使用deploy_job1二进制文件来推送不在该容器内的图像(docker)的作业deploy:latest。另外,我认为docker图像中不包含php7二进制文件。

我想你想要在Mac上推送你本地构建的图像,不是吗?在这种情况下,您需要使用另一个运行器,其执行器应为shell。在这种情况下,您将有2个跑步者,一个使用docker来运行build_job1作业,另一个使用推送本地构建的图像。但是有一个更好的解决方案,可以手动构建docker镜像,并且可以让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上安装了docker引擎。

另一方面,这个例子毫无意义,至少对我而言。 build阶段没有任何作用,因为容器是短暂的。我想你应该在Dockerfile上做到这一点。