Gitlab CI/DI 使用

  工作中遇到项目搭建CI/CD基于Gtilab-runner + Docker ,同时部署了shipyard对Docker进行管理,开启CI/CD的项目可以实现,代码提交后自动build docker镜像,并生成相应的容器进行部署,可以有效减少本地开发环境到测试环境的工作量。同时后期生产环境可以直接采用容器部署,方便以后的运维。

  开启CI/CD需要以下4步

1. 项目关联gitlab-runner

Gitlab CI/DI 使用_第1张图片

2. 项目根目录中编写Dockerfile文件

  以下代码以本项目为例作为说明,基本思路是先用docker mvn镜像进行打包,然后在用打包好的jar组装一个可执行springboot的镜像

#从自己构建的阿里云mavenDocker中拉取maven镜像
#避免重复下载依赖性包
FROM registry.cn-hangzhou.aliyuncs.com/wangpengyao/maven as mvn-stage
MAINTAINER wangpengyao
WORKDIR /app
COPY . .
#需要指定docker中setting文件的位置
RUN mvn clean package --settings /usr/share/maven/ref/settings.xml -Dmaven.test.skip=true

FROM java:8 as production-stage
MAINTAINER wangpengyao
VOLUME /tmp
COPY --from=mvn-stage /app/target/dataforsea_bg-0.0.1-SNAPSHOT.jar /mvn-app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/mvn-app.jar"]
如果您的项目是vue前端程序,可以参考下面的Dockfile文件
基本流程是先用一个node镜像对项目进行编译,然后在用编译好dist生成一个nigix镜像
FROM node as build-stage
MAINTAINER wangpengyao
WORKDIR /app
COPY package*.json ./
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
RUN cnpm install
COPY . .
RUN npm run build

# production stage
FROM nginx as production-stage
MAINTAINER wangpengyao
COPY --from=build-stage /app/dist /usr/share/nginx/html/

3. 项目根目录构建.gitlab-ci.yml文件(注意该文件是以.开头)

  这个yml文件是对gitlab-runner运行步骤的指挥脚本,也就是说,当我们的代码上传到git后,会触发runner根据这个yml文件进行打包和部署。
如果您的工程是springboot撰写的后台程序,其内容可以参照一下内容构建自己的.gitlab-ci.yml

#共3个步骤 
#step1 从git仓库clone到/data/wwwroot工作目录
#step2 根据上一步定义的Dockfile生成镜像
#step3 根据镜像构建部署业务的容器
stages:
  - clone
  - build
  - run

clone-web_job:
  stage: clone
  only:
    - master
  script:
    #deploy是自定义的脚本位置在 gitlab-runner用户目录下
    #作用是将 param1分组下的param2项目的param3分支 clone到/data/wwwroot下
    - bash deploy wangpengyao dataforsea_bg master

docker-web_job:
  stage: build
  only:
    - master
  script:
    #source环境
    - source /etc/profile
    #切换到clone步骤的目录
    - cd /data/wwwroot/master/wangpengyao/dataforsea_bg
    #停止并删除目前正在运行的docker容器
    # && true=0 || false=1 用来防止 退出码 导致 pipeline 终止
    - docker stop data-for-sea-bg && true=0 || false=1
    - docker rm data-for-sea-bg && true=0 || false=1
    #创建新的docker镜像
    - docker build -t data-for-sea-bg .
    #删除build镜像过程中可能产生的none镜像
    - docker rmi $(docker images | grep "none" | awk '{print $3}') && true=0 || false=1

ops-web1_job:
  stage: run
  only:
    - master
  script:
    #运行镜像
    #镜像中的springboot服务端口和项目路径在application.yml中定义
    #log输出也可以在application.yml指定到容器的/logs文件夹下 然后通过 -v绑定到宿主机便于查看
    #-p 宿主机端口:容器端口 -v 宿主机目录:容器目录 -d 后台运行 --name 容器名称 镜像名称
    # 提醒 :如果您的应用需要很多的文件交互 请注意合理使用-v绑定宿主机目录
    - docker run -p 7071:7071 -v /data/wwwroot/logs/dataforsea_bg:/logs -d --name data-for-sea-bg data-for-sea-bg

  如果项目是Vue前端 可参照以下内容

stages:
  - clone
  - build
  - run

clone-web_job:
  stage: clone
  only:
    - master
  script:
    - bash deploy wangpengyao dataforsea_vue master

docker-web_job:
  stage: build
  only:
    - master
  script:
    - source /etc/profile
    - cd /data/wwwroot/master/wangpengyao/dataforsea_vue
    - docker stop data-for-sea-vue && true=0 || false=1
    - docker rm data-for-sea-vue && true=0 || false=1
    - docker build -t data-for-sea-vue .
    - docker rmi $(docker images | grep "none" | awk '{print $3}') && true=0 || false=1

run-web_job:
  stage: run
  only:
    - master
  script:
    - docker run -p 3000:80 -d --name data-for-sea-vue data-for-sea-vue

4. 提交你的项目到到master分支,或者提交到自己的分支然后merge到master

  系统配置的runner触发条件是,当监听到push或者merge到主分支版本时,进行pipline工作,只要你的代码在本地mvn后可以jar包运行,或者npm build 之后可以正确的运行,那么您的应用也就能在服务器上正确的部署运行。

您可以从gitlab的下面的界面监管pipline的运行

Gitlab CI/DI 使用_第2张图片

  同时还可以在这个网址管理自己的docker镜像

  • 如果您的应用pipline失败 或者部署后无法从外网访问,请通过pipline点击具体流程查询报错,核实是否是端口冲突
  • 部署后如果需要外网访问 请联系[email protected] 进行端口开放
  • shipyard 提供镜像下载功能,同时大家也可以尝试https://cr.console.aliyun.com/ 关联gitlab的项目来构建自己的docker仓库
  • 下面是第三步中使用的runner clone阶段调用的deploy脚本内容,有兴趣的同事可以参考一下以后构建自己的git-runner时使用
if [ $# -ne 3 ]
then
      echo "arguments error!"
      exit 1
else
      deploy_path="/data/wwroot/$3/$1/$2"
      if [ ! -d "$deploy_path" ]
      then
          git clone "[email protected]:${1}/${2}.git" $deploy_path
          cd $deploy_path
          git checkout $3
      else
          cd $deploy_path
          git pull
      fi
fi

你可能感兴趣的:(Gitlab CI/DI 使用)