现在我们在日常开发或者生产环境中,往往会经常弄一套自动化部署方案来节约时间成本。现在比较流行的一种就是Gitlab+Jenkins
实现方案,但是这种方案占用内存还是比较大,需要的服务器内存也得8G左右,不然很难流畅运行,而且部署起来也不快。最近小翔发现了一款神器 Drone ,轻量级的CI/CD工具,我拿来结合 Gogs 使用所消耗的内存占用都不到1G,这里就给大家聊聊这款工具。
Drone是一款基于go编写的容器技术持续集成工具,可以直接使用YAML配置文件即可完成自动化构建、测试、部署任务。
drone引入pipline的概念,整个build过程由多个stage组成,每一个stage都是docker。
因为本篇文章是用 Gogs
的git版本管理存储代码,安装可以参考我上一篇文章, Gogs安装部署
使用Docker安装几秒就完成
# Drone的Server
docker pull drone/drone:1
# Drone的Runner
docker pull drone-runner-docker:1
这里有个Server和Runner的概念,我们先来理解下;
Drone server
docker run \
-v /www/wwwroot/data/docker/drone:/data \
-e DRONE_AGENTS_ENABLED=true \
-e DRONE_GOGS_SERVER=https://gogs.weiye.link \
-e DRONE_RPC_SECRET=dronerpc666 \
-e DRONE_SERVER_HOST=192.168.31.114:3080 \
-e DRONE_SERVER_PROTO=http \
-e DRONE_USER_CREATE=username:weiye,admin:true \
-e TZ="Asia/Shanghai" \
-p 3080:80 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1
这里的配置参数比较多,下面统一解释下;
http://192.168.31.114:10080
drone-runner-docker
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=192.168.31.114:3080 \
-e DRONE_RPC_SECRET=dronerpc666 \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=runner-docker \
-e TZ="Asia/Shanghai" \
-p 3000:3000 \
--restart always \
--name runner-docker \
drone/drone-runner-docker:1
这里的配置参数比较多,下面统一解释下。
打开Drone, IP + 3080 登录Gogs的管理员账号就可以进入控制台了,访问地址:http://192.168.31.114:3080/
SYNC
按钮。ACTIVATE
后, 设置仓库
-> 勾选 Trusted
-> SAVE
保存。drone保证了安全访问,我们不用在配置文件明文输出密码等敏感值,可以添加 Secret
,如果觉得没有必要也不用添加,直接在后面的 drone.yml
文件中配置明文密码就行。
.drone.yml
配置,执行相应的流水线,接下来我们来看看这个脚本是如何写的。在仓库的根目录下创建.drone.yml
配置文件
配置文件参考如下配置:
kind: pipeline # 定义对象类型,还有secret和signature两种类型
type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型
name: drone-study # 定义流水线名称
steps: # 定义流水线执行步骤,这些步骤将顺序执行
- name: package # 1. 流水线名称(maven打包)
pull: if-not-exists
image: maven:ibmjava-alpine # 定义创建容器的Docker镜像
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
- name: maven-cache
path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
# 挂载宿主机的目录
- name: maven-build
path: /app/build/drone-study # 将应用打包好的Jar和执行脚本挂载出来
commands: # 定义在Docker容器中执行的shell命令,这里是复制到maven镜像容器里面的,区分开项目就行了
- mvn clean package -Dmaven.test.skip=true
- cp target/drone.jar /app/build/drone-study/drone.jar
- cp Dockerfile /app/build/drone-study/Dockerfile
- cp run.sh /app/build/drone-study/run.sh
- name: build-start # 2. 流水线名称(ssh默认人工操作打包好的jar包)
image: appleboy/drone-ssh # ssh工具镜像
settings:
host: weiye.link # 远程连接地址,可以是IP可以是域名
username: root # 远程连接账号
# password: 123456 #明文密码
# password:
# from_secret: ssh_password # 从Secret中读取SSH密码
key:
from_secret: ssh_key # 从Secret中读取SSH密钥
port: 22 # 远程连接端口
command_timeout: 10m # 远程执行命令超时时间
script_stop: false # 设置为false,遇到第一次错误会继续运行后面的命令
script:
- cd /www/wwwroot/data/maven/build/drone-study # 进入宿主机构建目录,可根据自己选择目录
- chmod +x run.sh # 更改为可执行脚本
- ./run.sh # 运行脚本打包应用镜像并运行
- name: notify # 3. 通知(这里使用了钉钉通知,可以使用微信通知、邮件通知等)
pull: if-not-exists
image: guoxudongdocker/drone-dingtalk:latest
settings:
token:
from_secret: dingtalk_token
type: markdown
message_color: true
message_pic: true
sha_link: true
when:
status: [failure, success]
volumes: # 定义流水线挂载目录,用于共享数据
- name: maven-build
host:
path: /www/wwwroot/data/maven/build/drone-study # 从宿主机中挂载的目录
- name: maven-cache
host:
path: /www/wwwroot/data/maven/cache
注意:
确定好自己宿主机挂载的目录
可以学习一下 drone 的判断语法: https://docs.drone.io/pipeline/docker/syntax/conditions/#by-branch
run.sh
执行脚本可以实现打包应用和运行容器镜像,配置如下:#!/usr/bin/env bash
# 定义应用组名
group_name='xiang'
# 定义应用名称
app_name='drone-study'
# 定义应用版本
app_version='v1'
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 -it -p 6003:6003 --name ${app_name} \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'
Dockerfile
文件配置如下:# Docker image for springboot file run
# VERSION 1.0
# Author: Xiang
# 基础镜像使用java
FROM openjdk:8-jdk-alpine
ADD drone.jar app.jar
EXPOSE 6003
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
.drone.yml
配置文件,就会按照配置文件中的步骤进行构建了,部署期间可以在drone中查看到每一步的部署情况yml文件是否必须存放在git repository根目录
是的,必须在根目录
yml文件名是否必须是.drone.yml
默认是文件名是.drone.yml,也可以能过drone web管理界面修改yml的文件名
git提交代码如何让drone跳过本次提交,不执行pipeline
提交代码时通过备注增加[CI SKIP]跳过,如: git commit –m “first commit [CI SKIP]”
drone web界面repository设置项Project settings中没有Trusted
Drone Server启动时要指定DRONE_USER_CREATE参数,用来设置管理员帐号,只有用管理员帐号打开drone web界面才可以看到和设置Trusted
钉钉通知Token如何获取
可以百度,都挺简单的,获取到token后再添加到drone控制台的 Secrets
中,取名 dingtalk_token
总体使用下来还是很不错的,构建速度上面可以再优化,使用脚本来定义流水线任务无疑更简单、更直观。Drone更加轻量级,内存占用少且响应速度快。如果团队人员不是很大的话,还是很推荐大家使用的!
参考资料:
项目源码地址:
https://github.com/wilbur147/xiangStudy/tree/main/lab-drone