如果我们要让 gitlab ci runner 使用docker容器,面临的问题是docker容器如何找到gitlab的DNS,所以我们选择一台新主机做DNS服务,配置步骤如下:

1.vagrant ssh swarm-worker1进入 node2 主机

docker run -d -p 53:53/tcp -p 53:53/udp --cap-add=NET_ADMIN --name dns andyshinn/dnsmasq

2.进入容器开始配置

docker exec -it dns sh
vi /etc/resolv.conf   # Add nameserver 8.8.8.8
vi /etc/dnsmasq.hosts # Add 192.168.2.100 gitlab.example.com
echo "resolv-file=/etc/resolv.conf" >> /etc/dnsmasq.conf
echo "addn-hosts=/etc/dnsmasq.hosts" >> /etc/dnsmasq.conf

3.回到宿主机重启容器

docker restart dns

4.进入gitlab-ci的node3 主机,执行

vi /etc/resolv.conf #Add nameserver 192.168.205.11,it seems just keep it so that it works!!

此处的 IP 是运行DNS服务容器的宿主机 IP,执行ping gitlab.example.com测试,如果成功说明 dns 服务配置成功。

5.注册两个 runner,一个针对python2.7,一个针对python3.4,自行修改 token 值


sudo gitlab-runner register \
  --non-interactive \
  --url "http://gitlab.example.com/" \
  --registration-token "PROJECT_REGISTRATION_TOKEN" \
  --executor "docker" \
  --docker-image python:2.7 \
  --description "gitlab-ci" \
  --tag-list "python2.7" \
  --run-untagged \
  --locked="false" \

  sudo gitlab-runner register \
  --non-interactive \
  --url "http://gitlab.example.com/" \
  --registration-token "PROJECT_REGISTRATION_TOKEN" \
  --executor "docker" \
  --docker-image python:3.4 \
  --description "gitlab-ci" \
  --tag-list "python3.4" \
  --run-untagged \
  --locked="false" \

最后用命令验证 sudo gitlab-ci-multi-runner verify 查看 runner 是否 alive,以下是输出结果:

Running in system-mode.

Verifying runner... is alive                        runner=dzbz1D7t
Verifying runner... is alive                        runner=Vi7MnTbK
Verifying runner... is alive                        runner=M1kW56Sn

好了,现在我们在gitlab项目上添加.gitlab-ci.yml 文件:


stages:
  - style
  - test
  - deploy
  
pep8:
  stage: style
  script:
    - pip install tox -i https://pypi.tuna.tsinghua.edu.cn/simple
    - tox -e pep8
  tags:
    - python2.7

unittest-py27:
  stage: test
  script:
    - pip install tox -i https://pypi.tuna.tsinghua.edu.cn/simple
    - tox -e py27
  tags:
    - python2.7

unittest-py34:
  stage: test
  script:
    - pip install tox -i https://pypi.tuna.tsinghua.edu.cn/simple
    - tox -e py34
  tags:
    - python3.4

docker-deploy:
  stage: deploy
  script:
    - docker build -t flask-demo .
    - if [ $(docker ps -aq --filter name=web) ]; then docker rm -f web;fi
    - docker run -d -p 5000:5000 --name web flask-demo
  tags:
    - test  #test是shell类型的runner
  only:
    - master #只有master分支变化,才做CD部署操作