掘金 后端 ( ) • 2024-04-15 09:38

1. gitea的安装

在linux的docker上安装gitea和drone。首先需要安装docker-compose。(可参考:curl - L https://github.com/docker/compose/releases/download/1.8.0/run.sh >/usr/local/bin/docker-compose
   chmod +x /usr/local/bin/docker-compose)然后创建或修改 docker-compose.yml 文件: 在宿主机上创建一个名为 docker-compose.yml 的文件,这个文件的路径如下: /fan/ssoftware/gitea-config,内容如下(请根据实际情况替换配置路径):

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:

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的对接

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

图片1.png

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

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

图片3_看图王.png

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

<?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 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文件内容:

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文件内容:

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文件内容:

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