[小团队自动化] (一) Drone CI For Github —— 打造本身的CI/CD工做流

(一) Drone CI For Github —— 打造本身的CI/CD工做流


了解Drone

Drone是一种基于容器技术的持续交付系统。Drone使用简单的YAML配置文件(docker-compose的超集)来定义和执行Docker容器中的Pipelines。node

Drone与流行的源代码管理系统无缝集成,包括GitHub,GitHub Enterprise,Bitbucket等。mysql


Drone CI For Github

让咱们一块儿开始实践 Drone 的部署和使用nginx

准备工做

在这里,我为 Drone Server 使用的域名是 dronetest.yiranzai.topgit

了解Docker-compose

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。github

写了一个小Demo帮助你更快了解Docker-composeweb

申请一个Github OAuth Application

Github OAuth Application是为了受权 Drone Server 读取你的 Github 信息。sql

参照我以前写的Demo 一张图搞定 Github Create an OAuth Applicationdocker

记下生成的 Client IDClient Secretvim

编写docker-compose.yml

咱们须要bash

  • drone-server(中央Drone服务器)
  • drone-agent (接收来自中央Drone服务器的指令以执行构建管道)
  • mysqldrone 默认的数据存储是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验证,而后会开始同步你全部的仓库。

访问dronetest.yiranzai.top

写到这里,Drone CI for Github 就已经搭建成功了,是否是很开心,是否是很知足?结束了吗?并无!

咱们还要测试一下 Drone Server ,测试服务的可用性。

说干就干,开搞。

验证服务

没有通过实践的项目不是可用的项目

建立空仓库,并同步到 Drone 激活

仓库怎么建立就再也不赘述,在这里,我建立一个名为 dronetest 的仓库,并回到 Drone 同步仓库

  1. 同步仓库

同步仓库

  1. 激活仓库

激活之后,检查一下GIthub仓库的Webhooks

激活仓库

Webhook

  1. 添加 Secrets

    在这里我建立了两个Secret name: yiranzai word: Hello World!

添加Secrets

编写 .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
复制代码

推到仓库,查看效果

  1. push to repo
git init
git add .;git commit -m 'init test'
git remote add origin git@github.com:yiranzai/dronetest.git
git push -u origin master
复制代码
  1. 查看 DroneACTIVITY FEED

若是成功就会以下图所示

ACTIVITY FEED

若是失败,会有错误信息

这里是因为我用的 node 镜像是 node:alpine ,没有 bash

  1. 去服务器检查一下

    看到 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_PROTODRONE_SERVER_HOST 决定了你仓库中 webhook 的地址,若是你的域名作了 http to https ,并且你的DRONE_SERVER_PROTOhttp,将会产生301重定向,methodpost 转成 get,会发生error 405
  • drone 是用GO语言开发的,drone 使用的http 包,不支持没写协议的 url,例如 dronetest.yiranzai.top 不能被识别,要写成 http(s)://dronetest.yiranzai.top
  • 建议测试阶段打开debug,方便部署和调试

系列文章

END

不说了,我去调整心态了并生产BUG了。

相关文章
相关标签/搜索