Drone 自動打包Laravel imgae 並上傳到docker hub上
先說說Drone的概念,Drone可以分為Server與Agent兩者
Server負責與Git hub等版本庫溝通,然後依照pipeline指令分派給Agent執行
而Agent在執行時則是完全透過docker containter的環境完成所有指令
簡單說就是pipeline中定義的每一個step都是給定一個image來執行指定的command
今天要完成的是利用Drone連結github,當git push後將程式碼重新封裝到新的image然後上傳到dockerhub上
參考資料
https://docs.drone.io/configure/pipeline/
https://ithelp.ithome.com.tw/articles/10223277
如果你沒過Docker請先閱讀MAC安裝Docker
安裝Drone
安裝前 因為要連結github,所以先到github上設定好 OAuth Apps
路徑為 : Settings > Developer settings > OAuth Apps > New OAuth App
https://github.com/settings/applications/new
填寫資訊如下

上面的資訊,Drone可為自行設定的APP名稱,MY_SERVER_URL則是架設Drone的伺服器IP port或者網址,最後一個Authorization callback URL 則只需要在MY_SERVER_URL後面加入/login 即可
按下 Register application後會拿到Client ID 以及Client Secret,這兩者會在下方設定檔用上
接著Drone的安裝其實很簡單,可以按照官網上的說明啟動兩個docker就可以了(Server + Agent),也可以透過docker compose一次啟動兩個containter
備妥以下docker-compose.yml 以及.env設定檔即可
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  | 
						ersion: '3' services:   drone-server:     image: drone/drone:latest #指定server為drone最新版     ports:       - 80:80     volumes:       - ./:/data     restart: always     environment:       - DRONE_SERVER_HOST=${DRONE_SERVER_HOST} #Drone server url 填寫在.env檔案中       - DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} #Drone server protocol 填寫在.env檔案中       - DRONE_RPC_SECRET=${DRONE_RPC_SECRET} #自定義隨機碼,填寫在.env檔案中       - DRONE_AGENTS_ENABLED=true       # Github Config       - DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID} #github client ID,填寫在.env檔案中       - DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET} #github client secret,填寫在.env檔案中   drone-agent:     image: drone/drone-runner-docker:latest     ports:       - 3000:3000     restart: always     depends_on:       - drone-server     volumes:       - /var/run/docker.sock:/var/run/docker.sock     environment:       - DRONE_RPC_PROTO=http       - DRONE_RPC_HOST=drone-server       - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}       - DRONE_RUNNER_NAME=${DRONE_HOSTNAME} #自訂host name 填寫在.env檔案中       - DRONE_RUNNER_CAPACITY=2  | 
					
.env
| 
					 1 2 3 4 5 6  | 
						DRONE_SERVER_HOST=MY_SERVER_URL #Drone server的網址或者IP DRONE_SERVER_PROTO=http DRONE_RPC_SECRET=gEY6Ys1knt3fJnAsda #自行定義亂數即可 DRONE_GITHUB_CLIENT_ID=1234567 #上面github app 拿到的client id DRONE_GITHUB_CLIENT_SECRET=7654321 #上面github app 拿到的client secret DRONE_HOSTNAME=test_host #自行定義的host name  | 
					
檔案編寫完成後即可用
| 
					 1  | 
						docker-compose up -d  | 
					
來啟動Drone server 以及Drone Agent兩台container
認證啟動專案
Drone啟動後,透過瀏覽器連線到MY_SERVER_URL,畫面會跳到github上作認證,完成後就可以看到像這樣子在github上的列表了

要啟動哪個專案就按下右邊的”ACTIVATE”按鈕來設定
(如果按下ACTIVATIVE沒有反應肯定是.evn裡面變數設定有錯誤,請檢查)

1.0版後的Drone可以設定.drone.yml的位置,如果沒有要修改的話,按下”SAVE”按鈕就行了
PIPELINE
專案連結上後,接著就是要讓Drone知道收到git push後該做什麼事情,假設現在要設定drone_test2這個專案,在專案根目錄建立.drone.yml,加入git跟著一起push上github即可
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  | 
						--- kind: pipeline type: docker #在docker環境中執行 name: test #自定義pipleline名稱 platform:   os: linux   arch: amd64 steps: #工作列表 - name: build-nginx-image #自訂工作名稱   pull: if-not-exists #要不要pull指定的image   image: plugins/docker #指定要拿來執行command的image或者plugin   settings:     registry: registry.hub.docker.com #dockerhub registry url     repo: registry.hub.docker.com/virtualorz/docker_compose_nginx_build #打包完要上傳的docker repo名稱     dockerfile: dockerfiles/dockerfile_for_nginx/Dockerfile #根據指定的Docker file打包image     auto_tag: true #自動下tag     username: DOCKERHUB_USER #dockerhub user name     password: DOCKERHUB_PASSWORD #dockerhub password - name: build-php-image   pull: if-not-exists   image: plugins/docker   settings:     registry: registry.hub.docker.com     repo: registry.hub.docker.com/virtualorz/dev_compose_php73_laravel_build     dockerfile: dockerfiles/dockerfile_for_laravel/Dockerfile     auto_tag: true     username: DOCKERHUB_USER     password: DOCKERHUB_PASSWORD  | 
					
上面的yml檔一共做兩件事情,都寫在step中
一共打包兩個image檔,完成後都上傳到dockerhub中
其中,Dockerfile我只做了一件事情,就是把上傳到dithub的程式碼搬移到image中,像這樣子
| 
					 1 2 3  | 
						FROM virtualorz/dev_compose_nginx COPY . /var/project  | 
					
Drone在在動的時後會先將github上的repo先clone到根目錄中,所以COPY路徑指定 . 即可
隨著.drone.yml push到github上後,Drone隨即會開始作動

可以看到左邊的選單一共有三個工作,兩個是.drone.yml中定義的,第一個clone則是上面提到Drone會先將repo clone到根目錄中
如果工作都正常完成會打上綠色勾勾,如果有問題會在右方顯示錯誤訊息,並且顯示紅色叉叉
等到所有工作完成後,你會在dockerhub上看到多了兩個新上傳的image!
以上,完成今天的任務目標,以後只要git push 就可以自動的打包成image了