0


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

前言:
你是不是还在使用 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 -yinstalldocker  安装最新版docker

6、systemctl start docker 启动docker

docker-compose 安装

#使用yum安装,不要使用curl安装
yum install-y epel-release
yum install-ydocker-composedocker-compose--version

一、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

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

docker-compose up -d

二、配置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

补充说明: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
      - dockerps

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

2、start.sh sh启动文件

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

if[$?!=0];thenecho Failed to start java>&2exit1fi

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 chmod755-R /thirdPlatform/
#设置容器的入口点为 /third_platform_admin/start.sh,即在容器启动时执行该脚本
ENTRYPOINT ["/thirdPlatform/start.sh"]

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----'dockerrm${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 -p9090:9090 --name${app_name}\-eTZ="Asia/Shanghai"\-v /etc/localtime:/etc/localtime \-d${group_name}/${app_name}:${app_version}echo'----start container----'

结果

在这里插入图片描述

注意点:

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

[webhook]
ALLOWED_HOST_LIST = *

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

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

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

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

<?xml version="1.0" encoding="UTF-8"?><configurationdebug="false"scan="true"scanPeriod="1 seconds"><contextName>logback</contextName><propertyname="log.dir"value="/data/appLogs/project"/><!-- 控制台输出 --><appendername="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><!-- 错误日志输出 --><appendername="errorFile"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.dir}/error/error.log</file><rollingPolicyclass="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><filterclass="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 信息日志输出 --><appendername="infoFile"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.dir}/info/info.log</file><rollingPolicyclass="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><filterclass="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><rootlevel="info"><appender-refref="console"/><appender-refref="errorFile"/><appender-refref="infoFile"/></root></configuration>

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}

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

标签: gitea docker java

本文转载自: https://blog.csdn.net/karlif/article/details/136213175
版权归原作者 karlif 所有, 如有侵权,请联系我们删除。

“Drone + Gitea + Docker 实现JAVA项目自动化代码提交部署的一次实践案例(适合轻量化小型团队使用)”的评论:

还没有评论