搭建Gitea+Drone輕量級(jí)代碼管理和CI服務(wù)
使用環(huán)境
IP地址 端口 所屬服務(wù) 10.10.9.208 3000 Gitea網(wǎng)頁(yè)管理服務(wù) 10.10.9.208 2222 SSH、HTTP下載代碼服務(wù) 10.10.9.208 7500 Drone-Server服務(wù) 10.10.9.208 3100 Drone-Runner。
Gitea
簡(jiǎn)介
Gitea 是一個(gè)開(kāi)源社區(qū)驅(qū)動(dòng)的輕量級(jí)代碼托管解決方案,后端采用 Go 編寫(xiě),采用 MIT 許可證,它是從Gogs發(fā)展而來(lái)的,因?yàn)镚ogs由單一管理者做決定,因此誕生了Gitea,它采用社區(qū)管理模式,增加了諸多新特性,而且由社區(qū)眾多的維護(hù)者來(lái)決定它的發(fā)展方向,因此擁有更強(qiáng)的生命力和發(fā)展?jié)摿Α?/span>
Gitea 的首要目標(biāo)是創(chuàng)建一個(gè)極易安裝,運(yùn)行非??焖?,安裝和使用體驗(yàn)良好的自建 Git 服務(wù)。采用 Go 作為后端語(yǔ)言,只要生成一個(gè)可執(zhí)行程序即可。并且他還支持跨平臺(tái),支持 Linux, macOS 和 Windows 以及各種架構(gòu),除了 x86,amd64,還包括 ARM 和 PowerPC。
功能特性
- 支持活動(dòng)時(shí)間線。
- 支持 SSH 以及 HTTP/HTTPS 協(xié)議。
- 支持 SMTP、LDAP 和反向代理的用戶認(rèn)證。
- 支持反向代理子路徑。
- 支持用戶、組織和倉(cāng)庫(kù)管理系統(tǒng)。
- 支持添加和刪除倉(cāng)庫(kù)協(xié)作者。
- 支持倉(cāng)庫(kù)和組織級(jí)別 Web 鉤子(包括 Slack 集成)。
- 支持倉(cāng)庫(kù) Git 鉤子和部署密鑰。
- 支持倉(cāng)庫(kù)工單(Issue)、合并請(qǐng)求(Pull Request)以及 Wiki。
- 支持遷移和鏡像倉(cāng)庫(kù)以及它的 Wiki。
- 支持在線編輯倉(cāng)庫(kù)文件和 Wiki。
- 支持自定義源的 Gravatar 和 Federated Avatar。
- 支持郵件服務(wù)。
- 支持后臺(tái)管理面板。
- 支持 MySQL、PostgreSQL、SQLite3、MSSQL 和 TiDB(MySQL) 數(shù)據(jù)庫(kù)。
- 支持多語(yǔ)言本地化(21 種語(yǔ)言)。
- 支持軟件包注冊(cè)中心(Composer/Conan/Container/Generic/Helm/Maven/NPM/Nuget/PyPI/RubyGems)。
安裝
Gitea的官方文檔有中文版,其中介紹了多種安裝方式,我們以docker部署為例,采用最基本的部署方式,即使用內(nèi)部sqlite3為數(shù)據(jù)庫(kù),docker-compose部署配置文件如下:
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.17.2
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- SSH_PORT=2222
restart: always
networks:
- gitea
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"
其中環(huán)境變量的配置很多,我們可以在官方文檔中查看,這里主要修改一下SSH_PORT的端口,因?yàn)槟J(rèn)使用22端口,這會(huì)和主機(jī)的ssh服務(wù)端口沖突,因此我們修改一下端口為2222,3000端口為網(wǎng)頁(yè)管理端口,其他的配置在第一次訪問(wèn)時(shí)會(huì)通過(guò)網(wǎng)頁(yè)的方式配置。
使用命令啟動(dòng)鏡像:
docker-compose up -d
配置
因?yàn)楸容^輕量級(jí),所以啟動(dòng)速度非常快,第一次訪問(wèn)網(wǎng)頁(yè)端會(huì)進(jìn)入初始配置頁(yè)面。
這里需要配置的項(xiàng)目有以下幾個(gè):
- 站點(diǎn)名稱:名稱隨意配置。
- 服務(wù)器域名:就是宿主機(jī)的IP地址或者綁定的域名。
- 基礎(chǔ)URL:這里就是網(wǎng)頁(yè)訪問(wèn)地址,把localhost改為宿主機(jī)IP或者域名即可。
在可選設(shè)置中需要修改一些配置,服務(wù)器和第三方服務(wù)設(shè)置和管理員賬號(hào)設(shè)置。
服務(wù)器和第三方服務(wù)設(shè)置
這里主要是啟用本地模式,因?yàn)槟J(rèn)會(huì)使用CDN連接一些外網(wǎng)的資源,對(duì)于服務(wù)器不能連接外網(wǎng)的公司,必須要啟用本地模式。一般我們都是企業(yè)內(nèi)使用,因此不需要用戶注冊(cè),通過(guò)管理員創(chuàng)建賬號(hào)即可。
管理員賬號(hào)設(shè)置
默認(rèn)第一個(gè)注冊(cè)用戶會(huì)成為管理員,我們直接在這里創(chuàng)建好管理員信息,這里要注意的是用戶名有一些保留字是不能使用的,例如admin
配置好以后點(diǎn)擊“立即安裝”就可以進(jìn)入用戶頁(yè)面。
導(dǎo)入外部倉(cāng)庫(kù)代碼
Gitea支持從以下代碼管理倉(cāng)庫(kù)導(dǎo)入代碼庫(kù)
如果要支持導(dǎo)入,還要進(jìn)行一些配置,在gitea/conf/app.ini文件中增加如下配置。
[migrations]
ALLOW_LOCALNETWORKS = true
[webhook]
ALLOWED_HOST_LIST = 10.10.9.208/16
然后重啟容器。
docker-compose restart
Drone
簡(jiǎn)介
Drone 是一款基于 Docker 的 CI/CD 工具,所有編譯、測(cè)試、發(fā)布的流程都在 Docker 容器中進(jìn)行。
開(kāi)發(fā)者只需在項(xiàng)目中包含 .drone.yml 文件,將代碼推送到 git 倉(cāng)庫(kù),Drone 就能夠自動(dòng)化地進(jìn)行編譯、測(cè)試、發(fā)布。
為什么使用 Drone 作為 CI/CD 工具
- 功能靈活強(qiáng)大:構(gòu)建、測(cè)試、發(fā)布、部署,你想干什么都可以,一套系統(tǒng)全搞定。
- 兼容性好:支持所有 SCM、所有平臺(tái)、所有語(yǔ)言。
- 環(huán)境部署簡(jiǎn)單:原生支持 Docker 容器,啟動(dòng)兩個(gè)容器就完成了部署,其它構(gòu)建、測(cè)試、部署工具在使用時(shí)會(huì)自動(dòng)從 docker 倉(cāng)庫(kù)拉取。
- 擴(kuò)展性強(qiáng):強(qiáng)大的插件系統(tǒng),豐富的插件可以免費(fèi)使用,也可以自定義。
- 配置簡(jiǎn)單:正如官方宣傳的那樣,“configuration as a code”,所有功能、步驟、工具、命令,一個(gè) yaml 配置文件全搞定。
- 維護(hù)簡(jiǎn)單:直接復(fù)用 SCM 的賬號(hào)體系和權(quán)限管理,無(wú)需注冊(cè)用戶、分配權(quán)限。
安裝
Drone 由兩部分構(gòu)成:
- Server負(fù)責(zé)任務(wù)調(diào)度。
- Runner執(zhí)行 Pipeline 的具體任務(wù)。
因此安裝有兩個(gè)鏡像drone/drone:2.13.0和drone/drone-runner-docker:1.8.2,首先下載鏡像。
docker pull drone/drone:2.13.0
docker pull drone/drone-runner-docker:1.8.2
Drone和Jenkins這類CI工具不一樣,它必須綁定指定的Git倉(cāng)庫(kù),因此在啟動(dòng)的時(shí)候必須配置好對(duì)應(yīng)的倉(cāng)庫(kù)信息。我們以Gitea倉(cāng)庫(kù)為例。
準(zhǔn)備工作
首先在Gitea里面創(chuàng)建好對(duì)應(yīng)的驗(yàn)證信息。
生成的令牌要記住,Drone使用OAuth2連接Gitea,這里創(chuàng)建好應(yīng)用,重定向URI配置Drone服務(wù)的登錄地址,雖然我們還沒(méi)有創(chuàng)建好Drone服務(wù),但是這里可以先填寫(xiě)好地址和端口,后面創(chuàng)建Drone服務(wù)的時(shí)候注意要和這里保持一致。
記錄下客戶端ID和客戶端密鑰。Drone是包含server和runner的,他們之間的通信需要進(jìn)行加密,可以通過(guò)如下方式生成密鑰:
openssl rand -hex 16
drone-server啟動(dòng)文件配置
version: "3"
services:
drone-server:
image: drone/drone:2.13.0
container_name: drone-server
restart: always
ports:
- "7500:80"
volumes:
- ./data:/data
environment:
- DRONE_GITEA_SERVER=http://10.10.9.208:3000
- DRONE_GITEA_CLIENT_ID=9eedfa2e-b0aa-497e-aaee-c7434755fd9c
- DRONE_GITEA_CLIENT_SECRET=gto_zdessdivpj4gly2lqq2bby3qvsa6xbbrbrngj3rv24pzotsfjw4q
- DRONE_RPC_SECRET=7cc96b3ca902a735958033cb233abb6e
- DRONE_SERVER_HOST=10.10.9.208:7500
- DRONE_SERVER_PROTO=http
- DRONE_USER_CREATE=username:xingxing,admin:true
- DRONE_GITEA_CLIENT_ID(必填) Gitea OAuth 客戶端ID。
- DRONE_GITEA_CLIENT_SECRET(必填)Gitea OAuth 客戶端密鑰。
- DRONE_GITEA_SERVER(必填)Gitea 服務(wù)器地址,例如 http://10.10.9.208:3000。注意填寫(xiě)準(zhǔn)確的http(s)協(xié)議,否則你會(huì)看到來(lái)自 Gitea 的錯(cuò)誤報(bào)告:unsupported protocol scheme。
- DRONE_RPC_SECRET(必填)在準(zhǔn)備工作中使用 openssl rand -hex 16生成的共享密鑰。這個(gè)密鑰用于驗(yàn)證 Drone Server 和 Runner 之間的 RPC 連接。因此,在 Server 和 Runner 上都必須使用相同的密鑰。
- DRONE_SERVER_HOST(必填)訪問(wèn) Drone 時(shí)所用的域名或 IP 地址。如果使用 IP 地址,還應(yīng)該包含端口。 例如 http://10.10.9.208:7500。
- DRONE_SERVER_PROTO(必填)設(shè)置服務(wù)器的協(xié)議,使用:http或https。 默認(rèn)為https。
- DRONE_USER_CREATE管理員配置,這里的管理員用戶名是Git倉(cāng)庫(kù)的用戶名,不一定是Git倉(cāng)庫(kù)的管理員,只要是Git倉(cāng)庫(kù)的用戶即可
配置完后啟動(dòng)drone-server服務(wù)。
docker-compose up -d
然后訪問(wèn)http://10.10.9.208:7500會(huì)自動(dòng)跳到Gitea的授權(quán)頁(yè)面,授權(quán)后填寫(xiě)郵箱、用戶名、公司即可進(jìn)入頁(yè)面。在這里要注意一點(diǎn),Drone是沒(méi)有登錄界面的,那么它是怎么獲取到Gitea中的倉(cāng)庫(kù)進(jìn)行構(gòu)建的呢?
Drone和Gitea共用用戶信息,當(dāng)我們?cè)L問(wèn)Drone的時(shí)候,如果在相同的瀏覽器內(nèi)登錄了Gitea,那么Drone就會(huì)使用當(dāng)前Gitea登錄用戶的信息獲取倉(cāng)庫(kù)數(shù)據(jù);如果沒(méi)有登錄Gitea,那就會(huì)跳轉(zhuǎn)到Gitea等登錄頁(yè)面。這個(gè)地方讓我困惑了很久,一直不知道為什么有些倉(cāng)庫(kù)可以獲取到,有些倉(cāng)庫(kù)又獲取不到。還要注意一點(diǎn),如果已經(jīng)打開(kāi)了Drone,我們?cè)偾袚Q了Gitea登錄的用戶,那么Drone是不會(huì)自動(dòng)進(jìn)行切換的,這個(gè)時(shí)候需要在Drone中退出登錄,再刷新頁(yè)面登入即可實(shí)現(xiàn)切換賬號(hào)。
進(jìn)入后我們就看到了當(dāng)前可以構(gòu)建的倉(cāng)庫(kù),如果在Gitea增加了參與的項(xiàng)目,而這里又看不到,可以點(diǎn)擊Sync按鈕進(jìn)行手動(dòng)同步。然后進(jìn)入倉(cāng)庫(kù)激活它,進(jìn)行一些設(shè)置。
不要接收pull和fork的WebHook消息,Trusted這里只有Drone管理員才能看到,其他用戶是看不到的。
drone-runner啟動(dòng)文件配置
version: "3"
services:
drone-runner:
image: drone/drone-runner-docker:1.8.2
restart: always
container_name: drone-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=10.10.9.208:7500
- DRONE_RPC_SECRET=7cc96b3ca902a735958033cb233abb6e
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=runner
- DRONE_RPC_HOST填寫(xiě) Drone Server 的主機(jī)名(以及可選填的端口號(hào))。
- DRONE_RPC_PROTO傳輸協(xié)議:http或https。
- DRONE_RPC_SECRET與 Drone Server 共享的密鑰,就是在準(zhǔn)備工作中使用 openssl rand -hex 16生成的共享密鑰。
- DRONE_RUNNER_CAPACITYRunner 可以并發(fā)執(zhí)行的流水線數(shù)量,默認(rèn):2。
- DRONE_RUNNER_NAME自定義 Runner 名稱。
驗(yàn)證runner是否成功。
docker logs drone-runner
日志中包含以下內(nèi)容則表示啟動(dòng)成功。
starting the server
successfully pinged the remote server
使用構(gòu)建
Drone是采用配置文件的方式進(jìn)行流水線配置的,因此我們首先要在對(duì)應(yīng)的倉(cāng)庫(kù)根目錄下創(chuàng)建.drone.yml文件,內(nèi)容如下:
kind: pipeline
type: docker
name: test
文件提交后就會(huì)自動(dòng)觸發(fā)構(gòu)建。
我們可以通過(guò)手動(dòng)在Drone中創(chuàng)建一個(gè)流水線也可以通過(guò)配置觸發(fā)方式來(lái)自動(dòng)觸發(fā),在使用Jenkins的時(shí)候,我們需要在Git倉(cāng)庫(kù)中配置WebHook,并且選擇WebHook的觸發(fā)事件,這樣才能自動(dòng)觸發(fā)構(gòu)建,但是在安裝配置Drone的時(shí)候我們并沒(méi)有配置觸發(fā)方式,為什么添加了.drone.yml文件就自動(dòng)觸發(fā)構(gòu)建了呢?原因是因?yàn)镈rone是與Git倉(cāng)庫(kù)綁定的,當(dāng)我們?cè)趧?chuàng)建Drone服務(wù)的時(shí)候已經(jīng)配置了Gitea倉(cāng)庫(kù)的認(rèn)證信息,那么當(dāng)我們?cè)贒rone中激活一個(gè)項(xiàng)目的時(shí)候,Drone就會(huì)自動(dòng)在Gitea中為對(duì)應(yīng)的項(xiàng)目創(chuàng)建WebHook。
進(jìn)入WebHook編輯頁(yè)面,會(huì)看到默認(rèn)幫我們選中了一些觸發(fā)條件。
在這里配置一下我們的觸發(fā)條件,就可以自動(dòng)觸發(fā)構(gòu)建。在這里要注意一下,Gitea在觸發(fā)WebHook的時(shí)候,必須配置可以接收WebHook消息的列表,還記得我們?cè)谏厦媾渲玫?/span>webhook.ALLOWED_HOST_LIST嗎?主要就是在這里使用的,如果沒(méi)有配置,那么觸發(fā)以后就會(huì)報(bào)錯(cuò),報(bào)錯(cuò)信息可以在WebHook配置頁(yè)面的下方看到。
到這里我們的Gitea+Drone自動(dòng)化構(gòu)建系統(tǒng)就完成了,下面還有一個(gè)小技巧。在Drone的項(xiàng)目配置頁(yè)面,我們會(huì)看到Badges選項(xiàng)。
把里面的內(nèi)容復(fù)制出來(lái),添加到項(xiàng)目的README.md文件頭部,這樣我們就可以在Gitea項(xiàng)目頁(yè)面中看到當(dāng)前流水線的狀態(tài),就像右上角紅框中顯示的那樣。