【Drone+Gitlab】一條龍服務(wù),直接起飛 — 從介紹->部署->配置->寫(xiě).drone.yml流水線(xiàn)+常見(jiàn)的報(bào)錯(cuò)解決

推薦文章

概述

drone是一個(gè)持續(xù)集成化工具,能夠使用強(qiáng)大的云原生管道引擎自動(dòng)化他們的構(gòu)建、測(cè)試和發(fā)布工作流;
簡(jiǎn)單來(lái)說(shuō):類(lèi)似寫(xiě)shell腳本,只是腳本內(nèi)容不一樣;
其他持續(xù)集成工具,如:jenkins、gitlab-cicd;

環(huán)境準(zhǔn)備

  • linux系統(tǒng)
  • docker

動(dòng)手操作

容器部署gitlab

gitlab詳細(xì)安裝步驟,點(diǎn)擊這里;本次使用的gitlab-ce是docker hub倉(cāng)庫(kù),2022年5月最新版:

image.png
  • 如果hostname沒(méi)做DNS域名解析,請(qǐng)使用IP地址(不寫(xiě)端口,默認(rèn)80)。例:192.168.200.30
    注意:hostname不能包含端口,否則gitlab啟動(dòng)不起來(lái);
export GITLAB_HOME=/mydata/gitlab
docker run --detach \
  --hostname "192.168.200.30" \
  --publish 1443:443 --publish 80:80 --publish 1022:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest
  • 報(bào)錯(cuò)信息(后面的步驟):下圖因?yàn)?code>gitlab的hostname填寫(xiě)的域名(gitlab.admin.com),結(jié)果Drone流水線(xiàn)clone(克?。┐a時(shí)連接報(bào)錯(cuò):
    image.png

上圖的問(wèn)題除了修改gitlab主機(jī)名(hostname)之外,還可以修改drone-runner默認(rèn)clone(克?。┑刂方鉀Q。如下代碼(這里看不懂沒(méi)關(guān)系,請(qǐng)繼續(xù)往下看后面會(huì)解釋):

kind: pipeline
type: docker
name: default
clone:
  disable: true  #禁用默認(rèn)克隆
steps:
- name: clone-test
  image: alpine/git
  pull: if-not-exists  # 如果在本地緩存中找不到圖像,則僅拉取圖像
  commands:
  - git clone http://192.168.200.30/root/test.git  #自定義克隆地址
  - git version

- name: greeting
  image: alpine
  commands:
  - echo hello
  - echo world
[root@master drone]# docker exec -it gitlab bash
root@192:/# cat /etc/gitlab/initial_root_password |grep Password:
Password: RUb+s6cnRsJk7S7Mg785nHewbwzoL4Cblfk/nnGKWZA=
  • 創(chuàng)建 OAuth 應(yīng)用程序( Application)
    創(chuàng)建一個(gè) GitLab OAuth 應(yīng)用程序。Consumer Key 和 Consumer Secret 用于授權(quán)Drone訪(fǎng)問(wèn) GitLab 資源。
    注意:這里我提前在gitlab創(chuàng)建好了test倉(cāng)庫(kù)(空倉(cāng)庫(kù)),用于我們下面的演示;
    image.png
  • Application URL地址是Drone服務(wù)地址后必須跟一個(gè)/login。例:http://192.168.200.30:82/login

    image.png

  • Application生成的Consumer ID和 Consumer Secret,下面我們會(huì)用于安裝Drone,gitlab授權(quán)drone:


    image.png

容器部署Drone

Drone部署需要安裝docker-server(Drone 與流行的源代碼控制管理提供商無(wú)縫集成) WEB界面和docker-runner守護(hù)進(jìn)程執(zhí)行器

  • 創(chuàng)建一個(gè)共享密鑰,用于drone-runner和drone-server之間的通信:
[root@master drone]# openssl rand -hex 16
8172cd9155d16593d4f6a445b70e2d6e
  • 部署drone-server:
docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITLAB_SERVER=http://192.168.200.30/ \ #GitLab 服務(wù)器 url,默認(rèn)https://github.com
  --env=DRONE_GITLAB_CLIENT_ID=56ef91f20270b6f945f722e2b93e2e9eacad65f0b5edcad997d4842df47cc5a8 \ #GitLab oauth 客戶(hù)端 ID(必填項(xiàng))
  --env=DRONE_GITLAB_CLIENT_SECRET=159ab07250d7b02f171408a1a6e21f506295b33b5174c211b7dcb59b548e05a3 \ #GitLab oauth 客戶(hù)端密碼 (必填項(xiàng))
  --env=DRONE_RPC_SECRET=8172cd9155d16593d4f6a445b70e2d6e\  #驗(yàn)證服務(wù)器和運(yùn)行器之間的 rpc 連接(drone-server和drone-runner連接時(shí)必填項(xiàng))
  --env=DRONE_SERVER_HOST=192.168.200.30:82 \ #供drone服務(wù)主機(jī)名或 IP 地址 (必填項(xiàng))
  --env=DRONE_SERVER_PROTO=http \  #drone服務(wù)使用的協(xié)議 (必填項(xiàng))
  --publish=82:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  --env=DRONE_USER_CREATE=username:root,admin:true \  #Drone管理員用戶(hù)創(chuàng)建 
  drone/drone:2
 * drone啟動(dòng)參數(shù)很多,下面解釋下:
    + DRONE_GITLAB_SERVER: GitLab 服務(wù)器 url,默認(rèn)https://github.com
    + DRONE_GITLAB_CLIENT_ID: GitLab oauth 客戶(hù)端 ID(必填項(xiàng))
    + DRONE_GITLAB_CLIENT_SECRET: GitLab oauth 客戶(hù)端密碼 (必填項(xiàng))
    + DRONE_RPC_SECRET: 驗(yàn)證服務(wù)器和運(yùn)行器之間的 rpc 連接(drone-server和drone-runner連接時(shí)必填項(xiàng))
    + DRONE_SERVER_HOST: 提供drone服務(wù)主機(jī)名或 IP 地址 (必填項(xiàng))
    + DRONE_SERVER_PROTO: drone服務(wù)使用的協(xié)議 (必填項(xiàng))
    + DRONE_USER_CREATE: Drone管理員用戶(hù)創(chuàng)建
  • 部署drone-runner
  docker run --detach \  
  --volume=/var/run/docker.sock:/var/run/docker.sock \
  --env=DRONE_RPC_PROTO=http \  #用于連接 Drone 服務(wù)器的協(xié)議
  --env=DRONE_RPC_HOST=192.168.200.30:82 \ #提供 Drone 服務(wù)器的主機(jī)名
  --env=DRONE_RPC_SECRET=8172cd9155d16593d4f6a445b70e2d6e \  #用于向 Drone 服務(wù)器進(jìn)行身份驗(yàn)證的共享密鑰
  --env=DRONE_RUNNER_CAPACITY=2 \   #限制運(yùn)行器可以執(zhí)行的并發(fā)管道的數(shù)量
  --env=DRONE_RUNNER_NAME=test-runner \   #設(shè)置runner的名字
  --publish=3000:3000 \
  --restart=always \
  --name=runner \
  drone/drone-runner-docker:1
 * drone-runner啟動(dòng)參數(shù)很多,下面解釋下:
    + DRONE_RPC_PROTO: 用于連接 Drone 服務(wù)器的協(xié)議
    + DRONE_RPC_HOST: 提供 Drone 服務(wù)器的主機(jī)名
    + DRONE_RPC_SECRET: 用于向 Drone 服務(wù)器進(jìn)行身份驗(yàn)證的共享密鑰
    + DRONE_RUNNER_CAPACITY: 限制運(yùn)行器可以執(zhí)行的并發(fā)管道的數(shù)量
    + DRONE_RUNNER_NAME: 設(shè)置runner的名字
  • 驗(yàn)證drone-runner是否連接上drone-server(successfully pinged the remote server):
[root@master drone]# docker logs -ft runner
2022-05-10T05:21:02.637256271Z time="2022-05-10T05:21:02Z" level=info msg="starting the server" addr=":3000"
2022-05-10T05:21:02.640121666Z time="2022-05-10T05:21:02Z" level=info msg="successfully pinged the remote server"
2022-05-10T05:21:02.640157924Z time="2022-05-10T05:21:02Z" level=info msg="polling the remote server" arch=amd64 capacity=2 endpoint="http://192.168.200.30:82" kind=pipeline os=linux type=docker
  • 瀏覽器訪(fǎng)問(wèn)drone-server Web界面(http://192.168.200.30:82),點(diǎn)擊繼續(xù):

    image.png

  • 點(diǎn)解繼續(xù)后,會(huì)跳轉(zhuǎn)到這個(gè)Application URL地址(http://192.168.200.30:82/login)gitlab給Drone(Application)授權(quán):

    image.png

  • 注冊(cè)drone用戶(hù):


    image.png
  • 點(diǎn)擊Drone右上角SYNC(同步),進(jìn)入我們的test倉(cāng)庫(kù)下激活存儲(chǔ)庫(kù),發(fā)現(xiàn)錯(cuò)誤(這個(gè)錯(cuò)誤我們需要打開(kāi)gitlab的出入站請(qǐng)求
    [圖片上傳失敗...(image-568a7c-1652355010681)]

  • 回到gitlab,點(diǎn)擊Admin-->settings

    image.png

  • 打開(kāi)出站請(qǐng)求,并打開(kāi)允許web hooks(掛鉤) 和服務(wù)向本地網(wǎng)絡(luò)發(fā)出請(qǐng)求

    image.png

  • 回到drone,test倉(cāng)庫(kù)再一次激活(成功),并開(kāi)啟Trusted特權(quán)容器(docker-runner在使用docker執(zhí)行器時(shí),類(lèi)似使用root權(quán)限)

注意:這里還有一個(gè)問(wèn)題,如果出現(xiàn)沒(méi)有Trusted選項(xiàng)的情況,需要在啟動(dòng)運(yùn)行drone-server服務(wù)是添加:--env=DRONE_USER_CREATE=username:root,admin:true

image.png

流水線(xiàn)腳本編寫(xiě).drone.yml

  • 在gitlab依次點(diǎn)擊,創(chuàng)建.drone.yml文件:

    image.png

  • .drone.yml文件內(nèi)容(寫(xiě)的比較簡(jiǎn)單,主要了解流水線(xiàn)操作流程),如下:

kind: pipeline
type: docker
name: default

steps:
- name: greeting
  image: alpine
  commands:
  - echo hello
  - echo world

.drone.yml文件屬性解釋?zhuān)?/p>

  • kind:定義了對(duì)象的種類(lèi),此示例定義了一個(gè)pipeline(管道)對(duì)象;
  • type:定義pipeline(管道)的類(lèi)型,此示例定義了一個(gè) Docker 管道,其中每個(gè)管道步驟都在 Docker 容器內(nèi)執(zhí)行;
  • name:定義了pipeline(管道)的名稱(chēng);
  • steps:定義了一系列串行執(zhí)行的pipeline(管道)步驟,出現(xiàn)一個(gè)步驟失敗,立即退出;
* name:定義管道步驟的名稱(chēng);
* image:定義了一個(gè)執(zhí)行 shell 命令的 Docker 鏡像;
* commands:在docker容器內(nèi)執(zhí)行shell命令;

流水線(xiàn)觸發(fā)

  • 在自己項(xiàng)目下(test)點(diǎn)擊:settings-->webhooks:

    image.png

  • 這里不需要再次創(chuàng)建webhooks(掛鉤),Drone連接后會(huì)自動(dòng)創(chuàng)建一個(gè)默認(rèn)的webhooks

    image.png

  • 回到drone會(huì)看到,我們編寫(xiě)的流水線(xiàn)文件被自動(dòng)觸發(fā)(之后gitlab倉(cāng)庫(kù)代碼更新或上傳新代碼都會(huì)自動(dòng)觸發(fā)).drone.yml:

    image.png

  • 點(diǎn)擊我們的流水線(xiàn),可以查看流水線(xiàn)詳細(xì)步驟、步驟的狀態(tài)和步驟的logs

    image.png

總結(jié)+遇到的問(wèn)題

我這里的.drone.yml文件寫(xiě)的比較簡(jiǎn)單,主要時(shí)了解過(guò)程入門(mén)。如果需要練習(xí)可以試著部署自己的項(xiàng)目;
最后請(qǐng)各位注意三個(gè)我在學(xué)習(xí)gitlab+drone遇到的問(wèn)題

下列小括號(hào)‘()’中是解決方法;

  • clone克隆地址連接不上(修改默認(rèn)clone克?。?/li>
  • 沒(méi)有Trusted選項(xiàng),啟動(dòng)drone-server時(shí)添加(--env=DRONE_USER_CREATE=username:root,admin:true)
  • .drone.yml文件中sed命令報(bào)錯(cuò):sed: -e expression #1, char 34: unknown option to s(改成感嘆號(hào)!或者| 分割,如:sed -i 's! 源內(nèi)容 ! 替換內(nèi)容 !g' )

推薦文章

參考資料

https://docs.drone.io/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容