gitlab上CI/CD的一些小實踐和理解

前言

之前用jenkins做的CI/CI,現在在新公司的業務CI/CD的流程是全部跑在gitlab上面,弄了一兩天終於算是能完全跑通了,其實歸根到底還是要把持續集成的部署給拆開成鏈式的,一步步執行,即使每次迭代一點點東西也可以使得邏輯依然清晰。

我這裏主要記錄三個主流程,代碼只是部分展示,不能實踐,只是簡單的記錄下自己的操作思路。

三個流程:

編譯代碼–打包成鏡像推送到registry–遠程讓指定服務器拉取代碼部署系統

.gitlab-ci.yml的編寫

image: golang:1.9.2
#三個主流程分別是build,build_docker,deploy
stages:
  - build
  - build_docker
  - deploy
#設置最終推送的鏡像名變量
variables:
  MAIN_IMAGE: registry.yun-ti.com/liweidong/picautoframe:$CI_COMMIT_REF_NAME

#編譯go代碼
build_main:
  stage: build
  only:
    - master@liweidong/picautoframe   #這裏就是要編譯的gitlab代碼地址,only表示只有master或者 打了tag的推送纔會觸發
    - tags@liweidong/picautoframe
  artifacts:
    name: bin-files
    paths:
    - bin
    expire_in: 1 week
  script:
    - cd $GOPATH/src
    - ln -sf $CI_PROJECT_DIR picautoframe # 把工程目錄映射到GOPATH的src文件夾下
    - cd picautoframe/pic/main
    - go build -o $CI_PROJECT_DIR/bin/picautoframe  #編譯
  tags:
    - docker
#打包鏡像
build_main_docker:
  image: docker:stable-dind
  only:
  - master@liweidong/picautoframe
  - tags@liweidong/picautoframe
  stage: build_docker
  services:
  - name: docker:stable-dind
    entrypoint: ["dockerd-entrypoint.sh", "--registry-mirror=http://f2d6cb40.m.daocloud.io"]
  before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD registry.yun-ti.com   #登陸registry
  script:
  - echo "build main image:"
  - docker build -t $MAIN_IMAGE -f ./deep.Dockerfile .    #根據Dockerfile生成鏡像,deep.Dockerfile 我會在後面給出
  - docker push $MAIN_IMAGE   #推送鏡像
  tags:
  - docker

#拉取鏡像並運行
deploy_sys_test:
  image: centos:7
  only:
  - master@liweidong/picautoframe
  - tags@liweidong/picautoframe
  when: manual    #manual表示要手動操作,前面兩步都是自動的
  stage: deploy
  variables:
    DEEP_CONTAINER_NAME: "picautoframe"
    ENV_DEEP_ADDR: "119.3.x.xxx"         #遠程部署主機的ip
    ENV_DEEP_ENV_ROOT_PWD: *** # 密碼
    ENV_DEEP_NAME: "picautoframe"
    ENV_DEEP_PORT: "21006"   #端口
    ENV_DEEP_HTTPS_PORT: "21007"
    ZYL_REG_PWD: "xxxx"   #登陸遠程主機的密碼
  environment:
    name: test_env
    url: 119.3.x.xxx   #遠程部署主機的ip
  before_script:
  - echo "start deploy"
  - yum -y update
  - yum -y install epel-release
  - yum -y install fabric
  script:
  - echo "start deploy"
  - fab -f $CI_PROJECT_DIR/contrib/deploy_deep.py deploy   #用python的fabric遠程部署 
  tags:
  - docker

deep.Dockerfile

FROM centos:7

MAINTAINER "[email protected]"

ENV TZ "Asia/Shanghai"

COPY bin/picautoframe /usr/local/bin/
COPY contrib/config.yml.tpl /etc/picautoframe/
COPY contrib/picautoframe.sh /usr/local/bin/

VOLUME /var/log/picautoframe

WORKDIR /usr/local/bin

picautoframe

簡單的dockerfile,主要是複製編譯後的代碼到docker裏面,掛載一個文件夾,然後直接運行二進制go文件

deploy_deep.py

from fabric.api import *
from fabric.contrib.files import *
import os


env.user = 'root'
env.password = os.environ.get('ENV_DEEP_ENV_ROOT_PWD')  #這些變量都是前面.gitlab-ci.yml已經設置好的
env.hosts = [os.environ.get('ENV_DEEP_ADDR')]
#先拉取鏡像,然後運行
def deploy():
    run('docker login -u liweidong -p %s registry.yun-ti.com' % os.environ.get('ZYL_REG_PWD'))
    run('docker pull %s' % os.environ.get('MAIN_IMAGE'))
    with settings(warn_only=True):
        run('docker rm -f %s' % os.environ.get('DEEP_CONTAINER_NAME'))
# --net=host模式表示docker直接使用宿主機的端口和ip
    run( ('docker run -d --name=%s --net=host --restart=always'
          ' -v /var/log/picautoframe/picautoframe.log:/var/log/picautoframe/picautoframe.log'
          ' -e DEEP_NAME="%s" '
          ' -e DEEP_LISTEN_ADDR="%s" -e DEEP_HTTP_PORT=%s %s'
          ) % (os.environ.get('DEEP_CONTAINER_NAME'),
               os.environ.get('DEEP_CONTAINER_NAME'),
               os.environ.get('ENV_DEEP_ADDR'),
               os.environ.get('ENV_DEEP_PORT'),
               os.environ.get('MAIN_IMAGE')))

總結

其實看着文件腳本很多,就是就是簡單的三步,根據流程去套腳本,當然還可以有更多的步驟,包括測試,代碼檢查等等,實際上還有很多有意思的腳本都可以選擇性的寫在裏面,當然我現在理解的也不是很深,但是感覺CI/CD是個一勞永逸的過程,之前傳統的部署方式確實讓人頭疼,大多數都是重複勞動,而且看不見迭代的過程,CI/CD的一套東西既可以規避人力重複的錯誤,又可以節省很多勞動力,還可以清晰的看到整個項目的迭代過程,我們都應該去擁抱它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章