写在前面
本文主要讲的是当一个springboot
项目的代码提交之后,如何通过gitlab-runner
中的pipeline
脚本来自动完成编译、打包、部署、版本回退等功能。
非springboot
的项目也只是pipeline
的编译环节不同,其他的步骤也是相同的。
一、项目结构
必须的2个文件:
Dockerfile
用来打包成自定义的docker
镜像,这不是必须的.gitlab-ci.yml
用来在gitlab-runner
触发作业,文件内容就是一个pipeline
脚本
二、Dockerfile文件内容
这是springboot
官方提供的Dockerfile
:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/*.jar /app/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]
三、.gitlab-ci.yml文件内容
我直接在代码中加注释说明,不单独列出来了。
#声明当前脚本变量,这里声明了2个变量
#MAVEN_CLI_OPTS:是mvn命令的扩展补充,主要声明配置文件位置(如果项目需要不同的maven仓库,这里就指定不同的配置文件地址,直接放在项目源代码根目录中也行,例如 MAVEN_CLI_OPTS: "-s settings.xml")
#MAVEN_OPTS:是maven声明本地仓库存储的位置
variables:
MAVEN_CLI_OPTS: "-s /home/gitlab-runner/settings.xml"
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
#创建一个缓存,key的值随意
#paths:中有2个缓存内容:1:缓存了本地仓库;2:缓存即将编译生成的jar文件
cache:
key: maven-ci-cache
paths:
- .m2/repository
- target/*.jar
#前置脚本,在正式脚本执行前被执行
#声明了一些环境变量
#CI_COMMIT_SHORT_SHA:是当前git提交的记录id
#COMMIT_TIME:是根据提交记录获取提交的时间(暂时用不到)
#JAVA_HOME、JRE_HOME、CLASSPATH:手动声明jdk环境变量(这个不是必须的,如果不指定就会使用当前环境下的默认jdk编译)这个也不是必须的,如果这里不是java项目,可以不指定或者指定其他的,例如node等
#PROJECT_NAME:项目的名字,这个docker镜像生成后的名字,不要重复
#PROJECT_VISIT_PORT:docker外部端口,这会在docker宿主机上占用一个端口,不要冲突了
#PROJECT_LAUNCH_PORT:当前项目启动的端口
before_script:
- export COMMIT_TIME=$(git show -s --format=%ct $CI_COMMIT_SHA)
- export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
- export JRE_HOME=${JAVA_HOME}/jre
- export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
- export PROJECT_NAME=zhongche_base
- export PROJECT_VISIT_PORT=19001
- export PROJECT_LAUNCH_PORT=9000
#正式脚本
#定义job
#编译
#打包
stages:
- mvn_build_job
- build_docker_job
- clean_job
#使用mvn命令开始编译源代码,如果这里是gradle,那就是gradle,或者node等
mvn_build_job:
stage: mvn_build_job
script:
- mvn $MAVEN_CLI_OPTS clean compile package -Dmaven.test.skip=true -P sit
- echo "target:"`ls target`
#将编译好的程序文件使用docker打包,熟悉docker的都知道这几个命令的作用
#docker镜像的名字是前面填的[项目名:git记录id],可以根据这个id号回滚镜像
#启动的容器名就是前面填的[项目名]
build_docker_job:
stage: build_docker_job
script:
- docker build . -t $PROJECT_NAME:$CI_COMMIT_SHORT_SHA
- docker stop $PROJECT_NAME || true
- docker rm $PROJECT_NAME || true
- docker run --name $PROJECT_NAME -p $PROJECT_VISIT_PORT:$PROJECT_LAUNCH_PORT --privileged=true -d $PROJECT_NAME:$CI_COMMIT_SHORT_SHA
#后置脚本,在正式脚本执行后被执行
#清理任务,删除编译的运行文件
after_script:
- rm -rf target/
四、说明
主要需要关注.gitlab-ci.yml
这个文件,pipeline
基本上可以做到你要做的任何事情。我这里只是使用了它最简单的功能做了个演示。
五、gitlab-runner与Jenkins对比
-
gitlab-runner
与Jenkins
的设计思路是不同的,但是对于不是很复杂的项目来说,很大一部分实现是类似或相同的。另外在gitlab-runner
下跑的.gitlab-ci.yml
也可以直接在Jenkins
中使用。使用成本,上手难度,都差不多。如果走集中分发还是优先考虑Jenkins
,毕竟Jenkins
对于项目的定义,管理等都是集中式的,更加方便。如果项目个数不多,复杂程度也不高,直接用gitlab-runner
。 -
已有
Jenkins
就Jenkins
吧,没必要折腾。已有gitlab-runner
就gitlab-runner
,除非项目非常多,管理困难
评论区