[小團隊自動化] (一) 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了。

相關文章
相關標籤/搜索