用drone實現go項目CI

最近一直在忙於項目,沒有時間時間分享,就在最近為了提高團隊的工作協作效率,就動手實踐利用drone實現項目的自動部署。

在之前,自己一直用svn的鉤子實現自動部署,後面又有強大的工具Jenkins。再到後面逐漸瞭解學習docker技術,就遇到了drone,相比Jenkins的複雜配置,確實簡單不少,今天分享一個golang的自動部署,配合gitea使用的(gitea不錯),有需要的朋友們可以參考一下。

廢話不多說,大家不要隨便相信網上的文章,詳細使用盡可能參考官方文檔,介紹的比較細緻。

https://drone.io/

下面介紹一個過程:

1.docker環境的安裝

這裡會涉及docker和docker-compose的安裝,此處省去……

2.drone環境的安裝

本文采用docker-compose安裝,附上docker-compose參考(順道提一下,網上很多資料都用的是

早起版本drone-server 和 drone-agent,新的版本已經採用drone-runner,不使用drone-agent了)

server配置官方參考:https://docs.drone.io/server/provider/gitea/

runner配置官方參考:https://docs.drone.io/runner/docker/installation/linux/

其中涉及有gitea相關的配置,官方資料描述的還是很詳細的。

<code>其中涉及有gitea相關的配置,官方資料描述的還是很詳細的。version: '3.7'
services:
drone-server:
image: drone/drone
container_name: drone-server
volumes:
- ./drone:/data
environment:
- DRONE_USER_CREATE=username:*,admin:true #配置某個管理員賬號為管理員
- DRONE_GITEA_CLIENT_ID=* #gitean配置的oauth客戶端id
- DRONE_GITEA_CLIENT_SECRET=* #gitean配置的oauth客戶端秘鑰
- DRONE_GITEA_SERVER=* #瀏覽器可訪問的gitea地址
- DRONE_GIT_ALWAYS_AUTH=false
- DRONE_RPC_SECRET=* #drone-runner連接時候使用的秘鑰
- DRONE_SERVER_HOST=* #瀏覽器可訪問的drone地址
- DRONE_SERVER_PROTO=http
restart: always
networks:
- devn
drone-runner:
image: drone/drone-runner-docker
container_name: drone-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_SECRET=* #drone-runner連接時候使用的秘鑰
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=drone_runner
restart: always
networks:
- devn
networks:
devn:
external: true/<code>

3.drone.yml配置

這個地方涉及的內容也請參考官方文檔,不要相信網上的資料,太亂了。

官方資料地址:https://docs.drone.io/pipeline/docker/syntax/

<code>kind: pipeline #對象類型
type: docker #管道類型,drone支持不同的類型
name: default #管道名稱,一個項目可以有多個管道

#克隆設置
clone:
disable: true
#管道步驟
steps:
#clone代碼
- name: clone
image: alpine/git
commands:
- git clone http://xxx.com/xxx.git xxx
#觸發設置
when:
branch:
- master
event:
- push
#編譯
- name: build #管道步驟名稱
image: golang #執行shell命令的docker鏡像
volumes:
- name: www
path: /app
envionment:
GOOS: linux
GOARCH: amd64
commands: #定義在docker容器內作為容器入口點執行的shell命令列表
- export GOPROXY=https://goproxy.cn
- cd xxx
- go build -o xxx
- cp -f xxx /app/
- cp -rf etc /app/
#運行
- name: run
image: appleboy/drone-ssh

settings:
host:
from_secret: DRONE_SSH_HOST
port: 22
username:
from_secret: DRONE_SSH_USER
password:
from_secret: DRONE_SSH_PASS
/> - cd /data/wwwroot/xxx
- docker-compose up -d
- docker-compose restart
volumes:
- name: www
host:
path: /data/wwwroot/xxx/app/<code>

先是pipeline的類型等聲明,其實沒啥好說的。

  • 然後就是clone和workspace的聲明,我這裡只配置的clone,就是不使用默認的克隆動作。
  • 然後配置管道步驟
  • 先是克隆代碼,其中每個step中都可以使用docker的官方鏡像,啟用一個容器執行動作。克隆這裡就是使用的git鏡像,然後可以設置觸發條件,就是什麼時候拉取代碼。
  • 再是編譯,此處使用golang鏡像,命令處別忘設置golang的加速代理,否則編譯過程下載依賴包巨慢。編譯完成後,拷貝編譯結果到宿主機項目位置。
  • 再是運行,這裡需要在宿主機開通一個系統賬號(useradd xxx),將其加入wheel組(usermod -g wheel xxx),配置其sudoer權限(vim /etc/sudoers,反註釋掉wheel)。這裡注意,我使用的用戶名,密碼啥的,沒有使用明文,而是引用的是配置項,這些配置項是通過drone-server後臺配置的(就是你配置完drone-server後,有個訪問後臺可以訪問,具體看你的配置),最後別忘了,開通管道賬號別忘加入docker組,否則在進行docker-compose會出錯。
  • 最後說明,所有的管道步驟都處在同一個目錄工作空間,就是都是在同個文件目錄下。因為要和宿主機交互,所以我配置了一個volumes全局卷,這樣就可以和steps中的目錄映射上,就好比掛在一樣。這裡需強調一下,你授權的git賬號一定要在配置drone-server時候配置為管理員,否則配置全局卷是,會出錯,告訴你無權限。

利用瀏覽器,打開drone-server後臺頁面,啟用相應的代碼庫,這樣就可以了,動手試試吧


用drone實現go項目CI/CD自動化

drone


分享到:


相關文章: