前言:
你是不是还在使用 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}
重新提交代码,自动打包! 这样就完成啦!
版权归原作者 karlif 所有, 如有侵权,请联系我们删除。