使用GitLab-Runner实现项目自动部署

3,011 阅读2分钟

前言

项目开发时,经常修改了一两行代码就要发布到alpha测试站,beta测试站,正式站等多个服务器,如果是手工操作,就需要登录到每台服务器进行更新代码、打包代码、重启某些服务等一系列操作,这过程太繁琐且浪费时间。因此,可以使用 Gitlab-Runner代替手工操作,GitLab的安装可以参考《使用Docker自建代码托管平台GitLab》

安装GitLab-Runner

docker-compose.yml如下:

version: '3'
services:
  gitlab-runner:
    image: gitlab/gitlab-runner
    restart: always
    container_name: gitlab-runner
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./config:/etc/gitlab-runner

networks:
  default:
    driver: bridge

使用 docker-compose up -d 启动应用

注册Runner到GitLab服务器

  1. 查看Runner registration token

  2. 执行 docker exec -it gitlab-runner gitlab-runner register 进行注册

  3. 查看GitLab Runner,如下图,共享型Runner(所有项目都可以使用)注册成功

使用Runner部署代码

  1. 创建一个项目,这里使用Vue CLI快速创建一个前端项目

  2. 配置项目的环境变量,用于 .gitlab-ci.yml 文件。这里使用 Ansible 进行部署,由于部署每个项目所执行的操作基本上都是不一样的,也就意味着配置需要跟着项目走,所以把Ansible的配置写进项目变量里,这里根据你们实际需求去配置

  3. 在项目根目录下编写 .gitlab-ci.yml 文件,具体写法见官方文档

    variables:
      COMPILE_IMAGE: node:12.14.0-alpine
      ANSIBLE_IMAGE: ansible/centos7-ansible
    
    cache:
      key: "$CI_PROJECT_NAMESPACE"
      paths:
        - node_modules
    
    stages:
      - build
      - deploy
    
    build_alpha:
      only:
        - /^v\d+\.\d+\.\d+-alpha$/
      stage: build
      image: $COMPILE_IMAGE
      artifacts:
        name: "${CI_COMMIT_TAG}"
        paths:
          - dist/
      script:
        - npm config set registry https://registry.npm.taobao.org/
        - npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
        - npm install
        - npm run build
      allow_failure: false
    
    deploy_alpha:
      only:
        - /^v\d+\.\d+\.\d+-alpha$/
      stage: deploy
      image: $ANSIBLE_IMAGE
      variables:
        GIT_STRATEGY: none
      script:
        - mkdir ~/.ssh/
        - echo -e "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
        - chmod 600 ~/.ssh/id_rsa
        - export ANSIBLE_HOST_KEY_CHECKING=False
        - echo -e "${ANSIBLE_HOSTS}" > ~/hosts
        - echo -e "${ANSIBLE_PLAYBOOK}" > ~/playbook.yml
        - cd ./dist
        - tar zcf ../dist.tar.gz *
        - ansible-playbook ~/playbook.yml -i ~/hosts --extra-vars "{'server_name':'alpha_server'}"
      allow_failure: false
    

    通过打Tag触发CI pipeline,Runner负责执行.gitlab-ci.yml定义的任务,打包代码并部署到服务器,部署代码这里使用了Ansible
    hosts如下:

    [alpha_server]
    demo.com
    

    playbook.yml如下:

    - hosts: '{{ server_name }}'
      remote_user: root
      tasks:
      - name: upload code
        synchronize:
          mode: push
          src: /builds/root/demo/dist.tar.gz
          dest: /tmp/dist.tar.gz
          rsync_opts:
            - "--compress"
      - name: update code
        shell: cd /app && rm -rf * && tar zxf /tmp/dist.tar.gz && chown -R nginx:nginx *
    
  4. 打一个Tag( v0.0.1-alpha )进行测试,如下图,打包和部署两个任务都执行成功了,并且可以正常访问alpha测试站,自动化部署完成。