侧边栏壁纸
博主头像
术业有道之编程博主等级

亦是三月纷飞雨,亦是人间惊鸿客。亦是秋霜去叶多,亦是风华正当时。

  • 累计撰写 99 篇文章
  • 累计创建 50 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

gitlab-runner使用pipeline自动构建发布springboot项目

Administrator
2021-08-27 / 0 评论 / 0 点赞 / 371 阅读 / 4694 字

写在前面

本文主要讲的是当一个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-runnerJenkins的设计思路是不同的,但是对于不是很复杂的项目来说,很大一部分实现是类似或相同的。另外在gitlab-runner下跑的.gitlab-ci.yml也可以直接在Jenkins中使用。使用成本,上手难度,都差不多。如果走集中分发还是优先考虑Jenkins,毕竟Jenkins对于项目的定义,管理等都是集中式的,更加方便。如果项目个数不多,复杂程度也不高,直接用gitlab-runner

  • 已有JenkinsJenkins吧,没必要折腾。已有gitlab-runnergitlab-runner,除非项目非常多,管理困难

个人公众号

0

评论区