使用gitea-drone实现自动化CICD(springboot多模块项目)

1. gitea的安装

在linux的docker上安装gitea和drone。首先需要安装docker-compose。(可参考:curl - L github.com/docker/comp... >/usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose)然后创建或修改 docker-compose.yml 文件: 在宿主机上创建一个名为 docker-compose.yml 的文件,这个文件的路径如下: /fan/ssoftware/gitea-config,内容如下(请根据实际情况替换配置路径):

ini 复制代码
services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea
    restart: always
    hostname: '192.254.59.1'
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - DATABASE_TYPE=mysql
      - DATABASE_HOST=192.0.9.15   # 对于Mac和Windows, 或者是Linux宿主机的实际IP地址
      - DATABASE_PORT=3306
      - DATABASE_NAME=giteadb
      - DATABASE_USER=root
      - DATABASE_PASSWORD=111111
    ports:
      - "3892:3000"
      - "2222:22"
    volumes:
      - ./gitea:/data

启动Gitea服务: 使用Docker Compose启动Gitea服务: 在这个目录下执行:docker-compose up -d 如果修改了配置想要重新启动,可以先执行:docker-compose down 再执行:docker-compose up -d.

2. drone的安装与配置****

目录:/fan/software/drone

2.1 drone的安装:

docker-compose.yml:

ini 复制代码
services:
  drone-server:
    image: drone/drone:latest
 #   container_name: drone
    environment:
      - DRONE_GITEA_SERVER=http://192.254.59.1:3892#这里是docker0容器的ip
      - DRONE_GITEA_CLIENT_ID=793f3f61-19ac-42ay-8d2d-9213a2803003
      - DRONE_GITEA_CLIENT_SECRET=gto_dyykh76s4wf4cntjsdfhgdfhhpyau3eymxku3yage4gqvsq
      - DRONE_RPC_SECRET=2349d4295d92edba424e9c5cbaded8e
      - DRONE_SERVER_HOST=192.254.59.1:38901
      - DRONE_SERVER_PROTO=http
      - DRONE_USER_CREATE=username:hbf,admin:true
    restart: always
    volumes:
      - ./drone:/data
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 38901:80
  drone-runner-docker:
    image: drone/drone-runner-docker:latest
    restart: always
    depends_on:
      - drone-server
    container_name: drone-runner
    volumes:
       - /var/run/docker.sock:/var/run/docker.sock
    environment:
      #- DRONE_RPC_PROTO=http
        - DRONE_RPC_HOST=drone-server
 #     - DRONE_RPC_HOST=drone-server
        - DRONE_RPC_SECRET=2349d4295d92edba424e9c5cbaded8e
        - DRONE_RUNNER_CAPACITY=2
        - DRONE_RUNNER_NAME=drone-runner-1
    ports:       
        - 38902:3000

在这个文件的目录下执行:sudo docker-compose up -d。 这个DRONE_RPC_SECRET使用DRONE_RPC_SECRET命令来生成。

2.2 drone与gitea的对接

上图是设置好的,下图是设置的内容(注意别少了/login):

3. springboot多模块项目的自动发布

3.1 这个是项目的目录结构:

3.2 主pom,也就是最外层pom文件内容如下:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.hbf</groupId>
    <artifactId>note</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>TestDrone</name>
    <description>Demo project for Spring Boot</description>
    <modules>
        <module>base</module>
        <module>client</module>
    </modules>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.6</version>
                <configuration>
                    <mainClass>cn.hbf.NoteApplication</mainClass>
                    <!--<skip>true</skip>-->
                     <includeSystemScope>true</includeSystemScope>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

3.3 子模块client pom文件内容:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.hbf</groupId>
        <artifactId>note</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>client</artifactId>
    <packaging>jar</packaging>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.6</version>
                <configuration>
                    <mainClass>cn.hbf.NoteApplication</mainClass>
                    <skip>false</skip>
                     <includeSystemScope>true</includeSystemScope>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

3.4 drone.yml文件内容:

yaml 复制代码
kind: pipeline # 定义一个管道  
type: docker # 定义管道类型  
name: springboot # 定义管道名称  
  
