工作中遇到项目搭建CI/CD基于Gtilab-runner + Docker ,同时部署了shipyard对Docker进行管理,开启CI/CD的项目可以实现,代码提交后自动build docker镜像,并生成相应的容器进行部署,可以有效减少本地开发环境到测试环境的工作量。同时后期生产环境可以直接采用容器部署,方便以后的运维。
开启CI/CD需要以下4步
1. 项目关联gitlab-runner
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的运行
同时还可以在这个网址管理自己的docker镜像
- 如果您的应用pipline失败 或者部署后无法从外网访问,请通过pipline点击具体流程查询报错,核实是否是端口冲突
- 部署后如果需要外网访问 请联系wangpengyao@cnic.cn 进行端口开放
- 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 "git@188.131.222.102:${1}/${2}.git" $deploy_path
cd $deploy_path
git checkout $3
else
cd $deploy_path
git pull
fi
fi
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。