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提交时自动发布,欢迎读者朋友们讨论。