steps:  
- name: build-jar # 流水线名称  
image: maven:3.6.3-openjdk-8 # 定义创建容器的Docker镜像  
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置  
- name: maven-cache # 数据卷名称  
path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载  
- name: maven-build # 数据卷名称  
path: /app/build # 将应用打包好的Jar和执行脚本挂载出来  
commands: # 定义在Docker容器中执行的shell命令  
- mvn clean package -DskipTests=true # 应用打包命  
- cp ./client/target/*.jar /app/build/note.jar # 复制jar  
- cp Dockerfile /app/build/ # 复制Dockerfile  
- cp run.sh /app/build/ # 复制run.sh脚本  
  
- name: build-docker # 步骤名称  
image: plugins/docker # 使用镜像和版本  
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置  
- name: maven-build # 数据卷名称  
path: /app/build # 将应用打包好的Jar和执行脚本挂载出来  
- name: docker # 数据卷名称  
path: /var/run/docker.sock # 挂载宿主机的docker  
settings:  
dockerfile: /app/build/Dockerfile  
commands: # 定义在Docker容器中执行的shell命令  
- cd /app/build # 切换目录  
- chmod +x run.sh # 脚本执行权限  
- sh run.sh # 执行脚本  
- docker ps # 容器日志  
  
volumes: # 定义流水线挂载目录,用于共享数据 声明宿主机 映射到 drone执行器的数据卷  
- name: maven-build # 数据卷名称  
host:  
path: /home/data/maven/build # 从宿主机中挂载的目录  
- name: maven-cache # 数据卷名称  
host:  
path: /home/data/maven/cache # 从宿主机中挂载的目录  
- name: docker # 数据卷名称  
host:  
path: /var/run/docker.sock # 挂载宿主机的docker

3.5 Dockerfile文件内容:

sql 复制代码
FROM openjdk:8-alpine3.9  
MAINTAINER yufeng  
COPY ./note.jar /  
ENTRYPOINT ["sh","-c","java -jar -Xms1024m -Xmx2048m /note.jar"]  
EXPOSE 8066

3.6 run.sh文件内容:

bash 复制代码
#!/bin/sh  
group_name='web'  
# application  
app_name='note'  
# version  
app_version='latest'  
echo '[INFO] ------------------------------[ cppy jar ]------------------------------'  
docker stop ${app_name}  
echo '[INFO] ---------------------------[ stop container ]---------------------------'  
docker rm ${app_name}  
echo '[INFO] ----------------------------[ rm container ]----------------------------'  
docker rmi ${group_name}/${app_name}:${app_version}  
echo '[INFO] ------------------------------[ rm image ]------------------------------'  
docker build -t ${group_name}/${app_name}:${app_version} .  
echo '[INFO] -----------------------------[ build image ]----------------------------'  
docker run -p 8066:8066 --restart=always --name ${app_name} \  
-e TZ="Asia/Shanghai" \  
-v /etc/localtime:/etc/localtime \  
-d ${group_name}/${app_name}:${app_version}  
echo '[INFO] ---------------------------[ start container ]--------------------------'

上面这种自动化发布是定时发布,或者是手动发布,免去了手动打包发镜像等过程。至于如何实现git提交时自动发布,欢迎读者朋友们讨论。

相关推荐
打码人的日常分享3 分钟前
企业人力资源管理,人事档案管理,绩效考核,五险一金,招聘培训,薪酬管理一体化管理系统(源码)
java·数据库·python·需求分析·规格说明书
27669582923 分钟前
京东e卡滑块 分析
java·javascript·python·node.js·go·滑块·京东
爱写代码的刚子5 分钟前
C++知识总结
java·开发语言·c++
冷琴199613 分钟前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot
daiyang123...39 分钟前
IT 行业的就业情况
java
爬山算法1 小时前
Maven(6)如何使用Maven进行项目构建?
java·maven
.生产的驴1 小时前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
爱学的小涛1 小时前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
吹老师个人app编程教学1 小时前
详解Java中的BIO、NIO、AIO
java·开发语言·nio
爱学的小涛1 小时前
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
java·开发语言·笔记·后端·nio