Gitlab CICD自動化打包部署實踐總結

語言: CN / TW / HK

概念

Gitlab內置了CI/CD的工具,在項目中添加.gitlab-ci.yml文件,並且配置gitlab-runner(運行器)後,代碼更新時會自動構建、部署。

.gitlab-ci.yml一般放在項目根目錄,該文件是用來指定構建、測試和部署流程、以及CI觸發條件的腳本。當Gitlab檢測到代碼提交符合.gitlab-ci.yml文件指定的觸發條件時,則會使用配置的gitlab-runner執行.gitlab-ci.yml腳本。

gitlab-runner相當於Gitlab中任務的執行器,Gitlab會在需要執行任務時調用它。

配置gitlab CICD流程

配置gitlab CICD流程需要兩步: - 第一步:在服務器安裝 gitlab-runner 並關聯倉庫。 - 第二步:編寫gitlab-ci.yml。

安裝 gitlab-runner

  1. 根據服務器系統版本,下載對應的gitlab-runner。使用uname -a查看系統版本。

```js

Linux x86-64

sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64"

Linux x86

sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-386"

Linux arm

sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm"

Linux arm64

sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm64"

Linux s390x

sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-s390x"

Linux ppc64le

sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-ppc64le"

Linux x86-64 FIPS Compliant

sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64-fips" ```

  1. 給 gitlab-runner 分配執行權限

js sudo chmod +x /usr/local/bin/gitlab-runner 3. 創建gitlab ci用户

js sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash 4. 安裝和運行gitlab-runner

js sudo gitlab-runner install --user=root --working-directory=/home/gitlab-runner sudo gitlab-runner start - --working-directory:指定gitlab-runner運行的工作目錄,會在該目錄下安裝依賴、打包代碼、存儲緩存。 - --user:指定gitlab-runner運行的用户。 5. 註冊runner

進入配置gitlab cicd的工程,選擇Settings -> CI/CD -> Runners -> Expand,查看URL和token,執行下方命令註冊runner,輸入runner描述、runner tags、runner executor,在runners下面可以看到Available specific runners,表示註冊成功。

js sudo gitlab-runner register --url $URL --registration-token $REGISTRATION_TOKEN

image.png

image.png

gitlab-ci.yml

理解gitlab-ci.yml

gitlab-ci.yml 指定的任務內容總體構成1個pipeline、1個pipeline包含不同的stage執行階段、每個stage包含不同的job任務。如下圖所示:

image.png

編寫gitlab-ci.yml

js stages: - build - deploy build_job: cache: untracked: true key: files: - package.json paths: - /node_modules/ stage: build script: - npm install - npm run build tags: - ba-runner # 安裝 gitlab-runner 時加的 tag deploy_job: stage: deploy script: - echo '部署階段' tags: - ba-runner # 安裝 gitlab-runner 時加的 tag

踩坑記錄

問題1:react 項目執行gitlab流水線打包時報錯:Treating warnings as errors because process.env.CI = true.

image.png

解決: 在npm run build命令前加上 CI=false; react項目build.js中,process.env.CI是string類型,會導致判斷條件始終為true。

image.png

問題2:安裝依賴時,報權限EACCESS錯誤

image.png 在npm install中,添加--unsafe-perm=true --allow-root

npm install --unsafe-perm=true --allow-root

問題3: 讓同一個stage下的job並行執行,提高部署效率。

打開/etc/gitlab-runner/config.toml,修改concurrent的值。其默認值為1,job之間是串行的。

問題4: 開啟了緩存node_modules,但依然重新下載依賴。

在cache下加上untracked: true,untracked: true表示緩存被git忽略的文件。

js cache: untracked: true key: files: - package.json paths: - /node_modules/

問題5:流水線報錯fatal: git fetch-pack: expected shallow list fatal: The remote end hung up unexpectedly

image.png 系統自帶的git版本是1.8,需要升級git版本https://www.baiyongj.com/news/493.html

問題6:deploy步驟的權限問題

cicd流水線中執行一些命令,而這些命令可能涉及的文件等並不是全部在 /home/gitlab-runner/目錄下的,此時一般會提示沒有權限執行等。有兩種解決方法:

  1. 修改Gitlab-Runner的默認用户(gitlab-runner) 為root

  2. 通過該命令sudo gitlab-runner uninstall可以卸載掉gitlab-runner默認用户。

  3. 重新安裝gitlab-runner並將用户設置為root gitlab-runner install --working-directory /home/gitlab-runner --user root (這裏如果出現錯誤,不能重新安裝,可能是/home/gitlab-runner目錄不存在,需要先建立gitlab-runner目錄)安裝並設置--user(例如我想設置為root)
  4. 啟動、重啟和停止

js gitlab-runner start gitlab-runner restart gitlab-runner stop - 通過ps aux | grep gitlab-runner命令查看gitlab-runner進程。再次執行會發現--user的用户名已經更換成root了

  1. 編輯文件,/etc/sudoers 文件,然後在如下 root 的下一行增加如下一行

js gitlab-runner ALL=(ALL) NOPASSWD:ALL

問題7: 將gerrit倉庫中的代碼,同步至gitlab倉庫實現自動化打包。

説明: Gitlab用於自動化打包部署,Gerrit用於日常開發

image.png

本地倉庫相關配置:

  • 第一步:在本地添加gitlab遠程庫,遠程庫命名為upstream

js git remote add upstream [email protected] - 第二步:查看遠程庫,已經添加成功。(origin默認為gerrit遠程庫) js git remote -v image.png - 第三步:將origin庫代碼同步至upstream庫

  1. 將origin遠程分支(release_V4.7.4)同步至本地 js git pull origin release_V4.7.4 2. 將release_V4.7.4分支代碼推送至upstream庫

js git push --set-upstream upstream release_V4.7.4 3. 代碼同步後,會自動觸發gitlab cicd。

參考文獻

https://docs.gitlab.com/runner/install/ https://blog.csdn.net/wtl1992/article/details/125060797 https://www.baiyongj.com/news/493.html https://blog.csdn.net/redrose2100/article/details/126013947 https://juejin.cn/post/6898623550245208071#heading-11 https://blog.csdn.net/joyce0323/article/details/120857456 https://blog.csdn.net/themagickeyjianan/article/details/100098292 https://www.cnblogs.com/hahaha111122222/p/16377227.html