本文的目标是构建一个用于开发的持续集成环境,简单来说就是程序员写完代码,一旦push,测试环境就更新了,这样测试人员就可以去测试bug是不是改好了。需求简单粗暴,实现起来还是得费点事。当然所谓CI,远比本文的介绍来的高端,后续博客我会继续研究。

好了,开工

首先感谢下,本文着重参考的几篇文章:
Angular 容器部署Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)GitLab RunnerDocker — 从入门到实践

1.工欲善其事,必先利其器

docker

gitlab

  • 安装gitlab,由于我很早就装了gitlab,版本还停留在9.2.7,这次架构CI,本来想要升级到最新版本的,因为听说11.x的版本有个auto devops,应该可以省去很多配置。不过gitlab的升级不能跨大版本,后面我也就没升级了。
  • 安装gitlab-runner,参考官方文档Install GitLab Runner manually on GNU/Linux这里注意要把gitlab-runner这个用户加到之前建立的docker用户组里面,命令为
  • usermod -aG docker gitlab-runner
  • 创建gitlab项目,设置gitlab-runner。创建项目比较简单,我们肯定也已经有了不少项目了。找一个项目,设置这个项目的Specific Runners。由于gitlab版本不同,设置的地方可能大同小异。我这个版本如下:

    上图中绿框中即我针对这个项目设置的gitlab runner,至于如何设置,其实是要到安装gitlab-runner的服务器上面注册,注册的过程中会用到上图红框中的信息。注册的命令为
gitlab-runner register
  • 执行者选shell

2.交出大日如来咒

Dockerfile

以下是针对angular项目的dockerfile,其他项目类似。具体如何配置,不在本文赘述了。

# Stage 1
FROM node:latest as node

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run dev

# Stage 2
FROM nginx:latest

RUN rm -rf /usr/share/nginx/html/*

COPY --from=node /usr/src/app/dist/demo /usr/share/nginx/html

COPY _nginx/default.conf /etc/nginx/conf.d/

CMD ["nginx", "-g", "daemon off;"]

docker-compose.yml

version: '2.3'

services:
  demo:
    hostname: localhost
    container_name: demo-container
    build: .
    ports:
      - 8001:80

.gitlab-ci.yml

这个文件是核心,当然这个文件里面的很多配置我还没去深入研究,目前这个只是最精简版本。只用到了job,stage,only,script几个参数,其中script里面的脚本即用来构建docker容器的。

deploy_stage:
  stage: deploy
  only:
    - master
  script:
    - docker-compose up -d --build --force-recreate

以上三个文件,是docker和gitlab-ci的核心配置文件,必须放在项目的根目录。

万事俱备只欠东风

接下来只要,我们做一次push,gitlab-ci就能接受到这次push,然后调用设置的runner去执行.gitlab-ci.yml中写的脚本了,即将我们的项目容器更新一遍。

容器化搭建的gitlab一直重启 gitlab docker持续集成_容器化搭建的gitlab一直重启

补充

nginx

在dockerfile里面有这么一行配置

COPY _nginx/default.conf /etc/nginx/conf.d/

即将项目里面预先设置好的nginx conf文件,拷贝到docker里面nginx中,然后在127.0.0.1:8001中运行,这样,我们就在物理服务器中nginx反向代理到docker中的nginx了。具体配置参考这里Angular 容器部署

遇到的几个问题:
  1. sudo netstat -ntpl
    只显示tcp6的,但其实是监听了tcp的,所以不用理会。但我确实碰到nginx无法反向代理到127.0.0.1的情况,然后我大概是通过关闭防火墙解决的,这里有待确认!
  2. npm install的时候提示node-sass无法下载,然后它自动编译了一个,这里确实浪费了资源,但好在npm install 只在第一次构建的时候会跑,在package.json不改变的情况下,无需理会这个问题
  3. 用gitlab-runner启动docker时候报错 Couldn’t connect to Docker daemon at http+docker://localunixsocket - is it running? 解决方式为:将gitlab-runner的用户加入docker组,usermod -aG docker gitlab-runner
  4. sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner报错,参考sudo 执行提示 Command not found