主頁 > 軟體設計 > 從服務器基礎環境配置到搭建Docker+Gitlab+Gitlab Runner,完整介紹Spring Boot專案的持續集成與持續交付具體實作!

從服務器基礎環境配置到搭建Docker+Gitlab+Gitlab Runner,完整介紹Spring Boot專案的持續集成與持續交付具體實作!

2021-04-08 11:51:58 軟體設計

1. 序言

在大學的課程學習,非常注重團隊協作的培養,在企業開發中,團隊協作開發專案的場景更是甚多,另外,在當下的熱門技術堆疊中,微服務開發模式、前后端分離開發模式逐漸盛行,Spring Boot、VUE等熱門技術,更是吸引了眾多技術人員,當下的專案開發程序中,人們更加追求高內聚、低耦合,特別是前后端分離開發模式的提出,

但是,做到低耦合的同時,也有一系列的問題產生,比如在團隊協作開發程序中,后臺開發人員新開發了一個功能,需要交給前端來配置,或者是交給測驗人員進行測驗,怎么實作?以往的操作是后臺開發人員push專案到Git,前端/測驗pull專案到本地,然后再編譯、開發前端和測驗專案,這要求無論是后端、前端開發人員,還是測驗人員,每個人的電腦都需要有相同的配置,整個開發流程非常繁瑣復雜,

所以,Gitlab提出了的持續集成與持續交付的概念,即后臺開發人員實作新功能后,將專案Push到Gitlab服務器,Gitlab服務器能夠將專案自動集成,然后編譯專案,并將專案部署到服務器,而對于前端開發人員和測驗人員,只需要得到部署后的專案鏈接(或IP地址),即可進行前端專案的開發,以及各種介面的測驗,在這個程序中,只需要后臺開發人員和服務器的配置一致即可,開發人員與測驗人員的配置無需關注,

本文將基于Ubuntu18.04系統,從基本開發環境配置、Docker安裝與Gitlab安裝,以及Spring Boot專案的持續集成與持續交付功能方面,講述完整的使用程序,

注意,完整的部署程序需要具備Spring Boot、Linux和Docker的相關知識,可參考:

https://www.zxdmy.com/category/linux

https://www.zxdmy.com/category/docker

https://www.zxdmy.com/category/java

本文主要內容:

      • 1. 序言
      • 2. 配置鏡像源
        • 2.1 配置阿里云鏡像源
        • 2.2 配置華為云鏡像源
      • 3. 安裝JDK
        • 3.1 下載與上傳JDK
        • 3.2 安裝與配置環境變數
        • 3.3 測驗安裝
        • 3.4 部分錯誤示例
      • 4. 安裝Maven
        • 4.1 下載與上傳
        • 4.2 安裝與配置環境變數
        • 4.3 測驗安裝
        • 4.4 配置Maven鏡像源
      • 5. 安裝Docker
        • 5.1 安裝Docker.
        • 5.2 配置Docker鏡像源
      • 6. 安裝Docker Compose
        • 6.1 X64系統的安裝與驗證
        • 6.2 Arm64系統的安裝與驗證
      • 7. 安裝Gitlab
        • 7.1 常用命令
        • 7.2 安裝Gitlab
        • 7.3 配置發件郵箱
        • 7.4 創建專案
      • 8. 安裝與使用Gitlab Runner
        • 8.1 安裝Gitlab Runner
        • 8.2 注冊Runner與Demo測驗
        • 8.3 問題解決
      • 9. 關機與開機
      • 參考資料

2. 配置鏡像源

為什么配置鏡像源?

因為Ubuntu系統原始的鏡像源地址是國外服務器,國內服務器下載速度非常慢,所以需要替換成國內的鏡像源,提高軟體下載速度,

如果是阿里云的服務器,推薦使用阿里云的鏡像,如果是華為云的服務器,推薦使用華為云的鏡像,

(筆者華為云的服務器用阿里云的鏡像,無法訪問,報404錯誤)

2.1 配置阿里云鏡像源

阿里云的鏡像源網址:https://developer.aliyun.com/mirror/

阿里云Ubuntu鏡像源配置網址:https://developer.aliyun.com/mirror/ubuntu

主要操作步驟如下:

A. 備份 sources.list 檔案,參考命令:

sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak

B. 使用熟悉的編輯器(如vi)打開 sources.list,參考命令:

vi /etc/apt/sources.list

