基于docker实现gitlab + gitlab-ci + gitlab-runner 前端自动化部署

2,442 阅读3分钟

一、安装docker、docker-compose

首先服务器环境为centos7

1、安装docker

yum install docker

2、安装docker-compose

pip install docker-compose

二、使用docker-compose安装gitlab、gitlab-runner

1、创建docker-compose.yml文件

    version: "3"
    services:
      gitlab:
        container_name: gitlab
        image: gitlab/gitlab-ce
        restart: always
        ports:
        - "8443:443"
        - "8880:80"
        - "8822:22"
        volumes:
        - "./srv/config:/etc/gitlab"
        - "./srv/logs:/var/log/gitlab"
        - "./srv/data:/var/opt/gitlab"
        privileged: true
      gitlab-runner:
        container_name: gitlab-runner
        image: gitlab/gitlab-runner
        restart: always
        volumes:
        - "./gitlab-runner/config:/etc/gitlab-runner"
        - "/var/run/docker.sock:/var/run/docker.sock"
        privileged: true

2、在docker-compose.yml文件同级创建容器挂载目录

3、在docker-compose.yml目录下运行

docker-compose up -d

ps:gitlab镜像比较大需要等待一段时间,加速的话可以使用国内镜像加速

4、使用docker ps 查看是否有两个容器正在运行,

运行成功后在浏览器输入http://your_ip:8880查看gitlab

三、本地创建一个前端项目(create-react-app myapp或其他)并上传到gitlab

上传不做介绍

四、使用gitlab-runner

1、注册gitlab-runner

    运行命令:sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
    Please enter the gitlab-ci coordinator URL:
    示例:http://gitlab.alibaba-inc.com/ci
    Please enter the gitlab-ci token for this runner:
    xxxxxx
    Please enter the gitlab-ci description for this runner:
    示例:qd_api_runner(描述这个runner)
    Please enter the gitlab-ci tags for this runner (comma separated):
    示例:build(后面要用)
    Whether to run untagged builds [true/false]:
    true
    Please enter the executor: docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine:
    docker
    Please enter the default Docker image (e.g. ruby:2.1):
    node

coordinator URL和token在下图中设置runner的地方复制

2、在gitlab上设置部署服务器的公钥私钥(为了后续 免密传输打包完成的文件)

1)在项目部署服务器上生成.ssh (参考其他教程)
2)在.ssh文件夹的authorized_keys文件中添加生成公钥
3)编辑/etc/ssh/sshd_config文件,将下图三行打开注释没有的话手动添加,重启ssh

4)将生成的公钥和私钥按照下图填写

3、在项目根目录创建.gitlab-ci.yml文件

    variables:  # 变量,可根据情况定义。gitlab也提供许多预置变量
    image: docker.io/node
    stages:   # 流水线阶段,不同阶段是串行执行,stage下面的jobs却是并行执行
    - build
    before_script:  # 在每个job执行前触发
    #创建ssh目录
    - mkdir -p ~/.ssh
    #读取Settings->CI/CD->Secret variables 添加的公钥变量
    - echo "$ID_RSA_PUB" > ~/.ssh/id_rsa.pub
    #读取私钥变量,并设置权限为600(必须要600,否则报错)
    - echo "$ID_RSA" > ~/.ssh/id_rsa && chmod 0600 ~/.ssh/id_rsa
    #收集主机公钥,写入known_hosts,避免出现Are you sure you want to continue connecting (yes/no)?
    #注意:ecdsa是针对centos7系统的,如果是centos6 需要使用rsa
    #以下命令是将各个环境的主机公钥写入docker容器的~/.ssh/known_hosts文件
    - ssh-keyscan -H -t ecdsa -p 部署服务器端口 部署的服务器 >> ~/.ssh/known_hosts
    - npm install # 安装依赖包
    cache:  # 创建node_modules缓存,不用每次都重新安装依赖了
      key: ${CI_BUILD_REF_NAME}  # gitlab内置变量
      paths:
      - node_modules/
    build:
      stage: build
      script:
      - npm run build
      - scp -r ./dist/* 部署的服务器:项目部署的文件
      only:
      - master   # 表示该job只在master分支上执行
      allow_failure: false   # 表示该job不允许失败,若失败则表示这次CI失败
      tags:
      - build #这个tag名称就是第一步注册gitlab-runner填写的tag名称
文件中$ID_RSA_PUB和$ID_RSA就是在gitlab中配置的两个变量

五、半自动化部署

前面打包前端文件已经实现自动化,但是打包完成的文件部署还是手动起一个docker的nginx容器

简单学习一下前端的自动化部署,后续再看看其他的前端部署方案,在.gitlab-ci.yml中还可以添加代码规范验证

六、参考文章

linux下ssh公钥验证的设置和远程登录

前端gitlab-ci实现自动化部署