返回文章列表
开发 | 运维 | 2024-03-07

提升个人开发效率与安全性:极狐 GitLab CI/CD 助力编译、构建、测试与发布

徐晓伟

在现代软件开发中,个人开发者常常面临项目维护过程中的重复性工作和安全隐患。为了解决这些问题,极狐 GitLab CI/CD 成为了一个强大的工具,为个人开发者提供了一套完整的解决方案。

 

前提

 

作者前几年开发了一个微服务项目,由于长期不维护,存在很多问题,比如:接口 bug 多,功能不完善,依赖版本过低、漏洞过多、上手困难等原因,现在准备将之前的微服务进行重构。

 

 

要求

 

为了减轻开发者的手动操作负担,避免重复性的编译和构建工作,希望加入流水线自动化执行,让本人只需专注于代码的编写,而无需担心构建过程的繁琐细节。

为了保证接口的质量,需要给接口添加自动化的测试(单元测试、集成测试),有助于及时发现潜在的问题,提高了项目的代码质量。

为了了解软件供应链,需要对使用的依赖进行安全扫描和管理。

 

 

现实

 

作者对 GitLab CI/CD 比较了解,希望使用 GitLab CI/CD 来完成自动构建、测试与发布。

作者本人无云服务器,没有办法随时提交代码进行自动化测试。

作者有一台实体机器,虽然配置很高(双路 20 核 40 线程 256G 内存 8T 硬盘),但是功率感人,每小时至少 200W。

 

 

契机

 

在 2024 年 2 月,一个偶然的机会,作者获得了 极狐 GitLab 旗舰版 一年的授权,这对于个人开发者来说,就是雪中送炭。

于是在当月便创建了一个项目,着手工作开始重构,避免浪费授权。

 

 

进展

 

1、将代码推送到`默认分支`,即可触发流水线自动打包
作者使用 Maven 来管理项目依赖。
下方流水线配置文件 历史提交记录 根据 极狐 GitLab 流水线 可知,本次提交可正常编译打包,说明本次提交的代码编译时正常

stages:
  - build

build:
  stage: build
  image: maven:3-openjdk-8
  variables:
    MAVEN_OPTS: >-
      -Dhttps.protocols=TLSv1.2
      -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository
      -Dorg.slf4j.simpleLogger.showDateTime=true
      -Djava.awt.headless=true
    MAVEN_CLI_OPTS: >-
      --batch-mode
      --errors
      --fail-at-end
      --show-version
      --no-transfer-progress
      -DinstallAtEnd=true
      -DdeployAtEnd=true
  script:
    - mvn clean package -DskipTests=false
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .m2/repository
  only:
    variables:
      - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

 

2、接下来调整代码,修复了项目自动化测试的功能,流水线

 

3、上述测试只是微服务中单个服务的测试,没有做集成测试,比如:Nacos 使用 MySQL 启动,微服务注册到 Nacos,从 Nacos 中获取配置,微服务之间进行相互调用等等。

 

于是接下来给流水线配置 MySQL services,用于 Nacos 连接 MySQL 数据库,微服务连接 Nacos,从 Nacos 中获取配置,历史提交记录,根据 极狐 GitLab 流水线 可知,流水线使用 mysql:8.0.36 镜像创建了一个 MySQL 数据库,并初始化了表结构和数据,从测试日志中可知,微服务连接 Nacos,并通过 Nacos 拿到数据库配置的数据(日志中的 徐晓伟微服务

 

build:mvn:
   stage: build
   image: xuxiaoweicomcn/maven-mysql-client:3.6.3-jdk-8
   services:
      - mysql:8.0.36
   variables:
      MAVEN_OPTS: >-
         -Dhttps.protocols=TLSv1.2
         -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository
         -Dorg.slf4j.simpleLogger.showDateTime=true
         -Djava.awt.headless=true
      MAVEN_CLI_OPTS: >-
         --batch-mode
         --errors
         --fail-at-end
         --show-version
         --no-transfer-progress
         -DinstallAtEnd=true
         -DdeployAtEnd=true
      MYSQL_DATABASE: nacos
      MYSQL_ROOT_PASSWORD: nacos
      XUXIAOWEI_NACOS_MYSQL_IP: mysql
      XUXIAOWEI_NACOS_MYSQL_USERNAME: root
      XUXIAOWEI_NACOS_MYSQL_DATABASE: nacos
   before_script:
      - if [ $CI_SERVER_HOST == 'gitlab.helm.xuxiaowei.cn' ]; then
         sleep 20s;
         fi
      - mysql -u root -p${MYSQL_ROOT_PASSWORD} --host=mysql ${MYSQL_DATABASE} < sql/1-nacos-mysql-schema.sql
      - mysql -u root -p${MYSQL_ROOT_PASSWORD} --host=mysql ${MYSQL_DATABASE} < sql/2-nacos-mysql-data.sql
   script:
      - mvn -v
      - mvn clean package -U -pl nacos -DskipTests=false -s settings.xml
      - nohup java -jar nacos/target/nacos-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &
      - sleep 10s
      - cat nohup.out
      - curl "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=&group=&appName=&config_tags=&pageNo=1&pageSize=10&tenant=&search=blur" && echo
      - cat nohup.out
      - >-
         mvn clean package -U
         -pl spring-cloud-xuxiaowei-passport
         -pl spring-cloud-xuxiaowei-commons/spring-cloud-xuxiaowei-commons-core
         -pl spring-cloud-xuxiaowei-commons/spring-cloud-xuxiaowei-commons-loadbalancer
         -DskipTests=false -s settings.xml
      - nohup java -jar spring-cloud-xuxiaowei-passport/target/spring-cloud-xuxiaowei-passport-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &
      - sleep 10s
      - mvn clean package -U -pl !nacos,!spring-cloud-xuxiaowei-passport -DskipTests=false -s settings.xml
   cache:
      key: "${CI_JOB_NAME}"
      paths:
         - .m2/repository
   only:
      variables:
         - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

 

 

4、链接

a. 极狐仓库

b. B站视频

 

 

极狐GitLab 一体化DevOps平台 专为中国用户研发,免费试用60天专业版高级功能
售前咨询
联系电话
在线支持
预约演示