還在用Jenkins?試試Gitlab的CI/CD功能吧

xiangzhihong發表於2021-10-29

在之前,要實現自動化打包部署,一般都需要藉助Jenkins。不過,現在Gitlab的CI/CD功能也能實現自動化部署,並且操作更加簡單。如果你也正在使用Gitlab作為Git倉庫的話,不妨試試它的CI/CD功能。

一、安裝

通過Gitlab的CI/CD功能實現自動化部署,我們需要安裝Gitlab、Gitlab Runner、Maven這些服務。

1.1 安裝Gitlab

首先,我們需要在我們自己的伺服器上安裝Gitlab,如果還不知道怎麼安裝,可以參考《10分鐘搭建自己的Git倉庫》

為了避免一些不必要的麻煩,我們可以使用如下命令執行Gitlab服務,這裡需要注意的是新增了hostname屬性,這樣我們就可以通過域名來訪問Gitlab了,GITLAB_ROOT_PASSWORD這個環境變數可以直接設定Gitlab中root賬號的密碼:

docker run --detach \
  --hostname git.bilibili.com \
  --publish 10443:443 --publish 1080:80 --publish 1022:22 \
  --name gitlab \
  --restart always \
  --volume /mydata/gitlab/config:/etc/gitlab \
  --volume /mydata/gitlab/logs:/var/log/gitlab \
  --volume /mydata/gitlab/data:/var/opt/gitlab \
  -e GITLAB_ROOT_PASSWORD=12345678 \
  gitlab/gitlab-ce:latest

然後,我們就可以通過git.bilibili.com這個域名來訪問Gitlab,如果你沒有域名的話,可以通過修改本機的host檔案來實現:

192.168.7.134 git.bilibili.com

由於我們的Gitlab執行在1080埠,如果我們想要不加埠來進行訪問,可以使用Nginx的反向代理進行處理,對Nginx不熟悉的朋友可以看下《Nginx的這些妙用,你肯定有不知道的!》 。下面是Nginx的配置資料夾中新增的git.conf配置檔案,內容如下:

