目錄
- 前言
- 準(zhǔn)備
- 安裝drone ci
- 1、docker-compose配置文件
- 2、docker-compose配置文件主要參數(shù)詳解
- drone server
- DRONE_SERVER_PROTO和DRONE_SERVER_HOST
- DRONE_RPC_SECRET
- DRONE_USER_CREATE
- DRONE_DATABASE_DRIVER
- DRONE_DATABASE_DATASOURCE
- DRONE_GITEE_CLIENT_ID和DRONE_GITEE_CLIENT_SECRET
- drone runner
- 3、執(zhí)行部署
- 進(jìn)入管理界面
- 添加.drone.yml文件
- 總結(jié)
前言
一直想自動(dòng)化部署博客,但一直沒有實(shí)施計(jì)劃,直到最近有時(shí)間,就搞了起來。ci/cd的工具很多,我想drone ci應(yīng)該是一款非常適合前端的工具,簡單,輕量級(jí),基于docker,支持主流代碼托管網(wǎng)站,比如github,gitee,gitlab等等。
準(zhǔn)備
我們需要一個(gè)已備案的域名和服務(wù)器,并申請(qǐng)好ssl證書,用于https證書。我是使用騰訊云的輕量級(jí)服務(wù)器,大家可以自行選擇。至于域名備案和ssl證書申請(qǐng),各個(gè)平臺(tái)大同小異,大家按照其文檔說明弄,應(yīng)該不會(huì)有太多問題,就不一一贅述了。
在有了服務(wù)器后,我們需要安裝docker和docker-compose,這樣我們直接運(yùn)行docker-compose配置文件就可以輕松安裝好drone ci。本文主要是講解drone ci,所以docker和docker-compose的安裝和使用,大家可以自行學(xué)習(xí),在此當(dāng)做默認(rèn)已經(jīng)安裝。
代碼托管網(wǎng)站使用了gitee碼云。
安裝drone ci
1、docker-compose配置文件
通過docker-compose配置文件可以輕松安裝drone ci,新建一個(gè)docker-compose.yml文件,內(nèi)容如下
version: "3.7" # 創(chuàng)建自定義網(wǎng)絡(luò) networks: drone: # external: false driver: bridge services: # 數(shù)據(jù)庫服務(wù) db: image: postgres:latest container_name: drone_db restart: always networks: - drone # 加入到drone網(wǎng)絡(luò) ports: - "8081:5432" # 8081為容器暴露到服務(wù)器的端口,5432為容器內(nèi)改應(yīng)用的端口 environment: - POSTGRES_USER=username # PGSQL默認(rèn)用戶名 - POSTGRES_PASSWORD=password # PGSQL默認(rèn)密碼 - POSTGRES_DB=db_name # PGSQL默認(rèn)數(shù)據(jù)庫的名字 volumes: - /volumes/drone/db:/var/lib/postgresql/data # 數(shù)據(jù)卷,前者為服務(wù)器真實(shí)位置,后者為改應(yīng)用在容器內(nèi)的位置 # Drone Server 服務(wù) server: image: drone/drone:latest container_name: drone_server restart: always networks: - drone # 加入到drone網(wǎng)絡(luò) ports: - "7929:80" - "4443:443" environment: - DRONE_SERVER_PROTO=https # 訪問協(xié)議,創(chuàng)建webHooks和重定向 - DRONE_SERVER_HOST=xxxx.com # 主機(jī)名稱,創(chuàng)建webHooks和重定向 - DRONE_RPC_SECRET=xxxxxxxxx # 與 drone runner 通訊的密鑰 - DRONE_USER_CREATE=username:xxxxxx,admin:true # 管理員賬戶 - DRONE_DATABASE_DRIVER=postgres # 數(shù)據(jù)庫類型 - DRONE_DATABASE_DATASOURCE=postgres://username:password@db/db_name?sslmode=disable # 數(shù)據(jù)庫連接 - DRONE_GIT_ALWAYS_AUTH=true # 使用 oauth 身份驗(yàn)證信息拉取代碼 - DRONE_GITEE_CLIENT_ID=xxxxxxxx # GITEE 客戶端 id - DRONE_GITEE_CLIENT_SECRET=xxxxxxxxxxxx # GITEE 客戶端 密鑰 - DRONE_GITEE_SKIP_VERIFY=false # 禁用 GITEE 鏈接時(shí) tls 驗(yàn)證 volumes: - /volumes/drone/server:/data - /var/run/docker.sock:/var/run/docker.sock depends_on: - db # Drone Docker Runner runner: image: drone/drone-runner-docker:latest # 目前drone-runner-docker最新版本為 1.8.0 container_name: drone_runner restart: always networks: - drone # 加入到drone網(wǎng)絡(luò) ports: - "7930:3000" environment: - DRONE_RUNNER_NAME=docker-runner - DRONE_RUNNER_CAPACITY=10 # 限制runner可執(zhí)行的并發(fā)管道數(shù)量 - DRONE_RPC_PROTO=https # 訪問drone server 協(xié)議 - DRONE_RPC_HOST=xxxxx.com # 訪問drone server 服務(wù)器地址 - DRONE_RPC_SECRET=xxxxxxx # 與 drone server 通訊的密鑰 - DRONE_UI_USERNAME=username # Drone Runner 的 UI 用戶賬號(hào) - DRONE_UI_PASSWORD=password # Drone Runner 的 UI 用戶密碼 # - DRONE_RUNNER_NETWORKS=drone_net volumes: - "/var/run/docker.sock:/var/run/docker.sock" depends_on: - server
2、docker-compose配置文件主要參數(shù)詳解
配置文件里一些常用參數(shù)在上面的注釋里已經(jīng)有解釋,這里只講解drone server和drone runner的配置項(xiàng)
drone server
基礎(chǔ)的鏡像版本,端口設(shè)置,網(wǎng)絡(luò)設(shè)置不再贅述,這些都是docker compose最常見的配置,主要是environment里面的參數(shù)說明
DRONE_SERVER_PROTO和DRONE_SERVER_HOST
這個(gè)參數(shù)是在代碼托管網(wǎng)站的配置里設(shè)置的,詳細(xì)配置會(huì)在后面說明,每個(gè)代碼托管網(wǎng)站的配置大同小異,這個(gè)網(wǎng)址是drone ci的管理網(wǎng)站,可以查看drone ci運(yùn)行的詳細(xì)流程等
DRONE_RPC_SECRET
這個(gè)參數(shù)是drone server與drone runner通訊的秘鑰,在服務(wù)器使用OpenSSL生成,生成方法如下
$ openssl rand -hex 16
DRONE_USER_CREATE
這個(gè)參數(shù)非常重要,為drone ci管理網(wǎng)站的登錄賬號(hào),這個(gè)賬號(hào)名一定要與代碼托管網(wǎng)站的用戶名一致,這樣才能登錄管理員賬號(hào),如果無法登錄管理員賬號(hào),將無法授權(quán)拉取代碼時(shí)的權(quán)限,運(yùn)行時(shí)將會(huì)報(bào)錯(cuò)
DRONE_DATABASE_DRIVER
數(shù)據(jù)庫類型,就是上面自己配置的數(shù)據(jù)庫
DRONE_DATABASE_DATASOURCE
postgres://username:password@db/db_name?sslmode=disable,這個(gè)參數(shù)中username為數(shù)據(jù)設(shè)置的用戶名,password為數(shù)據(jù)庫登錄密碼,db/db_name中db為固定值,db_name為創(chuàng)建的表名稱,這些參數(shù)都是上面數(shù)據(jù)庫的配置參數(shù)
DRONE_GITEE_CLIENT_ID和DRONE_GITEE_CLIENT_SECRET
這兩個(gè)參數(shù)是在代碼托管網(wǎng)站獲取,我使用的是gitee碼云。如何申請(qǐng)?
1、注冊(cè)碼云
2、創(chuàng)建OAuth應(yīng)用
進(jìn)入碼云設(shè)置中心,找到第三方應(yīng)用
點(diǎn)擊創(chuàng)建應(yīng)用
填寫創(chuàng)建應(yīng)用所需信息
創(chuàng)建成功后,進(jìn)入應(yīng)用詳情
其中的Client ID和Client Secret便是DRONE_GITEE_CLIENT_ID和DRONE_GITEE_CLIENT_SECRET
drone runner
DRONE_RPC_PROTO和DRONE_RPC_HOST
和DRONE_SERVER_PROTO,DRONE_SERVER_HOST相同
DRONE_UI_USERNAME和DRONE_UI_PASSWORD
改賬號(hào)信息為drone runner的賬號(hào)信息,不同于drone server,drone runner的管理界面主要查看server運(yùn)行的一些信息,而drone server的管理界面是管理應(yīng)用的
3、執(zhí)行部署
在docker-compose配置文件的當(dāng)前目錄下,執(zhí)行docker-compose up,drone ci就會(huì)自動(dòng)安裝
進(jìn)入管理界面
如果安裝沒有報(bào)錯(cuò),那么進(jìn)入瀏覽器,輸入你配置過的DRONE_SERVER_HOST(前提是這個(gè)域名已經(jīng)通過解析),便能進(jìn)入
登錄成功后進(jìn)入主頁面,此時(shí)會(huì)同步你代碼托管網(wǎng)站下的所有項(xiàng)目
點(diǎn)擊未激活項(xiàng)目,會(huì)直接進(jìn)入到setting配置頁
點(diǎn)擊Activate Repository按鈕,激活項(xiàng)目,激活項(xiàng)目便會(huì)進(jìn)入配置詳情頁
如果是管理員登入,project settings中的5個(gè)選項(xiàng)都會(huì)出現(xiàn),不然只會(huì)出現(xiàn)第一個(gè)選項(xiàng),打開第二個(gè)選項(xiàng)Trusted
最后save changes一下,保存更改,此時(shí)項(xiàng)目即為激活項(xiàng)目
添加.drone.yml文件
到此整個(gè)drone ci的服務(wù)已經(jīng)配置完成,那么如何持續(xù)部署我們的項(xiàng)目呢?對(duì)于cd有一定了解的人,都知道當(dāng)我們git push的時(shí)候項(xiàng)目會(huì)通過webhooks通知ci服務(wù),然后就會(huì)拉取代碼,重新部署代碼,從而完成一次ci/cd,這其中一個(gè)重要的配置文件起到重要作用,通常會(huì)向我們的項(xiàng)目中添加一個(gè)yaml文件,ci服務(wù)會(huì)讀取這個(gè)文件,從而執(zhí)行一個(gè)流程,完成部署。在drone ci中會(huì)向項(xiàng)目的根目錄添加一個(gè).drone.yml文件,這個(gè)文件如何編寫,我以我的blog項(xiàng)目為例,下面是其配置文件內(nèi)容
kind: pipeline # 定義一個(gè)管道 type: docker # 當(dāng)前管道的類型 name: test # 當(dāng)前管道的名稱 volumes: # 聲明數(shù)據(jù)卷(此為服務(wù)器中的實(shí)際目錄) - name: node_modules # 數(shù)據(jù)卷名稱 host: # Host Volume path: /volumes/drone/volumes/blog/node_modules # 宿主機(jī)目錄 #絕對(duì)路徑 - name: deploy_path host: path: /workspace/blog clone: disable: false # 啟用代碼拉取 steps: # 定義管道的執(zhí)行步驟 - name: deploy # 步驟名稱 image: node:16.13.2 # 當(dāng)前步驟使用的鏡像 depends_on: [clone] # 依賴的步驟 volumes: # 掛載數(shù)據(jù)卷(此為容器內(nèi)的目錄) - name: node_modules # 數(shù)據(jù)卷名稱 path: /drone/src/node_modules # 容器內(nèi)目錄 絕對(duì)路徑 - name: deploy_path path: /drone/src/html commands: # 當(dāng)前步驟執(zhí)行的命令 - pwd # 查看當(dāng)前目錄 - npm config set registry https://registry.npm.taobao.org # 切換淘寶鏡像 - npm install # 安裝node_modules包 - npm run build # 執(zhí)行編譯 # - rm -fr ./blog - ls /drone/src - cp -r ./public/* ./html - name: dingtalk-push image: lddsb/drone-dingtalk-message depends_on: [deploy] settings: token: xxxxxxxxxxxxxxxxxxxxxxxxxxx type: markdown message_pic: true sha_link: true when: event: [push] status: [success, failure]
.drone.yml文件的編寫較為復(fù)雜,具體請(qǐng)查詢drone文檔。其中dingtalk-push,是部署完成后通知釘釘,釘釘機(jī)器人的配置請(qǐng)查看釘釘?shù)奈臋n,該插件的詳細(xì)配置請(qǐng)查閱該插件文檔