C. 將所有的 http://archive.ubuntu.com/ 替換為 http://mirrors.aliyun.com/

D. 保存即可

E. 執行 apt-get update 更新索引,

2.2 配置華為云鏡像源

華為云的鏡像源網址:https://mirrors.huaweicloud.com/

A. 備份sources.list ,同上,

B. 修改sources.list檔案,將http://archive.ubuntu.comhttp://security.ubuntu.com替換成http://mirrors.huaweicloud.com,參考命令:

sudo sed -i "s@http://.*archive.ubuntu.com@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list

或者直接使用下面的命令,直接下載替換檔案(注意系統是不是bionic版本):

wget -O /etc/apt/sources.list https://mirrors.huaweicloud.com/repository/conf/Ubuntu-Ports-bionic.list

C. 保存即可

D. 執行 apt-get update 更新索引,

更新鏡像源后的 sources.list 檔案如下:

3. 安裝JDK

為什么要安裝JDK?

因為專案是Java開發的,

下文以 JDK 1.8.0_181 為例

3.1 下載與上傳JDK

Oracle官方下載地址:https://www.oracle.com/java/technologies/javase-downloads.html

華為云鏡像下載地址:https://mirrors.huaweicloud.com/java/jdk/

可以使用FinalShell進行上傳:

image-20201019103837347

3.2 安裝與配置環境變數

主要流程參考命令如下:

A. 解壓縮(在壓縮包的目錄下運行)

tar -zxvf jdk-8u181-linux-x64.tar.gz

B. 創建目錄

mkdir -p /usr/local/java

Linux系統一般將用戶按照的軟體放在 usr/local 目錄下,

-p:遞回創建,即創建子目錄

C. 移動安裝包

mv jdk1.8.0_181/ /usr/local/java/

D. 設定所有者

chown -R root:root /usr/local/java/

-R :遞回設定,即子目錄即目錄下的所有檔案均設定所有者

E. (可選,一般不用)打開系統環境變陣列態檔

vi /etc/environment

F. (可選,一般不用)添加環境變數

# 默認有這行
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

# 從這里開始添加
export JAVA_HOME=/usr/local/java/jdk1.8.0_181
export JRE_HOME=/usr/local/java/jdk1.8.0_181/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

G. 打開用戶環境變陣列態檔

vi /etc/profile

H. 添加用戶環境變數資訊

# 默認有這段
if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

# 從這里開始添加,檔案名注意修改為自己的檔案名
export JAVA_HOME=/usr/local/java/jdk1.8.0_181
export JRE_HOME=/usr/local/java/jdk1.8.0_181/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
# 到這里結束

I. 使用戶環境變數生效

source /etc/profile

3.3 測驗安裝

java -version

正確輸出:

image-20201019172804237

(可選操作)為其他用戶更新用戶環境變數:

su snzl #snzl為其他用戶名
source /etc/profile

3.4 部分錯誤示例

如果安裝完成后,提示錯誤資訊

-bash: /usr/local/java/jdk1.8.0_181/bin/java: cannot execute binary file: Exec format error

如圖:

image-20201019173620605

應考慮:

① 給bin檔案夾下的檔案增加執行權限

chmod +x filename

② 選擇的JDK錯誤,如系統架構(arm64、X64、arm32、X32)等,

image-20201019173510253

4. 安裝Maven

為什么要安裝Maven?

因為專案使用Maven來管理包,

下文以 maven 3.6.0 為例,

4.1 下載與上傳

Apache官方下載地址:https://maven.apache.org/download.cgi

華為云鏡像下載地址:https://repo.huaweicloud.com/apache/maven/maven-3/

上傳可以使用FinalShell,

image-20201019105751353

4.2 安裝與配置環境變數

基本操作方法同JDK,參考命令如下:

A. 解壓縮(在壓縮包的目錄下運行)

tar -zxvf apache-maven-3.6.0-bin.tar.gz

B. 創建目錄

mkdir -p /usr/local/maven

Linux系統一般將用戶按照的軟體放在 usr/local 目錄下,

-p:遞回創建,即創建子目錄

C. 移動安裝包

mv apache-maven-3.6.0 /usr/local/maven/

D. 設定所有者

chown -R root:root /usr/local/maven/

-R :遞回設定,即子目錄即目錄下的所有檔案均設定所有者

E. 打開用戶環境變陣列態檔

vi /etc/profile

F. 添加用戶環境變數資訊

# 默認有這段
if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

