当前位置:   article > 正文

Drone + Gitea + Docker 实现JAVA项目自动化代码提交部署的一次实践案例(适合轻量化小型团队使用)_容器化自动部署 java代码提交git 自动部署

容器化自动部署 java代码提交git 自动部署

前言:
你是不是还在使用 Gitlab+Jenkins+docker的方式搭建自动化部署平台?是不是还在苦恼服务器内存太小,Gitlab内存占用过大的问题? 是不是还在厌倦每次写完代码还要发布部署? 那就来试试Drone + Gitea + Docker 吧!

docker 安装

1、yum -y update  更新yum
2、yum remove docker  docker-common docker-selinux docker-engine 存在旧的环境需要先删除

3、yum install -y yum-utils device-mapper-persistent-data lvm2   更新docker驱动

4、yum-config-manager --add-repo <http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)> 设置源

	yum-config-manager --add-repo <http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)>

5、yum -y install docker  安装最新版docker

6、systemctl start docker 启动docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

docker-compose 安装

#使用yum安装,不要使用curl安装
yum install -y epel-release
yum install -y docker-compose
docker-compose --version
  • 1
  • 2
  • 3
  • 4

一、gitea 安装

这里使用的docker-compose方式安装的

version: "3"
 
networks:
  gitea:
    external: false
 
services:
  server:
    image: gitea/gitea:1.19
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - /home/local/gitea/data:/data  # /home/data可以替换成你想要的挂载目录
      - /home/local/gitea/timezone:/etc/timezone:ro
      - /home/local/gitea/localtime:/etc/localtime:ro
    ports:
      - "3000:3000" # 3000可以替换成你想要的端口
      - "10022:22" # 10022可以替换成22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

记住端口为3000,启动安装命令

docker-compose up -d
  • 1

二、配置gitea

访问http://服务器的ip:3000,配置你的信息,详情如下
采用的是mysql数据库,需要在数据库中新建一个gitea库
在这里插入图片描述
管理员密码设置,记住 app.ini 的位置,后续要调整的
在这里插入图片描述
第一次安装时候会有点久,因为要初始化库表
第一次安装时候会有点久,因为要初始化库表
后续继续创建仓库即可
在这里插入图片描述
此时,新仓库如下:ssh://git@10.10.10.161:10022/root/third_platform_1.git
在这里插入图片描述

配置ssh密钥,将本地生成的公钥复制过来即可
在这里插入图片描述

然后上传代码就好了!

二、 Drone 安装

编写docker-compose.yml文件

  drone-server:
    restart: always
    image: drone/drone:2.13.0
    container_name: drone-server
    ports:
      - "7500:80" #端口为7500
    volumes:
      - /home/local/drone/server/drone:/var/lib/drone/
      - /home/local/drone/server/data:/data/
    environment:
      - DRONE_GITEA_SERVER=http://10.10.10.161:10000 #对接的gitea地址
      - DRONE_GITEA_CLIENT_ID=1bf5b7d8-f8fb-4023-a0d0-d8261294b26b #gitea 的 OAuth application的clientId
      - DRONE_GITEA_CLIENT_SECRET=gto_77tpo57fp2aadjwuooze35zybrkid3xtd57vcrovxem4edag5h6a #gitea 的OAuth application的SECRET
      - DRONE_SERVER_HOST=10.10.10.161:7500  # drone-server的地址ip:port
      - DRONE_SERVER_PROTO=http # 模式为http或者https
      - DRONE_RPC_SECRET=36fd9879667476dab64ae2ec0c354188 #openssl rand -hex 16 生成的随机密码
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_GIT_USERNAME=root #drone的登录账号
      - DRONE_GIT_PASSWORD=root #drone的登录密码
      - DRONE_USER_CREATE=username:root,admin:true
  drone-runner:
    restart: always
    container_name: drone-runner
    image: drone/drone-runner-docker:1.8.2
    volumes:
		#挂载到宿主机的docker上去
      - /var/run/docker.sock:/var/run/docker.sock:rw
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=drone-server #这里可以直接写名称,还可以写DRONE_SERVER_HOST的地址
      - DRONE_RPC_SECRET=36fd9879667476dab64ae2ec0c354188 #drone-server的DRONE_RPC_SECRET(同上)
      - DRONE_RUNNER_NAME=drone-runner
      - DRONE_RUNNER_CAPACITY=2

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

补充说明:gitea 的 OAuth 生成
在这里插入图片描述

执行docker-compose up -d
后访问 http://10.10.10.161:7500/ ,输入账号密码进入 root/root
点击同步后发现自己的仓库出现在上方,点击激活后出现如下图的样式
在这里插入图片描述

在这里插入图片描述
此时需要注意打开下面设置
在这里插入图片描述

准备文件:

1、.drone.yml 流水线操作文件

kind: pipeline
type: docker
name: myProject

