gameFu's Blog

gitlab_develop_ci

March 15, 2016

使用ci将项目部署到服务器

runner配置

这篇文章中的服务器环境使用的是coreos,部署也是在docker中进行。runner是依然采用了上篇文章中使用的docker-runner执行

在runner服务器上执行下面这段命令,生成执行ci的docker

docker run -d --name gitlab-runner1 --restart always \
             -v /var/run/docker.sock:/var/run/docker.sock \
             -v /srv/gitlab-runner/config:/etc/gitlab-runner \
             -v /root/.ssh/id_rsa:/root/id_rsa \
             gitlab/gitlab-runner:latest

这里需要重点解释的是 -v /root/.ssh/id_rsa:/root/id_rsa \,这个命令会将runner服务器上的私钥挂载到容器里面,这么做的原因是执行部署的时候需要ssh连接到目标服务器上,必须先将服务器私钥挂载进去才能在docker里面连接到服务器(这种方法并不好)。当然,首先我们需要在服务器上配好密钥,并且将公钥放到目标服务器上,这里就不详细解释怎么做了。

接下来运行docker exec -it gitlab-runner gitlab-runner register 进行runner注册,我使用的executor是ssh,使用这个executor可以远程连接到目标服务器并进行操作

Please enter the gitlab-ci tags for this runner (comma separated):
docker-develop
Registering runner... succeeded                     runner=_m_ivm6R
Please enter the executor: ssh, shell, parallels, docker, docker-ssh, virtualbox:
ssh
Please enter the SSH server address (eg. my.server.com):
xxxxx
Please enter the SSH server port (eg. 22):
22
Please enter the SSH user (eg. root):
root
Please enter the SSH password (eg. docker.io):

Please enter path to SSH identity file (eg. /home/user/.ssh/id_rsa):
/root/id_rsa

注意:最后要求填入SSH identity file的路径是指容器内id_rsa的路径,而不是runner服务器的id_rsa的路径

如果需要修改runner的配置,可以去find config.toml ,里面配置了runner的所有信息

deploy.sh

这里我将部署的工作写在了bash脚本里,然后执行ci时,直接执行这段脚本即可,这里只演示最简单的部署工作


#!/bin/bash
containerName=action_cable
imageName=daocloud.io/gamefu/action_cable:latest

echo "镜像名{$imageName}"

# 拉取最新镜像
docker pull $imageName
# 删除老容器
docker stop $containerName
docker rm $containerName
# 运行新容器
docker run --name $containerName \
          -e LANG=C.UTF-8 \
          -e RAILS_ENV=production \
          --link action_cable_mysql:mysql \
          -d $imageName


.gitlab-ci.yml

ci设置


staging_build:
  script:
    - source stag_deploy.sh
  only:
    - develop
  tags:
    - docker-develop
  type: deploy


only设置只有在develop分支合并或者push新内容时,执行这个ci

这样一来基本的ci部署完成了。。

总结

这篇文章算是我在爬坑的记录,后来我跟同事讨论,并且仔细一想之后,有几点觉得可以改进,首先是runner,由于ci做部署的时候,需要使用ssh连接到服务器,所以executor需要用ssh,而ssh本来就不应该运行到docker runner里面,而是应该直接运行到runner服务器上,这样就避免了很多像id_rsa找不到的各种坑,以及在做测试的时候遇到需要docker-login的时候,需要将/root/.docker/config.json挂载到docker里面的情况

经过这次爬坑后,个人觉得,runner应该直接安装在服务器上,test-ci使用docker executor,使用docker executor就能避免很多环境依赖问题, develop-ci使用ssh executor是更加合理的做法