# 從這里開始添加, 如果原來有JDK配置,直接追加即可
export M2_HOME=/usr/local/maven/apache-maven-3.6.0
export CLASSPATH=$CLASSPATH:$M2_HOME/bin
export PATH=$PATH:$M2_HOME/bin
# 到這里結束

如圖:

image-20201019112658279

I. 使用戶環境變數生效

source /etc/profile

4.3 測驗安裝

mvn -v

正確輸出:

image-20201019173012754

4.4 配置Maven鏡像源

為什么要配置Maven鏡像源?

因為專案要下載各種包,使用國內的鏡像源,下載速度快,

鏡像源主要有兩個,一般用阿里云或者華為云的,主要看虛擬機的服務商是哪個,

阿里云Maven鏡像源網址:https://developer.aliyun.com/mirror/maven

阿里云鏡像配置:

<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共倉庫</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

或(這個好像是舊版,筆者本文用這個)

<mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

華為云鏡像源網址:https://mirrors.huaweicloud.com/

華為云鏡像源配置:

<mirror>
    <id>huaweicloud</id>
    <mirrorOf>*</mirrorOf>
    <url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>

如何配置?

其實主要是修改Maven安裝目錄下的 conf/settings.xml 檔案,

在settings.xml檔案的 <mirrors>…… </mirrors> 標簽里添加上述配置代碼即可,

image-20201020091149804

參考命令:

vi /usr/local/maven/apache-maven-3.6.0/conf/settings.xml

注意:

一般情況下(特別是Windows系統),Maven都會在用戶檔案夾下生成一個.m2的檔案,這個檔案是針對當前用戶有效的,這個檔案夾里也有一個settings.xml檔案,如果在這個檔案夾下配置上述鏡像源,則只針對當前用戶有效,一般是多用戶系統使用這種配置,

如何驗證配置是否生效?使用下面命令即可:

mvn help:system

這個命令是干嘛用的呢?

官網給出的解釋是:Displays a list of the platform details like system properties and environment variables.

這個命令可以列印出來所有的環境配置,對開發非常有用,

首次運行的時候,會自動幫我們到Maven中央倉庫下載預設的或者Maven中央倉庫更新的各種組態檔和類別庫(jar包)到Maven本地倉庫中,這時候可以觀察下載路徑,即可判斷是否生效,

5. 安裝Docker

為什么用Docker?

因為Docker好用,

5.1 安裝Docker.

參考命令如下:

A. 卸載舊版本

apt-get remove docker docker-engine docker.io containerd runc

B. 使用 APT 安裝

apt install docker.io

C. 驗證安裝是否成功

docker version

如圖:

image-20201019175257690

5.2 配置Docker鏡像源

如果你的服務器是阿里云的,則選擇阿里云的鏡像加速地址,

如果你的服務器是華為云的,則選擇華為云的鏡像加速地址,

華為云鏡像中心網址:https://console.huaweicloud.com/swr/?region=cn-north-4#/app/swr/huaweiOfficialList

image-20201019180240965

阿里云鏡像中心網址:https://www.aliyun.com/product/acr?source=5176.11533457&userCode=isjae3ee

訪問后,進入“管理控制臺”即可,

image-20201021143021273

使用下面的命令直接添加到檔案(記得替換下面的XXXXXX):

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://XXXXXX.mirror.swr.myhuaweicloud.com"]
}
EOF

然后重啟Docker,使其生效(依次執行):

systemctl daemon-reload
systemctl restart docker

驗證配置是否成功:

docker info

示例輸出(主要看最后幾行):

Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.6
 
######  這里省略大段資訊

 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://XXXXXX.mirror.swr.myhuaweicloud.com/    # 看這里
 Live Restore Enabled: false

WARNING: No swap limit support

6. 安裝Docker Compose

為什么用Docker Compose?

因為Docker Compose專案是 Docker 官方的開源專案,能夠實作對 Docker 容器集群的快速編排,非常好用,

6.1 X64系統的安裝與驗證

首先訪問Docker Compose的官方開源專案網站:https://github.com/docker/compose/releases ,找到 Latest release 版本,記下版本號,

image-20201020093841702

然后使用下面的命令一鍵安裝(注意替換版本號):

curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

如果安裝太慢,使用下面的備用鏈接(注意替換版本號):

curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

很快安裝完成,這時docker-compose不是可執行檔案,為其增加可執行權限:

chmod +x /usr/local/bin/docker-compose

