Appearance
基于GitLab+docker的前端自动化构建部署(CI/CD)流程 
什么是CI/CD? 
CICD 是 持续集成(Continuous Integration)和持续部署(Continuous Deployment)简称。指在开发过程中自动执行一系列脚本来减低开发引入 bug 的概率,在新代码从开发到部署的过程中,尽量减少人工的介入。
持续集成:CI 
持续集成指在和向远程仓库 push 代码后,在这次提交合并入主分支前进行一系列测试,构建等流程。假设现在有个应用的代码存储在 gitlab 上,每天开发者都 push 很多次提交,针对每次 push,你可以创建一系列脚本进行自动测试,降低往应用里引入错误的概率。这就是持续集成,它可应用在包括开发分支在内的多个分支上。
持续部署:CD 
持续部署在持续集成的基础上更进一步,指将推送指仓库默认分支的部署至产品环境。如果这部分需要手动触发,这就是一个持续交付(Continuous Delivery)环节。
 Gitlab 内置了 CICD 工具,不需要使用第三方工具,所以我们使用gitlab-ci以及gitlab-runner来完成我们的前端自动化构建部署
实现原理 
前端发布流程基于gitlab-ci以及gitlab-runner,runner运行环境目前为docker,保证项目之间的开发版本不会有冲突,打包过后的前端包文件,通过rsync同步到静态资源文件中,通过监听master(生产环境)dev(开发环境)变动自动执行发布流程。
流程图 
实现步骤 
1.首先用docker+nginx部署项目
 2.在gitlab新建的项目的CI/CD配置中填写需要发布到服务器的相关信息
 3.将你所需要发布的项目下新建一个.gitlab-ci.yml文件,让gitlab去执行自动化流程
 4.打包构建,提交代码,触发钩子执行自动化构建发布
1.首先用docker+nginx部署项目 
docker下配置nginx部署vue项目步骤:
 1.docker pull nginx 下载nginx
 2.在/data /nginx(这里的/data /nginx就是服务器上前端静态资源的文件夹)路径下创建html,conf,conf.d三个文件夹,html下放npm run build打包后的静态文件
 3.conf下放nginx.conf,conf.d下放default.conf,nginx.conf和default.conf需要自己配置
 下面是nginx 模板文件 可以自己根据需要修改
 nginx default.conf配置:
