本文共 4771 字,大约阅读时间需要 15 分钟。
gradle bootjar
打出一个可执行的Spring Boot的Jar包gradle test
以上只是个人理解,如果有不妥之处请提出来。本篇暂时不讲持续部署(CD)
实际开发中,都是多人进行开发。提交的时候也可能是多人同时提交,这时会触发多个CI。因为每个开发者开发的功能点不同,所以需要在不同的环境下进行CI,这样就要求不同的CI环境能够隔离。通过Gitlab-Runner的Docker执行器能够很好的做到这点,但是CI的数据库怎么指定?总不能每个人都改配置文件,修改成自己的数据库吧。所以这时需要实现每个分支的CI能够对应不同的数据库,这点可以通过启动jar时指定环境变量,比如每次提交的Commit号等,通过使用这个环境变量作为数据库名就可以实现这点(当然也可以使用容器内的数据库,这样也可以隔离,但是本人没有实现所以不做介绍了)。
实现一个简单的新增学生信息来作为示例
代码在最后链接中
这里就随便写个示例,单元测试的代码项目中都有
在最后的代码链接中
可参考:博客园的:
这里我的思路是新建一个仓库,这个仓库的代码模拟服务调用者。数据的话可在integration-test通过gradle命令装载集成测试数据(实现可以在test中实现代码,通过gradle或其他方式执行数据装载)。在gitlab-ci的integration-test阶段,通过git把服务调用者clone下来,通过gradle打成可执行jar,然后运行。具体实现掠过
server: port: 8880spring: datasource: type: com.alibaba.druid.pool.DruidDataSource # ${CI_COMMIT_SHA}指的是每次提交的commit号,我们每次使用这个作为数据库名,将不同用户的ci隔开,数据库在ci的第一阶段创建 url: jdbc:mysql://192.168.23.102:3306/${ CI_COMMIT_SHA}?useUnicode=true&characterEncoding=utf-8&useSSL=false username : root password : root123 driverClassName : com.mysql.jdbc.Driver jpa: hibernate: naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl ddl-auto: update show-sql: true
这里提供一个mysql的镜像,能够通过shell创建数据库: virtuex/mysql_env:mysql-5.7-openjdk-7,
下面是.gitlab-ci.yml的配饰文件,每部的作用在注释中体现
# 指定基础镜像image: virtuex/base_java_env:gradle-4.10.2-openjdk-7-openjdk-8-docker-18# 定义stagestages: - build_db - build - unit-test - integration-test# 这个job主要是为了创建数据库,官方提供的service因为我没有使用成功,所以这里采用alphin镜像,并安装mysql客户端,以执行mysql命令gitab_mysql_service: stage: build_db image: alpine:latest script: - apk --no-cache add mysql-client - sh src/test/bin/create_database.sh# 因为基础镜像默认用的1.7,这里切换成1.8before_script: - echo "Reset JDK..." - export JAVA_HOME=$JAVA8_HOME - export PATH=${ JAVA_HOME}/bin:$PATH# 这个job主要是为了生成build/classes/test这个文件夹,否则下个阶段执行sonar命令会失败build_job: stage: build script: - echo "Release build..." - gradle testClasses# 单元测试、代码静态检查、单元测试覆盖率检查等test_job: stage: unit-test script: - echo "Unit Tests run..." - gradle test - gradle jacocoTestReport - gradle testClasses - gradle -b sonarqube.gradle sonarqube -Dsonar.analysis.mode="${ MODE}" -Dsonar.gitlab.project_id=$CI_PROJECT_PATH -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME# 集成测试阶段,运行springboot程序,并执行自定义的集成测试流程integration_test_job: stage: integration-test variables: GRADLE_MODE: "check" MODE: "preview" script: # 打成可直接运行的Springboot的jar - gradle bootJar # 切换成1.8的jdk - export JAVA_HOME=$JAVA8_HOME - export PATH=${ JAVA_HOME}/bin:$PATH # 指定以用于测试阶段的配置运行,这里使用nohup,否则后打死在这个命令而不往后进行 - nohup java -jar -Dspring.profiles.active=test build/libs/ci_test-1.0-SNAPSHOT.jar & ##################################################################### # 下面是进行集成测试阶段,具体的流程可自己定义,我这里是我自己的一个思路 ##################################################################### - echo "Integration testing run..." - echo "git clone xxxx.git" # 可以结合application插件,打成可执行jar - echo "gradle distZip" # zipb包的目录大概是:# - xxx.zip # -/bin # -/启动脚本 # -/lib # -/依赖的jar - echo "unzio xxx.zip" - echo "sh /xx/bin/start.sh" - echo "start integeration testing!"
通过shel连接到另一台主机并创建数据库
#!/bin/sh #数据库信息地址,这里的数据库是一个固定的数据库HOSTNAME="192.168.23.102" PORT="3306"USERNAME="root"PASSWORD="root123"#创建数据库#其中CI_COMMIT_SHA是Gitalb Ci提供的变量,保存每次提交的commit号,这里使用commit号作为数据库名以保证每次提交都是不同的create_db_sql="create database IF NOT EXISTS $CI_COMMIT_SHA"#远程创建命令mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "${create_db_sql}"
首先放一张各个流程的整体运行结果
c96641f6
开头的,可以看到数据库中也成功创建了该数据库,如下图: 这一步为了执行单元测试等
因为虚拟机比较大,已上传到百度网盘:
链接:https://pan.baidu.com/s/14vk8gLpblx77B8oB1Kn5lA 提取码:hs3m其中192.168.23.102是runner的所在地址,如果docker0网络使用过程中出现错误可参考另一篇博文
转载地址:http://znhnn.baihongyu.com/