驗證安裝成功與否的命令如下:

docker-compose version

示例輸出:

docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

6.2 Arm64系統的安裝與驗證

由于華為鯤鵬服務器采用華為自研cpu ARMv8架構,所以安裝方式和一般服務器安裝方式不同,即華為云服務器需要用pip方式安裝,

A. 安裝pip

sudo apt-get install libssl-dev libffi-dev python3 python3-pip

B. 使用pip命令安裝Docker Compose,如下:

pip install docker-compose

如果用上面這個命令下載很慢的話,替換成國內鏡像下載,參考命令如下:

pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple docker-compose
或
pip3 install -i https://mirrors.aliyun.com/pypi/simple docker-compose
或
python -m pip install -U -i https://mirrors.aliyun.com/pypi/simple docker-compose

C. 驗證安裝成功與否:

docker-compose version

D. 安裝成功后的輸出:

docker-compose version 1.27.4, build unknown
docker-py version: 4.3.1
CPython version: 3.6.9
OpenSSL version: OpenSSL 1.1.1  11 Sep 2018

7. 安裝Gitlab

使用Docker Compose一鍵安裝,

7.1 常用命令

啟動:docker-compose up

后臺啟動:docker-compose up -d

停止:docker-compose down

查看容器:docker ps

查看全部容器:docker ps -a

7.2 安裝Gitlab

Linux有個不成文的規則:所有用戶手動安裝的軟體,均放在 /usr/local/ 目錄下,

首先進入 /usr/local 目錄下,創建一個名為 docker 的檔案夾,并在該檔案夾里創建一個名為 gitlab 的檔案夾,用來放Gitlab的組態檔,

參考命令(依次執行):

cd /usr/local
mkdir docker
cd docker
mkdir gitlab
cd gitlab

然后在 gitlab檔案夾下新建一個名為 docker-compose.yaml 的組態檔,名字是固定的.

vi docker-compose.yaml

寫入內容:

version: '3'
services:
    gitlab:
        image: 'twang2218/gitlab-ce-zh'
        restart: always
        # 專案的主機名,填寫IP或域名,如果埠號非80,請添加埠號
        hostname: 'gitlab.yourdomain.com'
        environment:
            TZ: 'Asia/Shanghai'
            GITLAB_OMNIBUS_CONFIG: |
                external_url 'http://gitlab.cxhit.com'
                gitlab_rails['time_zone'] = 'Asia/Shanghai'
                gitlab_rails['gitlab_shell_ssh_port'] = 2222
                unicorn['port'] = 8888
                nginx['listen_port'] = 80
                # 配置郵箱,以qq郵箱為例
                gitlab_rails['smtp_enable'] = true
                gitlab_rails['smtp_address'] = "smtp.qq.com"
                gitlab_rails['smtp_port'] = 465
                gitlab_rails['smtp_user_name'] = "郵箱@qq.com"
                gitlab_rails['smtp_password'] = "smtp授權碼"
                gitlab_rails['smtp_domain'] = "qq.com"
                gitlab_rails['smtp_authentication'] = "login"
                gitlab_rails['smtp_enable_starttls_auto'] = true
                gitlab_rails['smtp_tls'] = true
                gitlab_rails['gitlab_email_from'] = "郵箱@qq.com"
                user['git_user_email'] = "郵箱@qq.com"
        ports:
            - '8099:80'
            - '8443:443'
            - '2222:22'
        volumes:
            - ./config:/etc/gitlab
            - ./data:/var/opt/gitlab
            - ./logs:/var/log/gitlab

:set paste 使用這個vi命令,原樣粘貼,

埠ports:左邊宿主機(即服務器),右邊容器

使用如下命令后臺啟動容器:

docker-compose up -d

-d :后臺執行,不加的話,可查看詳細啟動資訊

7.3 配置發件郵箱

如果上面的配置中的郵箱無法發送郵件,可采用下面的方式配置,

首先進入gitlab的安裝目錄(本文中的/usr/local/docker/gitlab)中的config檔案夾下,參考命令:

cd /usr/local/docker/gitlab/config

然后查看全部檔案,即可看到名為gitlab.rb的檔案,

使用vi編輯器打開:

vi gitlab.rb

按 / 后,輸入 smtp ,按回車鍵后,定位到郵件配置模塊,

取消前面所有的 # ,按照下面的示例修改配置:

### GitLab email server settings
###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html
###! **Use smtp instead of sendmail/postfix.**

