Drone CI 简介
Drone
是一个持续集成和持续交付的平台,可以与Docker
完美集成。相对于Jenkins
来说更加轻量,可以配合轻量的Gogs
来实现持续集成。
-
Drone
引入了Pipelnes
的概念,管道可帮助我们自动化软件交付过程中的步骤,例如启动代码构建,运行自动化测试以及部署到暂存或生产环境。 - 通过将
.drone.yml
文件放在git信息库的根目录中来配置管道。 yaml语法旨在易于阅读和表达,以便查看存储库的任何人都可以理解工作流程。 -
Drone
通过多个step
来完成一系列的指令。
Drone CI搭建
建议使用docker-compose
来搭建Drone
,这里推荐一个:
version: '3'
services:
drone-server:
image: drone/drone:latest
ports:
- 10081:80
volumes:
- ./drone:/var/lib/drone/
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_OPEN=true
- DRONE_SERVER_HOST=${DRONE_HOST:PORT}
- DRONE_SERVER_PROTO=http
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
- DRONE_GOGS=true
- DRONE_GOGS_SERVER=${GOGS_HOST:PORT}
- DRONE_PROVIDER=gogs
- DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
- DRONE_DATABASE_DRIVER=sqlite3
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
drone-agent:
image: drone/agent:latest
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_RPC_SERVER=${DRONE_HOST:PORT}
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
其实搭建Drone
还是比较简单的,至于Gogs
可以使用docker
来搭建了。
与Gogs连用
docker-compose up -d
启动完成后,如果配置完成,登录时使用Gogs
的账户和密码就可以。登录进入之后就可以看到Gogs
中的代码了。
点击进入仓库-SETTINGS,把项目设置为Private
,以及Trusted
勾上。
注意:为了使用缓存以便于我们用例如Maven
构建时,可以使用缓存来大大减少构建时间,所以这里必须把Trusted
勾上。
然后进入gogs
就会发现仓库设置中有了drone
的web钩子了。
进入web钩子,点击测试推送可以看到最新推送的消息已经发送成功。
进入drone
可以看到构建的过程。
对于一个项目基本的持续交付流程如下(不同项目流程可能略微不同)
clone -> build -> publish -> deploy -> notify
对于Drone
来说最核心的就是.drone.yml
文件了,这里面定义了所有的流程。此次我采用下面的流程:
-
push
代码到gogs
,gogs
通知drone
进行clone
项目。 - 执行
maven
编译 - 把
jar
包通过ftp传递到服务器上 - 通过脚本命令来构建
docker
容器,并且更新镜像源。 - 通知,可以通过钉钉或者微信来通知构建结果。
其实最完美的流程是3-4步骤,我们可以通过plugins/docker
插件来构建镜像并且把镜像推送到我们的私有docker
仓库中,因为我还没搭建私有docker
仓库,这里就先依ftp
传递为例。
附上.drone.yml
文件
kind: pipeline
name: 打包测试
steps:
- name: Maven编译
image: maven
volumes:
- name: cache
path: /root/.m2
commands:
- mvn clean install
- name: scp传递jar包
image: appleboy/drone-scp
settings:
host:
- *****
username: root
password:
from_secret: ftp_password
port: 22
command_timeout: 2m
target: ****
source:
- /drone/src/target/*.jar
rm: true
- name: ssh commands
image: appleboy/drone-ssh
settings:
host: ****
username: ****
password:
from_secret: ftp_password
port: 22
script:
- echo ====暂停容器开始=======
- docker stop `docker ps -a| grep *** | awk '{print $1}' `
- docker rm -f `docker ps -a| grep *** | awk '{print $1}' `
- echo ====开始部署=======
- cd /usr/local/ywb/interview
- docker build -t *** .
- docker run ...
- echo ====部署成功======
- name: 钉钉通知
image: guoxudongdocker/drone-dingtalk
settings:
token:
from_secret: dingtalk_token
type: markdown
message_color: true
message_pic: true
sha_link: true
when:
status: [failure, success]
volumes:
- name: cache
host:
path: /tmp/cache/.m2
trigger:
branch:
- master
其实整个步骤仔细理解并不难,只需要能理解通过pipeline
来执行,每个step
其实都是包含一个docker
镜像,通过使用这些镜像来帮助我们完成我们所需要的操作。
这里需要去Drone
项目设置中定义服务器密码和钉钉的token
。
对于volumes
是用来缓存的,这里用了Maven
所以对.m2
文件夹进行了缓存,下次打包就能节省很多时间。
更好理解这些插件建议移步:http://plugins.drone.io/
构建完成后可以在钉钉上看到构建结果。如有建议,欢迎沟通!