server {
  listen       80;
  server_name  localhost;
  #charset koi8-r;
  #access_log  /var/log/nginx/host.access.log  main;
  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
  }
}nginx nginx.conf配置:
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
  worker_connections  1024;
}
http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  access_log  /var/log/nginx/access.log  main;
  sendfile        on;
  #tcp_nopush     on;
  keepalive_timeout  65;
        gzip on;
        gzip_disable "msie6";
        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 1;
        gzip_buffers 16 8k;
        gzip_http_version 1.0;
        gzip_min_length 256;
        gzip_types text/plain text/css
                   application/json application/x-javascript text/xml
                   application/xml application/xml+rss text/javascript application/javascript
                   application/vnd.ms-fontobject application/x-font-ttf font/opentype         image/svg+xml image/x-icon
                   image/jpeg image/gif image/png;
  include /etc/nginx/conf.d/*.conf;
}4.所有文件创建好之后,执行
docker run --name *容器名称*
-p 8088:80 -v /data/nginx/html:/usr/share/nginx/html -v
/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v
/data/nginx/log:/var/log/nginx -d nginx:1.13(镜像名称)常用docker指令操作:
 --name命名容器,
 -p映射端口比如8088:80,
 -v映射当前文件夹到镜像中的文件夹,
 -d后台运行容器,
 docker ps -a 查看容器,
 docker images -a 查看所有镜像,
 docker rm 容器id 删除容器,
 docker rmi 镜像id 删除镜像,
 docker start 容器id 运行容器,
 docker stop 容器id 停止容器
到这一步,就先完成了docker+nginx部署前端项目了,接下来是配置自动化构建发布
2.在gitlab新建的项目的CI/CD配置中填写需要发布到服务器的相关信息 
2.1Gitlab上项目中CI/CD中的variables变量配置(用在.yml里的,防止代码中泄露服务器信息) 
2.2接下来在服务器上操作,配置免密登录 
生产密钥对: ssh-keygen -t rsa,配置让gitlab服务器和前端代码服务器之间可以免密登录具体免密登录操作如下:
 登录服务器,cd .ssh 执行 ssh-keygen -t rsa命令,会生成id_rsa(秘钥)和id_rsa.pub(公钥)两个文件
js
cd .ssh
ssh-keygen -t rsa将公钥id_rsa.pub中的内容copy到authorized_keys中(做免密登录)
2.3服务器上用docker安装gitlab-runner 
用docker安装gitlab-runner:
js
docker pull gitlab/gitlab-runner:latest停止并删除现有容器:
js
docker stop gitlab-runner && docker rm gitlab-runner创建启动容器:
js
docker run -d --name gitlab-runner --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ gitlab/gitlab-runner:latest查看日志:
docker logs gitlab-runner2.4服务器上用docker注册gitlab-runner 
 docker注册runner
docker run --rm -t -i -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register接下来会提示你进行一系列的操作
 1.Please enter the gitlab-ci coordinator URL (e.g. gitlab.com ) gitlab.com
 输入您的GitLab实例URL:(gitlab中的CI/CD中的runner里面有)
 2.Please enter the gitlab-ci token for this runner xxx
 输入您获得的令牌来注册token:(gitlab中的CI/CD中的runner里面有)
 3.Please enter the gitlab-ci description for this runner [hostname] my-runner
 输入Runner的描述,稍后可以在GitLab的UI中进行更改:
 4.Please enter the gitlab-ci tags for this runner (comma separated): my-tag,another-tag
 输入与Runner有关的标签,稍后可以在GitLab的UI中进行更改:
 5.Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell: docker
 6.输入Runner执行者:
 Please enter the Docker image (eg. ruby:2.1): alpine:latest
 如果您选择Docker作为执行程序,则会要求您为未在以下项目中定义一个的项目使用默认映像:这里就输入alpine:latest就行了
到这一步服务器上就配置完成了
想要看自己的gitlab-runner启动没有,可以输入docker ps -a查看
3.将你所需要发布的项目下新建一个.gitlab-ci.yml文件,让gitlab去执行自动化流程 
3.1gitlab-ci.yml文件 
//做缓存的
cache:
  key: ${CI_PROJECT_NAME}
  paths:
    - node_modules/
//测试
# test_e2e:
#   image: cypress/browsers:chrome67
#   stage: test
#   script:
#     - npm i
#     - npm run test:e2e -- --headless --record --key b2a22185-8eeb-4f0e-9b21-2d61f769d8c7
#   only:
#     - master
//dev环境构建
dev:build:
  image: node
  stage: build
  script:
    - yarn
    - yarn build:dev
  only:
    - dev
  tags:
    - eye-runner
  artifacts:
    expire_in: 1 week
    paths:
      - dist //项目打包后的文件夹
//dev环境发布
dev:deploy:
  image: alpine:3.7
  stage: deploy
  script:
    - echo "http://mirrors.aliyun.com/alpine/v3.7/main/" > /etc/apk/repositories
    - apk add --no-cache rsync openssh
    - mkdir -p ~/.ssh
    - echo "$SSH_KEY_DEMO_PRIVATE" >> ~/.ssh/id_rsa
    - echo "$SSH_KEY_DEMO_PUB" >> ~/.ssh/id_rsa.pub
    - chmod 600 ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa.pub
    - echo -e "Host *\n\t StrictHostKeyChecking no \n\n" > ~/.ssh/config
    - rsync -rav --delete ./dist/ "$SERVER_DEMO_HOST:$SERVER_DEMO_PATH"//同步打包后的文件夹里的内容到nginx指定的静态资源文件夹
  only:
    - dev
  tags:
    - eye-runner3.2变量说明 
SERVER_DEMO_HOST:目标CICD服务器IP地址
 SERVER_DEMO_PATH:服务器上nginx指向的静态资源目录
 SSH_KEY_DEMO_PRIVATE: 服务器私钥
 SSH_KEY_DEMO_PUB:服务器公钥
3.3注意 
在webpack项目中配置导出的文件名为你需要同步的文件夹的名称,并且访问路径按需为相对路径,或者绝对路径,具体看项目需求。上面的./dist/就是我们项目中的打包后生成的文件夹
4.打包构建,提交代码,触发钩子执行自动化构建发布 
提交代码触发CI/CD流程 
然后在gitlab项目中的CI/CD流水线中能看到自己的刚刚触发的CI/CD任务,如下图所示
 
点击状态或者阶段都可以进入构建发布详情页面查看内容
构建:build 
发布:deploy 
至此,大功告成,妈妈再也不用担心我发布线上代码耗费时间和出错了
自动化构建发布(CI/CD)的优势 
项目建立仅需配置一次,即可实现自动化部署,docker环境与宿主环境不会发生环境上的冲突,gitlab控制权限,发布过程更为安全,添加自动化测试,项目上线更为省心。