### 從這里開始,下文以qq郵箱為例
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "郵箱@qq.com"
gitlab_rails['smtp_password'] = "smtp授權碼"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

### 下面兩行需要手動添加
gitlab_rails['gitlab_email_from'] = "郵箱@qq.com"
user['git_user_email'] = "郵箱@qq.com"

### 到這里結束
###! **Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert'**
###! Docs: http://api.rubyonrails.org/classes/ActionMailer/Base.html

然后進入gitlab容器,參考命令(依次執行):

docker ps
sudo docker exec -it 容器ID /bin/bash  

重新配置,并重啟容器,參考命令如下(依次執行,時間較長):

gitlab-ctl reconfigure
gitlab-ctl restart

然后進入gitlab控制臺,參考命令:

gitlab-rails console

稍等片刻,出來 > 箭頭,即可輸入發送測驗郵件的命令,

參考命令:

Notify.test_email('*******@qq.com','email title','email content desc').deliver_now

如果能收到郵件,則說明配置正確,

image-20201021103810757

7.4 創建專案

關于gitlab的具體使用方法,請參考百度,

主要操作有四個:

A. commit:是將本地修改過的檔案提交到本地庫中,有些修改是不需要同步至服務器的,至于什么時候同步,由用戶自己選擇,

B. push:是將本地庫中的最新資訊發送給遠程庫,

C.fetch:是將遠程主機的最新內容拉到本地,用戶在檢查了以后決定是否合并到作業本機分支中,

D. pull:則是將遠程主機的最新內容拉下來后直接合并,即:git pull = git fetch + git merge,這樣可能會產生沖突,需要手動解決,

8. 安裝與使用Gitlab Runner

8.1 安裝Gitlab Runner

官網的安裝參考鏈接:https://docs.gitlab.com/runner/install/linux-manually.html

命令如下:

A. 安裝(不同系統安裝命令不同,詳情看上面鏈接)

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

B. 授權可執行權限

sudo chmod +x /usr/local/bin/gitlab-runner

C. 創建持續集成用戶

sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

D. 運行gitlab-runner服務(依次執行)

sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

如果上面的start命名無法運行,請使用

sudo gitlab-runner run

關于gitlab-runner的詳細使用方法,可以使用下面的命令查看學習

gitlab-runner --help

到這里,gitlab-runner的安裝程序結束,

8.2 注冊Runner與Demo測驗

然后我們回到gitlab網站,打開前面創建的Spring Boot專案,在專案頁面中找到:設定-》CI/CD,然后展開runner下拉欄:

image-20201021111704596

在專用Runner欄,繼續往下翻,找到URL和Token,我們用的的資訊是這兩個:

image-20201021111812790

然后回到服務器,輸入下面的命令開始注冊:

gitlab-runner register

下圖(有一些配置錯誤)僅供參考,詳細的說明請繼續看:

image-20201021104205022

詳細說明如下(注意看注釋):

### 輸入注冊的命令:
root@ubuntu:/usr/local/docker/gitlab# sudo gitlab-runner register

Runtime platform                                    arch=amd64 os=linux pid=128903 revision=e95f89a0 version=13.4.1
Running in system-mode.

### 輸入注冊的URL,復制上面的
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://Your IP:8099/

### 輸入注冊的token,復制上面的
Please enter the gitlab-ci token for this runner:
XXXXXXXXXXXX

### 輸入專案描述,可以為空
Please enter the gitlab-ci description for this runner:
[ubuntu]: project description

### 輸入專案的標簽,
### 注意:填寫標簽后,每次push專案中的job有此標簽,才會觸發持續集成操作
### 如果為空,則每次提交都觸發,
Please enter the gitlab-ci tags for this runner (comma separated):
test,deploy

Registering runner... succeeded                     runner=27ZJ1iAs

### 選擇執行器,一般選擇shell,
Please enter the executor: shell, ssh, virtualbox, docker+machine, docker-ssh+machine, custom, docker-ssh, kubernetes, docker, parallels:
shell

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

至此,回傳到gitlab網站,重繪頁面,在專用Runner欄往下翻,即可看到注冊成功的Runner:

image-20201021112035020

然后回傳到本地的專案,在專案的根目錄,創建兩個檔案,并分別寫入如下內容:

image-20201021112225159

.gitlab-ci.yml :

stages:
- deploy #步驟名稱