server {
    listen       80; # 同時支援HTTP
    server_name  git.bilibili.com; #修改域名

    location / {
        proxy_pass   http://192.168.7.134:1080; # 設定代理服務訪問地址
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

完成之後,我們就可以通過git.bilibili.com這個域名來訪問Gitlab了,輸入賬號密碼root:12345678即可登入。
在這裡插入圖片描述
將我們的SpringBoot應用程式碼上傳到Gitlab上去,這樣Gitlab就準備完畢了!這裡需要注意的是,如果你在啟動Gitlab的時候沒有指定hostname的話,你的專案HTTP訪問地址會是容器的ID,使用該地址會無法訪問Git倉庫!
在這裡插入圖片描述

1.2 安裝Gitlab Runner

Gitlab只是個程式碼倉庫,想要實現CI/CD還需安裝gitlab-runner,gitlab-runner相當於Gitlab中任務的執行器,Gitlab會在需要執行任務時呼叫它。

首先,下載gitlab-runner的Docker映象,選用alpine-bleeding,這個版本非常小巧。

docker pull gitlab/gitlab-runner:alpine-bleeding

然後,使用如下命令執行gitlab-runner。

docker run --name gitlab-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mydata/gitlab-runner:/etc/gitlab-runner \
-d gitlab/gitlab-runner:alpine-bleeding

此時,我們如果檢視gitlab-runner的容器日誌的話,會發現如下錯誤,config.toml檔案找不到。這個問題不必擔心,當我們將gitlab-runner註冊到Gitlab時,會自動生成該檔案。

ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory  builds=0

接下來,我們需要把gitlab-runner註冊到Gitlab,開啟Project->Settings->CI/CD功能,獲取到runner註冊需要使用的地址和token。
在這裡插入圖片描述
接下來,使用如下命令進入gitlab-runner容器的內部。

docker exec -it gitlab-runner /bin/bash

然後,在容器內使用如下命令註冊runner。

gitlab-runner register

註冊時會出現互動介面,提示你輸入註冊地址、token、執行器型別等資訊,ssh執行器能遠端執行Linux命令等,如下所示。
在這裡插入圖片描述
註冊完成後,我們可以發現config.toml檔案已經生成,內容如下,以後想修改runner配置的時候,直接改這個檔案就行了。

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "docker-runner"
  url = "http://192.168.7.134:1080/"
  token = "c2kpV6tX6woL8TMxzBUN"
  executor = "ssh"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.ssh]
    user = "root"
    password = "123456"
    host = "192.168.7.134"
    port = "22"

接著,開啟Gitlab上的專案,然後在Gitlab的CI/CD設定中就可以發現runner成功註冊了!

在這裡插入圖片描述

1.3 安裝Maven

SpringBoot專案打包需要依賴Maven,我們需要在伺服器上先安裝好它。首先,下載Maven的Linux安裝包,下載地址
在這裡插入圖片描述
下載完成後,使用如下命令解壓到指定目錄。

cd /mydata
tar -zxvf apache-maven-3.8.1-bin.tar.gz

接著,修改/etc/profile檔案,新增環境變數配置。

export MAVEN_HOME=/mydata/apache-maven-3.8.1
export PATH=$PATH:$MAVEN_HOME/bin

我們可以使用mvn -v命令來測試Maven是否安裝成功。

Maven home: /mydata/apache-maven-3.8.1
Java version: 1.8.0_292, vendor: AdoptOpenJDK, runtime: /mydata/java/jdk1.8/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"

1.4 安裝JDK

CentOS上預設安裝的是JRE,使用Maven需要安裝JDK。首先,下載JDK 8。
在這裡插入圖片描述下載完成後,將JDK解壓到指定目錄。

cd /mydata/java
tar -zxvf OpenJDK8U-jdk_x64_linux_xxx.tar.gz
mv OpenJDK8U-jdk_x64_linux_xxx.tar.gz jdk1.8

然後,再在/etc/profile檔案中新增環境變數JAVA_HOME。

vi /etc/profile
# 在profile檔案中新增
export JAVA_HOME=/mydata/java/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
# 使修改後的profile檔案生效
. /etc/profile

二、使用CI/CD進行部署

一切準備就緒,接下來通過Gitlab的CI/CD功能就可以實現SpringBoot應用的自動化部署了!首先,在專案的根目錄下新增.gitlab-ci.yml檔案,定義了兩個任務,一個任務會將應用程式碼打包成Jar包並複製到指定目錄,另一個任務會通過執行指令碼run.sh打包應用的Docker映象並執行。

# 打包任務
build-job:
  stage: build
  # 指定標籤,只有具有該標籤的runner才會執行
  tags:
    - docker
  script:
    # 使用Maven打包
    - mvn clean package
    # 將jar包、Dockerfile、執行指令碼複製到指定目錄
    - cp target/mall-tiny-gitlab-1.0-SNAPSHOT.jar /mydata/build/mall-tiny-gitlab-1.0-SNAPSHOT.jar
    - cp Dockerfile /mydata/build/Dockerfile
    - cp run.sh /mydata/build/run.sh

# 部署任務
deploy-job:
  stage: deploy
  tags:
    - docker
  script:
    # 進入指定目錄並執行執行指令碼
    - cd /mydata/build
    - chmod +x run.sh
    - ./run.sh

需要說明的是,預設情況下runner只會執行具有相同標籤的Job,由於我們對Job和runner都設定了標籤為docker,所以我們這裡是可以執行的。如果你沒有設定標籤的話,需要在runner的編輯介面設定下讓runner可以執行沒有標籤的Job。
在這裡插入圖片描述
由於我們的gitlab-runner採用的是ssh的執行器,它會登入到我們指定的伺服器,執行我們在.gitlab-ci.yml中定義的script命令,在此之前還會先從Git倉庫中獲取程式碼,所以我們還需修改下伺服器上的host檔案。

vim /etc/hosts
192.168.7.134 git.bilibili.com

接下來就是要把指令碼提交到Git倉庫上去,提交後會在Project->CI/CD->Pipelines中發現正在執行的任務。
在這裡插入圖片描述
開啟Pipeline的詳情頁面,可以發現我們定義的兩個任務的執行結果。

在這裡插入圖片描述
開啟Job的詳情介面,我們可以看到任務執行過程中輸出的日誌資訊。
在這裡插入圖片描述

如果你想手動執行Pipeline,而不是提交觸發的話,可以在Pipelines頁面點選Run Pipeline按鈕即可。
在這裡插入圖片描述
可以看到,使用它的CI/CD功能來實現自動化部署確實很不錯!安裝一個輕量級gitlab-runner,編寫簡單的.gitlab-ci.yml指令碼檔案即可實現。

相關文章