steps:
  # 1.maven打包
  - name: maven compile
    pull: if-not-exists
    # 构建镜像的maven+jdk选择,最好选择满足匹配你的项目版本的
    image: matderosa/maven-3.8-openjdk-17-gcc8.5
    volumes:
      # maven构建缓存
      - name: maven-cache
        path: /root/.m2
      # 挂载宿主机的目录
      - name: maven-build
        path: /thirdPlatform/build
    commands:
      # 开始打包maven工程
      - mvn clean package -Dmaven.test.skip=true
      # 将打包后的文件复制到宿主机映射目录
      - cp target/*.jar /thirdPlatform/build
      - cp Dockerfile /thirdPlatform/build
      - cp docker.sh /thirdPlatform/build
      - cp start.sh /thirdPlatform/build

  - name: build docker
    image: plugins/docker
    volumes: 
    	# 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
        - name: maven-build
          path: /thirdPlatform/build # 将应用打包好的Jar和执行脚本挂载出来
        - name: docker
          path: /var/run/docker.sock # 挂载宿主机的docker
    settings:
        dockerfile: /thirdPlatform/build/Dockerfile
    commands: 
    	# 定义在Docker容器中执行的shell命令
      - cd /thirdPlatform/build
      - chmod +x docker.sh
      - sh docker.sh
      - docker ps


volumes: # 定义流水线挂载目录,用于共享数据
  - name: maven-build
    host:
      path: /home/projects/thirdPlatform/maven/build # 从宿主机中挂载的目录
  - name: maven-cache
    host:
      path: /home/projects/thirdPlatform/maven/cache
  - name: docker
    host:
      path: /var/run/docker.sock


# drone执行触发器
trigger:
  branch:
    - master
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

2、start.sh sh启动文件

java -Xms128m -Xmx128m -jar /thirdPlatform/*.jar --spring.profiles.active=dev

if [ $? != 0 ]; then
  echo Failed to start java >&2
  exit 1
fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、Dockerfile(关键,容器的打包制作环境准备)

#指定了基础镜像为 khipu/openjdk17-alpine,即使用了 OpenJDK 17 的 Alpine 版本作为基础
FROM khipu/openjdk17-alpine
#设置了一个名为 SERVIECE_PORT 的环境变量,并将其值设为 9090
ENV SERVIECE_PORT =  9090
# 容器里 新建目录 thirdPlatform
RUN mkdir -p /thirdPlatform/
# 工作区
WORKDIR /thirdPlatform
# 复制操作
COPY ./start.sh /thirdPlatform/
#将宿主机当前目录下的 *.jar 文件复制到容器的 /third_platform_admin/ 目录下
COPY ./*.jar /thirdPlatform/
#对 /thirdPlatform/ 目录及其子目录下的所有文件赋予可执行权限
RUN chmod 755 -R /thirdPlatform/
#设置容器的入口点为 /third_platform_admin/start.sh,即在容器启动时执行该脚本
ENTRYPOINT ["/thirdPlatform/start.sh"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4、Docker.sh (名称可以修改,镜像容器制作的关键)

#!/bin/sh
# 定义应用组名
group_name='karl'
# 定义应用名称 ,这里的name是获取你仓库的名称,也可以自己写
app_name=${DRONE_REPO_NAME}
# 定义应用版本
app_version='latest'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 9090:9090 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

结果

在这里插入图片描述

注意点:

第一次推送会失败,原因是webhook钩子设置了ip限制推送操作
解决方案为:在 /home/local/gitea/data/gitea/conf 下的app.ini文件中添加一行

[webhook]
ALLOWED_HOST_LIST = *
  • 1
  • 2

第一次构建maven项目时候,需要拉取依赖较多,时间会有点久,此时可以设置超时时间稍久一点(此时未考虑采用maven私服)
在这里插入图片描述

参考:https://juejin.cn/post/7129066031875620894

----------------------------------------------------------分割线---------------------------------------------------------------------------------------

由于需要透露日志文件到主机上去,新增logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>
    <property name="log.dir" value="/data/appLogs/project"/>


    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 错误日志输出 -->
    <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.dir}/error/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.dir}/error.%d{yyyy-MM-dd}.zip</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 信息日志输出 -->
    <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.dir}/info/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.dir}/info.%d{yyyy-MM-dd}.zip</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="errorFile" />
        <appender-ref ref="infoFile" />
    </root>

</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

docker.sh 文件上修改容器制作配置

docker run -p 9090:9090 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
# 容器内外同一时间
-v /etc/timezone:/etc/timezone \
# 这里是将日期映射出来的
-v /home/projects/${app_name}:/data/appLogs/project \
-d ${group_name}/${app_name}:${app_version}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

重新提交代码,自动打包! 这样就完成啦!
在这里插入图片描述

docker 下载部分的更新

//仓库地址尽量不使用阿里的,版本落后太多了
sudo yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
// 查看docker版本
yum list docker-ce --showduplicates | sort -r
// 安装docker
sudo yum install docker-ce-25.0.4-1.el7 -y
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号