deploy:
  stage: deploy #步驟名稱
  only:
  - master #當且僅當master分支合并時 出發該ci腳本
  script:  #ci腳本
  ### 執行mvn命令打包,生成jar包
  - mvn clean package 
  ### 執行docker命令創建鏡像,呼叫Dockerfile檔案
  - "docker build . -t cicdtest:last"
  ### 停止鏡像cicdtest_image,因為有修改
  - docker stop cicdtest_image || true
  ### 洗掉鏡像cicdtest_image,即清理歷史鏡像
  - docker rm cicdtest_image || true
  ### 重新構建鏡像,8181埠是服務器的埠,8080埠是容器的埠,即專案中設定的埠(默認8080)
  - docker run --name cicdtest_image -p 8181:8080 -d cicdtest:last

Dockerfile :

# 構建docker鏡像
# 基礎鏡像使用Java
FROM openjdk:8-jdk-alpine
# 作者
MAINTAINER cxh
# VOLUME指定了臨時檔案目錄為/tmp
# 其效果是在主機 /var/lib/docker 目錄下創建了一個臨時檔案,并鏈接到容器的/tmp
VOLUME /tmp
# 將jar包添加到容器中并更名為app.jar
# 注意:這個jar包檔案名,請前方服務器 目錄查看
COPY target/cicdtest-0.0.1-SNAPSHOT.jar /app/app.jar

# 這個暫且不用
# COPY target/lib /app/lib

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","-Dspring.profiles.active=prod","/app/app.jar"]

上面兩個檔案寫完后,在專案的Controller類中寫幾個測驗用例:

package com.cicdtest.cicdtest.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @GetMapping(value = "/getInfo/{id}")
    public String getInfo(@PathVariable String id){
        return "獲取ID為"+id+"的用戶的資訊";
    }
}

然后執行CommitPush命令,將專案推送到Gitlab,

回傳Gitlab網站,查看側邊欄的 CI/CD -> 流水線 模塊,即可看到提交的專案正在構建,

image-20201021112851453

然后點擊 上圖示注 位置的按鈕,進入新頁面,點擊 下圖示注的位置:

image-20201021112957429

即可查看詳細執行的命令:

image-20201021113131244

這里可以觀察專案部署中的錯誤,及時調整和修改.gitlab-ci.ymlDockerfile兩個檔案,

然后,通過服務器IP加埠的形式,即可訪問Demo中的實體:

image-20201021141337504

至此,測驗人員、前端開發人員即可呼叫該API,

8.3 問題解決

參考:https://blog.csdn.net/ujm097/article/details/80794740

9. 關機與開機

如果是本地虛擬機里創建的服務器,關機前,記得在服務器將所有鏡像停止,再關機,否則關機時,會花費較長的時間:

docker ps
docker stop 鏡像ID

前面配置中,gitlab已經設定了開機自啟,

如果下次開機時,很長時間(5分鐘以上),gitlab沒有啟動,可使用下面命令開啟:

docker-compose up -d

gitlab-runner 啟動命令:

gitlab-runner run

參考資料

[1] https://mirrors.huaweicloud.com/
[2] https://www.zxdmy.com/article/21
[3] https://blog.csdn.net/Delicious_Life/article/details/104623788/
[4] https://blog.csdn.net/weixx3/article/details/80331538
[5] https://www.zhihu.com/question/396914065
[6] http://maven.apache.org/plugins/maven-help-plugin/system-mojo.html
[7] https://www.cnblogs.com/Lints/p/11163073.html
[8] https://www.zxdmy.com/article/33
[9] https://blog.csdn.net/weixin_44456979/article/details/105718165
[10] https://blog.csdn.net/smiletudy/article/details/104840048
[11] https://www.cnblogs.com/sanduzxcvbnm/p/13820198.html
[12] https://www.cnblogs.com/xhyan/p/6593075.html
[13] https://blog.csdn.net/SirLZF/article/details/88998450
[14] https://zhuanlan.zhihu.com/p/86158304
[15] https://www.cnblogs.com/sanduzxcvbnm/p/13820198.html
[16] https://blog.csdn.net/weixin_43915643/article/details/105991904
[17] https://blog.csdn.net/wbf810207/article/details/90412358
[18] https://blog.csdn.net/aixiaoyang168/article/details/72168834

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/273759.html

標籤:其他

上一篇:【JavaP6大綱】分布式事務篇:兩階段提交(2PC)

下一篇:【運維面試】k8s的日志你們是如何收集與管理的?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more