Drone是一种基于容器技术的持续交付系统。Drone使用简单的YAML配置文件(docker-compose的超集)来定义和执行Docker容器中的Pipelines。node
Drone与流行的源代码管理系统无缝集成,包括GitHub,GitHub Enterprise,Bitbucket等。mysql
让咱们一块儿开始实践
Drone
的部署和使用nginx
在这里,我为
Drone Server
使用的域名是dronetest.yiranzai.top
git
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。github
写了一个小Demo帮助你更快了解Docker-composeweb
Github OAuth Application是为了受权
Drone Server
读取你的Github
信息。sql
参照我以前写的Demo 一张图搞定 Github Create an OAuth Applicationdocker
记下生成的 Client ID
和 Client Secret
vim
咱们须要bash
drone-server
(中央Drone服务器)drone-agent
(接收来自中央Drone服务器的指令以执行构建管道)mysql
(drone
默认的数据存储是sqllite3
,这里咱们使用MySQL)nginx
(使用nginx
来作对外的服务代理,不要让drone-server
直接对外提供服务)参考:
version: "3.7"
services:
nginx:
image: nginx:alpine
container_name: drone_nginx
ports:
- "80:80"
restart: always
networks:
- dronenet
mysql:
image: mysql:5.7
restart: always
container_name: drone_mysql
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=drone
- MYSQL_USER=drone
- MYSQL_PASSWORD=drone_password
networks:
- dronenet
volumes:
- /path/to/conf/my.cnf:/etc/mysql/my.cnf:rw
- /path/to/data:/var/lib/mysql/:rw
- /path/to/logs:/var/log/mysql/:rw
drone-server:
image: drone/drone:1.0.0-rc.5 #不要用latest,latest并不是稳定版本
container_name: dronetest_server
networks:
- dronenet
volumes:
- ${DRONE_DATA}:/var/lib/drone/:rw
- /var/run/docker.sock:/var/run/docker.sock:rw
restart: always
environment:
- DRONE_DEBUG=true
- DRONE_DATABASE_DATASOURCE=drone:drone_password@tcp(drone_mysql:3306)/drone?parseTime=true #mysql配置,要与上边mysql容器中的配置一致
- DRONE_DATABASE_DRIVER=mysql
- DRONE_GITHUB_SERVER=https://github.com
- DRONE_GITHUB_CLIENT_ID=${Your-Github-Client-Id} #Github Client ID
- DRONE_GITHUB_CLIENT_SECRET=${Your-Github-Client-Secret} #Github Client Secret
- DRONE_RUNNER_CAPACITY=2
- DRONE_RPC_SECRET=YOU_KEY_ALQU2M0KdptXUdTPKcEw #RPC秘钥
- DRONE_SERVER_PROTO=http #这个配置决定了你激活时仓库中的webhook地址的proto
- DRONE_SERVER_HOST=dronetest.yiranzai.top
- DRONE_USER_CREATE=username:yiranzai,admin:true #管理员帐号,通常是你github用户名
drone-agent:
image: drone/agent:1.0.0-rc.5
container_name: dronetest_agent
restart: always
networks:
- dronenet
depends_on:
- drone-server #依赖drone_server,并在其后启动
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_RPC_SERVER=http://drone_server #drone用的http请求包,url必定要写上协议才能支持
- DRONE_RPC_SECRET=YOU_KEY_ALQU2M0KdptXUdTPKcEw #RPC秘钥,要与drone_server中的一致
- DRONE_DEBUG=true
networks:
dronenet:
复制代码
$ docker-compose up -d
Creating drone_mysql ... done
Creating dronetest_server ... done
Creating drone_nginx ... done
Creating dronetest_agent ... done
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------
drone_mysql docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
drone_nginx nginx -g daemon off; Up 0.0.0.0:80->80/tcp
dronetest_agent /bin/drone-agent Up
dronetest_server /bin/drone-server Up 443/tcp, 80/tcp
复制代码
nginx
配置文件$ docker-compose exec nginx ash
# vim /etc/nginx/conf.d/drone.conf
server {
listen 80;
server_name dronetest.yiranzai.top;
location / {
proxy_pass http://dronetest_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# nginx -s reload
复制代码
先有一个OAuth验证,而后会开始同步你全部的仓库。
写到这里,Drone CI for Github
就已经搭建成功了,是否是很开心,是否是很知足?结束了吗?并无!
咱们还要测试一下 Drone Server
,测试服务的可用性。
说干就干,开搞。
没有通过实践的项目不是可用的项目
Drone
激活仓库怎么建立就再也不赘述,在这里,我建立一个名为
dronetest
的仓库,并回到Drone
同步仓库
激活之后,检查一下GIthub仓库的Webhooks
添加 Secrets
在这里我建立了两个Secret name: yiranzai word: Hello World!
.drone.yml
这里因为服务器配置是敏感信息,咱们须要用到
Secret
来存储事先建立好登录部署服务器所须要的
host
username
rsa
port
以及要部署的路径deploy_path
参考
---
kind: pipeline
name: drone
workspace:
base: /app
path: git/drone
steps:
- name: build
image: node:alpine
volumes:
- name: webroot
path: /wwwroot
commands:
- /bin/sh bash.sh
environment:
host:
from_secret: host
port:
from_secret: port
abc: abctest
- name: deploy
image: appleboy/drone-scp
when:
status:
- success
settings:
host:
from_secret: host
port:
from_secret: port
key:
from_secret: rsa
username:
from_secret: username
target:
from_secret: deploy_path
source: ./*
volumes:
- name: webroot
host:
path: /opt
- name: cache
host:
path: /tmp/cache
trigger:
branch:
- master
event:
- push
复制代码
编写 bash.sh 打印变量
echo $host
echo $abc
echo $port
复制代码
git init
git add .;git commit -m 'init test'
git remote add origin git@github.com:yiranzai/dronetest.git
git push -u origin master
复制代码
Drone
的 ACTIVITY FEED
若是成功就会以下图所示
若是失败,会有错误信息
这里是因为我用的
node
镜像是node:alpine
,没有bash
去服务器检查一下
看到
bash.sh
和.drone.yml
都被上传到这里(只是测试,不是真的让你这么干)
$ pwd
/home/www
$ ll -a
total 40
drwx------ 4 www www 4096 Feb 20 04:23 .
drwxr-xr-x. 4 root root 4096 Feb 20 03:55 ..
-rw------- 1 www www 61 Feb 19 03:00 .bash_history
-rw-r--r-- 1 www www 18 Oct 30 13:07 .bash_logout
-rw-r--r-- 1 www www 193 Oct 30 13:07 .bash_profile
-rw-r--r-- 1 www www 231 Oct 30 13:07 .bashrc
-rw-r--r-- 1 www www 35 Feb 20 04:23 bash.sh
-rw-r--r-- 1 www www 812 Feb 20 04:23 .drone.yml
drwxr-xr-x 8 www www 4096 Feb 20 04:23 .git
drwxr-xr-x 2 www www 4096 Feb 19 02:40 .ssh
复制代码
Drone CI for Github的部署到此就真的结束了,一路走来,踩了很多坑,Drone的文档你慢慢看了之后就会发现有多烂,烂到心累想哭,许多在Demo中出现的变量在参考手册中找不到,彻底不知道什么含义,只能靠瞎猜和摸索。
yaml
格式的文件后缀是 yml
(我智障)drone-server
必定要设置一个管理员drone-server
中的变量 DRONE_SERVER_PROTO
和 DRONE_SERVER_HOST
决定了你仓库中 webhook
的地址,若是你的域名作了 http to https
,并且你的DRONE_SERVER_PROTO
是 http
,将会产生301重定向,method
从 post
转成 get
,会发生error 405
drone
是用GO语言开发的,drone
使用的http
包,不支持没写协议的 url
,例如 dronetest.yiranzai.top
不能被识别,要写成 http(s)://dronetest.yiranzai.top
不说了,我去调整心态了并生产BUG了。