怎么做網(wǎng)頁導(dǎo)航欄德陽seo
由于公司沒有運(yùn)維,寫go服務(wù)時(shí)各個(gè)環(huán)境編譯部署還是略顯麻煩,由于代碼管理使用的是 gitlab,所以決定使用 gitlab 自帶的 CI/CD 來做自動(dòng)編譯和部署,這樣每次提交代碼以后就可以自動(dòng)部署到服務(wù)器上了。
gitlab 本身只有 CI/CD 的接口,真正執(zhí)行 CI/CD 任務(wù)的是 gilab runner,它負(fù)責(zé)與 gitlab 通信,接受 CI/CD 任務(wù),并交給 Executor 執(zhí)行,Executor 有7種類型:
- Docker
- Shell
- Kubernetes
- SSH
- VirtualBox
- Parallels
- Custom
Executor的類型在注冊(cè) Runner 的時(shí)候確定,比較常用的是 Docker 和 SSH。GitLab,Runner 和 Executor 之間的關(guān)系如下圖所示(圖片來自GitLab官方文檔)。
安裝gitlab-runner
gitlab 的CI/CD 任務(wù)是通過 runner 來運(yùn)行的,runner 也是 go 語言實(shí)現(xiàn)的。我們需要單獨(dú)安裝 runner,而且可以在任意位置安裝。
runner 有 docker 版和可執(zhí)行程序版,這里我選擇的是可執(zhí)行程序版,安裝方式可以參考官網(wǎng)。
我的服務(wù)器是 linux,使用官方提供的腳本安裝:
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
可執(zhí)行程序名叫 gitlab-runner
,被放在 /usr/bin/
目錄下。
注冊(cè)runner
runner 需要注冊(cè)到 gitlab,其實(shí)就是把 runner 的信息告訴 gitlab,這樣 gitlab 才知道把 CI/CD 任務(wù)交給誰運(yùn)行。
注冊(cè) runner 的命令是 gitlab-runner register
,回車后會(huì)以交互式的方式注冊(cè) runner,其中比較重要的幾個(gè)參數(shù)是:
-
executor:運(yùn)行流水線的環(huán)境,也就是前面說的7種 Executor 類型,我使用本地 shell 運(yùn)行流水線,所以輸入
shell
。 -
url 和 registration-token:runner 和項(xiàng)目是掛鉤的,所謂的注冊(cè),其實(shí)也就是把 runner 和某個(gè)項(xiàng)目關(guān)聯(lián)起來。打開項(xiàng)目的 setting→CI/CD,找到 Runners 點(diǎn)擊展開,在 Specific runners 欄下面就是我們需要的 url 和 token。如下圖所示
當(dāng)然,為每個(gè)項(xiàng)目注冊(cè)一個(gè) runner 也不太合適,我們可以為一個(gè)組注冊(cè)一個(gè) runner,點(diǎn)開某個(gè)組,url 和 token 可以在同樣的地方找到。這樣組內(nèi)每個(gè)項(xiàng)目就都能使用這個(gè) runner 了。此外,也可以給整個(gè) gitlab 注冊(cè) runner,但是這需要 root 賬號(hào)。
另外,同樣的 url 和 token 可以注冊(cè)多個(gè)runner,然后通過 tag 來決定項(xiàng)目使用哪個(gè) runner。
注冊(cè) runner 和安裝 runner 是兩個(gè)概念,也就是說即便我們只安裝了一個(gè) runner,也能注冊(cè)多個(gè) runner。安裝 runner 是下載可執(zhí)行程序,而注冊(cè)只是往 gitlab 設(shè)置一些配置信息,它和 runner 本身其實(shí)沒太大關(guān)系,注意此時(shí)我們的 runner 還沒有開始運(yùn)行。
除了使用交互式注冊(cè),還可以使用非交互方式,命令如下:
gitlab-runner register \--non-interactive \--url "https://gitlab.com/" \--registration-token "$PROJECT_REGISTRATION_TOKEN" \--executor "shell" \--description "share-runner" \--maintenance-note "Free-form maintainer notes about this runner" \--tag-list "shell,share" \--run-untagged="true" \--locked="false" \--access-level="not_protected"
注意到 --run-untagged
選項(xiàng),它表示是否運(yùn)行在沒有標(biāo)簽的的分支上運(yùn)行流水線。如果沒有設(shè)置這個(gè)參數(shù),也可以在 gitlab 頁面上設(shè)置。就在我們查看 url 和 registration token 的地方,如果 runner 注冊(cè)成功的話,可以看到下面的信息:
點(diǎn)擊那個(gè)鉛筆圖標(biāo),可以設(shè)置 runner,在這里我們也可以勾選 run untagged jobs,如下圖所示。
上面我的 runner 前面小圓點(diǎn)是綠色的,那是因?yàn)槲业?runner 已經(jīng)運(yùn)行起來了。
注冊(cè)完 runner 會(huì)生成配置文件 /etc/gitlab-runner/config.toml
,可以打開查看,我們配置的信息都在里面。
啟動(dòng)runner
在啟動(dòng) runner 之前,我們可以先創(chuàng)建一個(gè)專門的用戶來運(yùn)行 runner,比如:
useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
這里我們添加的用戶叫 gitlab-runner
,你也可以使用被的用戶,甚至 root
,或者為了方便部署,使用部署的用戶。
然后安裝并啟動(dòng) gitlab 服務(wù):
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
gitlab-runner start
所謂安裝就是設(shè)置為系統(tǒng)服務(wù),它會(huì)在 /etc/systemd/system/
目錄下生成 gitlab-runner.service
文件。
其他命令:
gitlab-runner stop
停止 gitlab-runner 服務(wù)。gitlab-runner start
啟動(dòng) gitlab-runner 服務(wù)。gitlab-runner restart
重啟 gitlab-runner 服務(wù)。gitlab-runner status
查看 gitlab-runner 服務(wù)狀態(tài)。gitlab-runner uninstall
卸載 gitlab-runner 服務(wù)。gitlab-runner list
列出所有注冊(cè)的 runner。
編寫流水線
我們通過在項(xiàng)目根目錄下創(chuàng)建一個(gè)叫 .gitlab-ci.yml
的文件來定義流水線,也就是 CI/CD 如何執(zhí)行。
流水線分為階段和作業(yè),階段通過 stages
關(guān)鍵字定義,階段是作業(yè)的容器,每個(gè)階段內(nèi)可以定義多個(gè)作業(yè)。階段之間是串行執(zhí)行的,階段內(nèi)的多個(gè)作業(yè)是并行執(zhí)行的。
關(guān)于流水線的編寫,可以參看官方文檔,或者《GitLab CI/CD 從入門到實(shí)戰(zhàn)》這本書。當(dāng)然 gitlab 官方也提供了很多示例,各種語言都有,如果不知到如何開始,可以參考官方示例。
基本結(jié)構(gòu)如下:
stages: # 定義階段- test # 階段名- build # 階段名- deploy # 階段名unit_test: # 作業(yè)名stage: test # 作業(yè)屬于 test 階段script: # 作業(yè)執(zhí)行的命令- echo "unit test"compile: # 作業(yè)名stage: build # 作業(yè)屬于 build 階段script: # 作業(yè)執(zhí)行的命令- echo "build"deploy_test: # 作業(yè)名stage: deploy # 作業(yè)屬于 deploy 階段secipt: # 作業(yè)執(zhí)行的命令- echo "deploy test"
我用的是 go 語言,使用 shell 運(yùn)行和部署,只有測(cè)試環(huán)境和正式環(huán)境。
default:interruptible: true # 允許打斷流水線variables:GOBIN: "/usr/local/go/bin/go"GOINSECURE: git.i****d.comGOPRIVATE: git.i****d.comGOPROXY: https://goproxy.cn,directimage: golang:lateststages:- test- build- deployformat:stage: testscript:- echo "單元測(cè)試"- pwd- echo ~- echo $CI_COMMIT_BRANCH- echo $CI_DEFAULT_BRANCE- export GOINSECURE=$GOINSECURE- export GOPRIVATE=$GOPRIVATE- export GOPROXY=$GOPROXY- $GOBIN version- $GOBIN mod tidy- $GOBIN test -v 2>&1 | go-junit-report -set-exit-code > report.xmlartifacts:when: alwaysreports:junit: report.xmlcompile:stage: buildscript:- echo "編譯"- pwd- echo ~- export GOINSECURE=$GOINSECURE- export GOPRIVATE=$GOPRIVATE- export GOPROXY=$GOPROXY- $GOBIN version- $GOBIN mod tidy- mkdir -p _build- $GOBIN build -o _build/$CI_PROJECT_NAME main.goartifacts:expire_in: 1 hourpaths:- _build# 部署生產(chǎn)環(huán)境(僅release分支)
deploy_prod:stage: deployvariables:SERVER_IP: "1**.**.**.*"script: - echo "部署生產(chǎn)環(huán)境"- ssh z**j@$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME # 創(chuàng)建項(xiàng)目文件夾- ssh z**j@$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME/config # 創(chuàng)建配置文件夾- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && [ -f run.sh ] && ./run.sh stop || :" # 停止服務(wù)- scp _build/$CI_PROJECT_NAME z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷貝可執(zhí)行文件- scp run.sh z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷貝run.sh- scp config/application.prod.toml z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/config/application.toml # 拷貝配置文件- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && chmod +x run.sh"- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && ./run.sh start" # 重啟服務(wù)only:- release # 僅release分支部署到生產(chǎn)環(huán)境environment: production# 部署測(cè)試環(huán)境(非main和release分支)
deplog_test:stage: deployvariables:SERVER_IP: "1**.**.**.*"script:- echo "部署測(cè)試環(huán)境"- ssh z**j@$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME # 創(chuàng)建項(xiàng)目文件夾- ssh z**j@$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME/config # 創(chuàng)建配置文件夾- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && [ -f run.sh ] && ./run.sh stop || :" # 停止服務(wù)- scp _build/$CI_PROJECT_NAME z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷貝可執(zhí)行文件- scp run.sh z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷貝run.sh- scp config/application.test.toml z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/config/application.toml # 拷貝配置文件- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && chmod +x run.sh"- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && ./run.sh start" # 重啟服務(wù)except:- $CI_DEFAULT_BRANCH- releaseenvironment: test
多環(huán)境部署通過不同的分支來實(shí)現(xiàn), .gitlab-ci.yml
中的 environment
關(guān)鍵字只是對(duì)部署任務(wù)做一個(gè)記錄和分類,方便管理和查詢部署任務(wù),并無實(shí)際區(qū)分部署環(huán)境的功能。