1. 程式人生 > 實用技巧 >Docker、CICD持續整合部署、Gitlab使用、Jenkins介紹

Docker、CICD持續整合部署、Gitlab使用、Jenkins介紹

目錄

1.Docker的基本操作

1.1映象拉取

使用下面Docker命令拉去映象,預設從中央倉庫中拉取。

docker pull 映象名(:tag,預設為latest)
#或者
docker pull 映象連結地址

可以從以下3個地方拉取Docker映象:

  1. Docker官方的中央倉庫,這個映象是最全的,但是下載速度是最慢的;

    https://hub.docker.com/

  2. 國內的映象網站:網易風潮,,daoCloud

    https://c.163yun.com/hub#/home

    http://hub.daocloud.io (推薦使用)

  3. 在公司內部會採用私服的方式拉取映象。(新增配置)

1.2映象的操作

檢視全部本地的映象

docker images
#或者
docker image ls
#使用下面的命令可以檢視全部的映象,包括名稱為none,或者其他版本的不同映象
docker image ls -a

刪除本地映象命令如下:

#如果命令正在執行則需要先停止映象才可刪除,否則將會報錯
docker rmi 映象的標識 #映象的標識為映象的唯一ID,在刪除時可以不寫全,只要唯一即可

映象的匯入匯出(不規範)

#將本地的映象到處
docker save -o 匯出的路徑 映象ID
#示例
docker save -o ./tomcat.image b8 #.表示當前路徑,b8為image ID,此處可以不用寫全

#載入本地的映象檔案
docker load -i 映象檔案
#示例
docker load -i tomcat.image
#使用此命令載入完image後,其名字和tag均為none
#可以使用下面命令修改或者設定其image對應的tag
docker tag 映象ID tomcat:8.5 #tomcat:8.5為修改後的映象名稱和標籤,冒號前面為映象名稱,冒號後面為映象版本

1.3容器的操作

容器就是執行起來之後的映象。

執行容器

執行容器命令如下,執行時可以使用映象ID、或者映象名稱+版本號方式指定所執行的映象。如果使用映象ID需要提前通過docker images命令檢視本機的映象列表,然後可以檢視 對應的映象ID;如果使用映象名稱+版本號方式指定執行映象,當本機image倉庫中沒有對應映象時,預設會從網路的映象倉庫中拉取映象到本地並執行,如果不指定版本號則預設為latest版本的映象。

# 執行容器
# 簡單操作,下面命令時比較簡單的執行方式,這種方式執行的映象是無法通過外網進行訪問
docker run 映象標識ID[映象名稱[:tag]]
# 常用命令
docker run -d --name 容器名稱 -p 宿主機埠:容器埠 映象標識ID[映象名稱[:tag]]
# 引數說明:
# -d:代表後臺執行命令
# -p 宿主機埠:容器埠:為了對映當前伺服器的埠和容器埠,如8080:5001代表外部埠為8080,使用該埠訪問,5001為容器內應用開放的埠
# --name 容器名稱:指定容器執行起來的名稱,即容器執行起來之後的container名稱

檢視正在執行的容器

檢視目前docker正在執行的容器可以使用下面的命令:

docker ps [-qa]
# -a:檢視全部的容器,包括沒有執行的容器
# -q:之檢視符合條件的容器標識,如果加上引數a檢視全部容器的標識,如果不加上引數a檢視正在執行的容器ID

檢視容器執行日誌

docker logs -f 容器ID
# -f:標識可以滾動檢視日誌的最後幾行

進入到容器內部

docker exec -it 容器ID bash

停止容器執行

#停止指定ID的容器
docker stop 容器ID
#停止多個容器
docker stop $(docker ps -qa)

刪除容器

刪除容器前需停止容器,即僅可刪除已經停止的容器。

#刪除指定ID的容器
docker rm 容器ID
#刪除多個容器
docker rm $(docker ps -qa)

啟動容器

docker start 容器ID

2.Docker應用

2.1準備MySQL容器

# 執行MySQL容器
docker run -d -p 3306:3306  --name mysql -e MYSQL_ROOT_PASSWORD=zhang12345 daocloud.io/library/mysql:5.7.4
# -e:可以設定MySQL容器的引數,此處設定的是對應的密碼

可以使用Navicat客戶端連線MySQL,預設埠號為3306,登入名為root,密碼為在啟動Docker時設定的登入密碼。

2.2準備Tomcat容器

# 使用命令docker image pull拉取對應tomcat映象
docker image pull daocloud.io/library/tomcat:8.5.15-jre8

# 使用docker run命令執行tomcat容器
docker run -d --name tomcat -p 8080:8080 b8dfe9ade316
# b8dfe9ade316:代表tomcat對應的映象ID,也可以使用映象名稱和版本名稱代替

# 可以通過命令將宿主機的內容複製到執行的容器內部
docker cp 檔名稱 容器ID:容器內部路徑
#舉個例子
docker cp ssm.war fe://usr/local/tomcat/webapps/

2.3資料卷

為了部署專案SSM的工程,需要使用到cp命令將宿主機內的ssm.war檔案複製到容器內部。

資料卷:將宿主機的一個目錄對映到容器的一個目錄中。

可以在宿主機中操作目錄中的內容,那麼容器內部對映的檔案,也會跟著一起改變。

建立資料卷

docker volume create 資料卷名稱
# 示例
docker volume create tomcat
# 在宿主機上面建立資料卷之後,在宿主機上面會預設儲存在一個目錄下
# 目錄為:/var/lib/docker/volume/資料卷名稱/_data
# 在上面目錄下會儲存宿主機和容器中目錄的對映關係

檢視資料卷的詳細資訊

docker volume inspect 資料卷名稱
# 示例
docker volume inspect tomcat

顯示結果如下:

[
    {
        "CreatedAt": "2020-07-10T17:39:03+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/tomcat/_data",
        "Name": "tomcat",
        "Options": {},
        "Scope": "local"
    }
]

檢視全部資料卷資訊

docker volume ls

刪除資料卷

docker volume rm 資料卷名稱
# 示例
docker volume rm tomcat

刪除資料卷之後,會對應刪除/var/lib/docker/volumes/下對應資料卷的目錄檔案。

應用資料卷

資料卷的使用時在使用映象建立容器時候使用的,因此是在使用docker run命令時設定的引數。

# 當使用之前建立的資料卷對映時,如果資料卷不存在,Docker會自動建立對應的資料卷
docker run -v 資料卷名稱:容器內部的路徑 映象ID
# 示例
docker run -d --name ssm_tomcat -p 8080:8080 -v volume_ssm_tomcat:/usr/local/tomcat/webapps b8dfe9ade316
# valume_ssm_tomcat:為已經建立好的資料卷的名稱
# /usr/local/tomcat/webapps:容器內部的檔案路徑
# b8dfe9ade316:tomcat映象ID
# 說明:
# 我們可以跳轉到建立資料卷的宿主機目錄/var/lib/docker/volumes/volume_ssm_tomcat/_data檢視對應檔案資訊如下
root@ubuntu:/var/lib/docker/volumes/volume_ssm_tomcat/_data# ll
total 28
drwxr-x---  7 root root 4096 Jul 10 20:10 ./
drwxr-xr-x  3 root root 4096 Jul 10 20:07 ../
drwxr-x--- 14 root root 4096 Jul 10 20:10 docs/
drwxr-x---  6 root root 4096 Jul 10 20:10 examples/
drwxr-x---  5 root root 4096 Jul 10 20:10 host-manager/
drwxr-x---  5 root root 4096 Jul 10 20:10 manager/
drwxr-x---  3 root root 4096 Jul 10 20:10 ROOT/
# 此時,目錄內檔案為容器內設定目錄下對應的檔案,後期更新時,更新此資料夾下檔案即可
# 建立完資料卷對映之後,預設會把容器內對映目錄下的檔案複製到宿主機中
# 直接指定一個宿主機的路徑作為資料卷的存放位置,【推薦使用這種方式使用】
docker run -v 宿主機路徑:容器內部的路徑 映象ID
# 示例
docker run -d --name ssm_tomcat -p 8080:8080 -v /opt/volume_ssm_tomcat:/usr/local/tomcat/webapps b8
# 說明:
# 我們在宿主機的資料卷對映目錄內沒有發現對應檔案,使用8080埠訪問站點時不能訪問
# 使用此種方式建立的資料卷對映,不會把容器內對映目錄下的檔案複製到宿主機中
# 我們可以將需要釋出的檔案更新至宿主機對應的掛在目錄中即可同步至容器的對映目錄,此時使用埠可訪問對應檔案

3.Docker自定義映象

中央倉庫上的映象,也是Docker的使用者自己上傳 過去的。

# 1.建立一個Dockerfile檔案,並且指定自定義映象資訊,該檔案沒有後綴名
# Dockerfile檔案中常用的內容
from: 指定當前自定義映象依賴的環境
copy: 將相對路徑下的內容複製到自定義映象中
workdir: 宣告映象的預設工作目錄
cmd: 需要執行的命令(在workdir下執行的,cmd可以寫多個,只以最後一個為準)

示例,自定義一個tomcat中:
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
# workdir:啟動後自動為當前目錄
# cmd:映象將會自動啟動tomcat,因此不需要執行相關命令
# 2.將準備好的Dockerfile和相應的檔案拖拽到Linux作業系統中,通過Docker命令製作自定義映象
docker build -t 映象名稱:[版本] .

4.Docker-Compose

之前執行一個映象,需要新增大量的引數。

可以通過Docker-Compose編寫這些引數。

Docker-Compose可以幫助我們批量的管理容器。

只需要通過一個docker-compose.yml檔案去維護即可。

4.1 下載Docker-Compose

在GitHub中下載對應的檔案,下載地址:https://github.com/docker/compose/releases/tag/1.24.1

我們使用的是Ubuntu作業系統,因此下載的檔名為docker-compose-Linux-x86_64

統一使用DockerCompose的版本為1.24.1

# 使用下面命令移動至目標資料夾
mv docker-compose-Linux-x86_64 /home/zgs/data/software/

# 為了更方便使用安裝檔案,將DockerCompose安裝包檔名字修改一下
mv docker-compose-Linux-x86_64 docker-compose

# 給予DockerCompose安裝包以執行的許可權
chmod 777 docker-compose
# 執行結果如下:
total 15800
drwxrwxr-x 2 zgs zgs     4096 Jul 15 19:16 ./
drwxrwxr-x 5 zgs zgs     4096 Jul 15 19:10 ../
-rwxrwxrwx 1 zgs zgs 16168192 Jul 15 19:06 docker-compose*

為方便後期操作,我們將檔案存放至/usr/local/bin目錄下:

sudo cp docker-compose /usr/local/bin/

將DockerCompose檔案所在的資料夾/usr/local/bin新增到系統環境變數。

修改/etc/profile檔案,在最下面新增該目錄。

sudo vim /etc/profile

# 編輯後文件:
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

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 PATH=/usr/local/bin:$PATH

使用source命令重新載入配置後的profile檔案:

source /etc/profile
# 在實際操作時可以不使用該命令

# 資料docker-compose命令驗證是否成功
docker-compose

# 如果輸出下面結果,則證明安裝成功:
zgs@ubuntu:~$ docker-compose
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  --verbose                   Show more output
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert keys
                              in v3 files to their non-Swarm equivalent

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

4.2 Docker-Compose管理MySQL和Tomcat容器

使用yml檔案對docke容器進行批量化管理。

yml檔案以key: value方式來指定配置資訊,這裡使用鍵值方式配置引數,冒號為英文格式,冒號後面緊跟空格,空格後面為對應的引數值。

多個配置資訊以換行+縮排的方式來區分,yml檔案的縮排是兩個空格。

在docker-compose的yml檔案中,不要使用製表符,即Tab鍵。

下面為yml檔案示例:

version: '3.1' # docker-compose版本為1.24.1,因此這裡為3.1,此屬性值根據docker-compose版本不同其對應值不同
services: # 所要負責的服務
  mysql: # 服務名稱,使用者自定義
    restart: always # 代表只要docker啟動,那麼這個容器就跟著一起啟動
    image: daocloud.io/library/mysql:latest # 指定映象路徑
    container_name: mysql # 映象執行之後容器的名稱
    ports: #指定內外對映的埠號,如果有多個對映關係依次往下寫即可
      - 3306:3306 # 注意比ports向後縮排兩個空格,-後面有空格
    environment: #指定docker image執行時的引數,和docker run命令中指定引數的-e類似
      MYSQL_ROOT_PASSWORD: root12345 # 指定mysql的root使用者登入密碼
      TZ: Asia/Shanghai # 設定docker容器的時區為東8區
    volumes: # 設定資料卷對映關係
      - /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql # 對映宿主機和容器內的檔案路徑
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:8.0.15-jre8
    container_name: tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai # TimeZone
    volumes:
      - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
      - /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs

我們可以在hub.daocloud.io中對應映象的介紹中檢視對應檔案存放的路徑,比如Mysql、Tomcat對應的資料檔案路徑。

4.3 使用docker-compose命令管理容器

在使用docker-compose的命令時,預設會在當前目錄下找docker-compose.yml檔案。

# 1.基於docker-compose.yml啟動管理的容器,使用該命令之後容器將自動啟動
docker-compose up -d

# 2.關閉並刪除容器
docker-compose down

# 3.開啟|關閉|重啟已經存在的由docker-compose維護的容器
docker-compose start|stop|restart

# 4.檢視由docker-compose管理的容器
docker-compose ps

# 5.檢視日誌
docker-compose logs -f

4.4 docker-compose配合Dockerfile使用

使用docker-compose.yml檔案以及Dockerfile檔案在生成自定義映象的同時啟動當前映象,並且由docker-compose去管理容器。

要注意檔案的路徑。

# yml檔案
version: '3.1'
srevices:
  ssm:
    restart: always
    build: # 構建自定義映象配置
      context: ../ #指定Dockerfile檔案的所在路徑
      dockerfile: Dockerfile # 指定Dockerfile檔名稱
    image: ssm:1.0.1 # 指定build映象的名稱
    container_name: ssm
    ports:
      - 8081:8080
    environment:
      TZ: Asia/Shanghai

# Dockerfile檔案
from daocloud.io/library/tomcat:8.0.15-jre8
copy ssm.war /usr/local/tomcat/webapps
# 可以直接啟動基於docker-compose.yml以及Dockerfile檔案構建的自定義映象
docker-compose up -d
# 如果自定義映象不存在,會幫助我們構建自定義映象
# 如果自定義映象已經存在,會直接執行這個自定義映象

# 重新構建自定義映象
docker-compose build
# 執行前,重新構建
docker-compose -d -build

5.Docker CI/CD

5.1 引言

目前的專案部署:

  1. 將專案進行編譯打包,生成釋出檔案;
  2. 將檔案上傳到指定的伺服器中;
  3. 將釋出檔案放到IIS或者Tomcat目錄中;
  4. 通過Dockerfile將其轉換成一個映象,由DockerCompose執行和管理容器。

如果專案更新了,則需要將上面的流程化操作再次的從頭到尾執行一次。

5.2 CI介紹

CI(Continuous Integration)持續整合。

持續整合:編寫程式碼時,完成了一個功能後,立即提交程式碼到Git倉庫中,將專案重新的構建並且測試。

  • 快速發現錯誤
  • 防止程式碼偏離主分支

5.3 實現持續整合

5.3.1 搭建Gitlab伺服器

  1. 建立一個全新的虛擬機器,並且至少指定4G的執行記憶體;
  2. 安裝docker以及docker-compose;
  3. docker-compose.yml檔案去安裝Gitlab;

在/opt目錄下建立docker_gitlab目錄,將下面的docker-compose.yml檔案放在該目錄下。

安裝Gitlab的yml檔案程式碼如下,注意裡面的IP地址需要根據對應機器進行修改。

version: '3.1'
services:
  gitlab:
    image: 'twang2218/gitlab-ce-zh:11.1.4'
    container_name: 'gitlab'
    restart: always
    privileged: true
    hostname: 'gitlab'
    environment:
      TZ: 'Asia/Shanghai'
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.254.129'
        gitlab_rails['time_zone'] = 'Asia/Shanghai'
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['gitlab_shell_ssh_port'] = 22
    ports:
      - '80:80'
      - '443:443'
      - '22:22'
    volumes:
      - /opt/docker_gitlab/config:/etc/gitlab
      - /opt/docker_gitlab/data:/var/opt/gitlab
      - /opt/docker_gitlab/logs:/var/log/gitlab

上面檔案中,Gitlab伺服器需要使用22埠號,但是該埠號被我們的ssh終端連線端口占用,因此我們需要修改ssh的22埠號為60022,保證Gitlab服務正常使用。

修改/etc/ssh/sshd_config檔案中ssh的埠號配置,預設為22並且註釋,我們將其取消註釋並且修改為60022即可,然後使用sudo systemctl restart sshd命令重啟ssh服務即可。

使用下面命令執行docker-compose,構建Gitlab伺服器。

docker-compose up -d

執行結果如下:

Pulling gitlab (twang2218/gitlab-ce-zh:11.1.4)...
11.1.4: Pulling from twang2218/gitlab-ce-zh
8ee29e426c26: Already exists
6e83b260b73b: Already exists
e26b65fd1143: Already exists
40dca07f8222: Already exists
b420ae9e10b3: Pull complete
a218309dd589: Pull complete
5c60fd7ba0ce: Pull complete
659c2144b5a3: Pull complete
8289bbac0d0e: Pull complete
31bbd150e8a7: Pull complete
9114e78243fa: Pull complete
0b97fa2153bc: Pull complete
308c7e15be6a: Pull complete
b7f31b8e487d: Pull complete
cbbb6dec5000: Pull complete
0241c9ad6a16: Pull complete
7fa6f0b53edd: Pull complete
1c2861e152b2: Pull complete
0536f3466f66: Pull complete
Digest: sha256:3c2372e3285e6d6933ddebb5ee3ae0c4bbf7cb235084e54d33d7f0ddf4813c4a
Status: Downloaded newer image for twang2218/gitlab-ce-zh:11.1.4
Creating gitlab ... done # 表示建立成功

安裝成功之後可以使用下面地址訪問Gitlab,第一次訪問時需要輸入初始密碼,由於我們在建立Gitlab伺服器時開啟了smtp服務,因此可以使用郵件傳送功能。

http://192.168.254.129[IP地址]:80

登入的使用者名稱預設為root,密碼預設為初始我們自己設定的密碼,登陸後主頁如下所示:

5.3.2 安裝Gitlab Runner

我們這裡使用Docker映象的方式安裝、執行Gitlab Runner,使用下面命令從倉庫中獲取Gitlab Runner對應的映象,映象獲取時時間較長,可能需要多次重試或者等待。

docker pull gitlab/gitlab-runner:latest

由於映象速度比較慢,因此採用直接在伺服器安裝的方式使用,這裡以Ubuntu Server為例介紹Gitlab Runner的安裝、與Gitlab伺服器中專案的關聯。

使用下面的命令新增Gitlab的官方倉庫地址。

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

執行結果如下:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5945  100  5945    0     0   7563      0 --:--:-- --:--:-- --:--:--  7554
Detected operating system as Ubuntu/focal.
Checking for curl...
Detected curl...
Checking for gpg...
Detected gpg...
Running apt-get update... done.
Installing apt-transport-https... done.
Installing /etc/apt/sources.list.d/runner_gitlab-runner.list...done.
Importing packagecloud gpg key... done.
Running apt-get update... done.

The repository is setup! You can now install packages.

使用下面命令安裝Gitlab Runner最新版本。

sudo apt-get install gitlab-runner

執行結果如下:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  docker-engine
The following NEW packages will be installed:
  gitlab-runner
0 upgraded, 1 newly installed, 0 to remove and 61 not upgraded.
Need to get 58.2 MB of archives.
After this operation, 82.9 MB of additional disk space will be used.
Get:1 https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal/main amd64 gitlab-runner amd64 13.2.0 [58.2 MB]
Fetched 58.2 MB in 18s (3,212 kB/s)                                                                                                                                                         
Selecting previously unselected package gitlab-runner.
(Reading database ... 71223 files and directories currently installed.)
Preparing to unpack .../gitlab-runner_13.2.0_amd64.deb ...
Unpacking gitlab-runner (13.2.0) ...
Setting up gitlab-runner (13.2.0) ...
GitLab Runner: creating gitlab-runner...
Runtime platform                                    arch=amd64 os=linux pid=25037 revision=353dd94e version=13.2.0
gitlab-runner: Service is not running.
Runtime platform                                    arch=amd64 os=linux pid=25044 revision=353dd94e version=13.2.0
gitlab-ci-multi-runner: Service is not running.
Runtime platform                                    arch=amd64 os=linux pid=25065 revision=353dd94e version=13.2.0
Runtime platform                                    arch=amd64 os=linux pid=25153 revision=353dd94e version=13.2.0
Clearing docker cache...

安裝完成,下面我們進行註冊,與Gitlab中的指定專案繫結。

在Gitlab中建立一個名為test-ci的專案,參考文件地址https://docs.gitlab.com/runner/register/index.html。

安裝時,最好將Gitlab與Gitlab Runner安裝在不同的伺服器上面。

使用下面的命令啟動Gitlab Runner的註冊流程。

sudo gitlab-runner register

註冊時需要使用在Gitlab中對應專案的url、token等相關資訊,在Gitlab的專案管理頁面可以檢視對應的配置資訊,如下圖所示:

下面時對應的配置流程:

zgs@zgs:/opt/docker_gitlab/logs$ sudo gitlab-runner register
[sudo] password for zgs: 
Runtime platform                                    arch=amd64 os=linux pid=30123 revision=353dd94e version=13.2.0
Running in system-mode.                            
                                                   
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.254.129/
Please enter the gitlab-ci token for this runner:
ZXqsgq8rsx_o_Vq1sEVc
Please enter the gitlab-ci description for this runner:
[zgs]: this is for test ci process demo.^H^H^H^H^H^H
Please enter the gitlab-ci tags for this runner (comma separated):
test
Registering runner... succeeded                     runner=ZXqsgq8r
Please enter the executor: docker, docker-ssh, ssh, docker+machine, kubernetes, custom, parallels, shell, virtualbox, docker-ssh+machine:
shell # 此處需填寫shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

此時,Gitlab Runner已經配置完畢,與Gitlab中的專案進行繫結。

重新整理Gitlab中專案的設定-CI/CD頁面,展開Runner對應的模組,可以檢視對應的Runner已經與其繫結。

編輯當前的資訊,選中【執行沒有標籤的作業】屬性,然後儲存更改,此屬性表示此Runner可以執行沒有任何標籤的作業。

至此,Gitlab Runner已經安裝完成,並且與Gitlab中的一個專案進行繫結。

5.3.3 整合專案入門測試

建立maven工程,編寫html頁面

使用Idea建立maven專案,搭建一個包含簡單靜態頁面的Web站點。

將該站點打包為war檔案,並在本地測試通過。

將maven工程推送到Gitlab中

在Gitlab中複製建立的test-ci專案的程式碼倉庫路徑。

在Idea中,選在VCS -> Import into Version Conteol -> Create Git Repository選單,在彈出的視窗中選擇當前專案對應的路徑。

我們可以新增提交Git倉庫時忽略的檔案型別,這裡使用idea IDE的.ignore外掛實現。如果沒有安裝此外掛可以按照下面的方法安裝,選擇File -> Settings -> Plugins選單,搜尋[.ignore]元件安裝即可。

在專案根節點右鍵,選擇New -> .ignore file -> .getignore file(Git)檔案,在檔案中輸入需要忽略的目錄如下:

# Created by .ignore support plugin (hsz.mobi)
.idea
target
*.iml

將目前專案中的檔案新增至Git緩衝區中,在專案根節點右鍵 Git -> Add即可。

提交至本地Git倉庫,在專案根節點右鍵 Git -> Commit Directory,在彈出的視窗中確認提交的檔案及註釋,點選提交。

將本地Git倉庫內的程式碼推送至遠端的Gitlab伺服器,選擇專案根目錄右鍵 Git -> Repository -> Push,在彈出的視窗中配置遠端伺服器的倉庫地址為http://192.168.254.129/root/test-ci.git,然後點選[Push]按鈕,點選後如果是第一次推送則需要輸入對應Git的使用者名稱和密碼,我們這裡使用登入Gitlab的使用者名稱密碼即可。

在Gitlab的專案倉庫頁面重新整理,即可檢視我們推送的專案程式碼已經提交至伺服器,如下圖:

編寫.gitlab-ci.yml檔案

在專案中新增持續整合使用的yml檔案,在專案根節點資料夾右鍵 New -> File,新增檔名為[.gitlab-ci.yml],一定要注意檔名以[.]開始。

在[.gitlab-ci.yml]檔案中新增下面程式碼:

stages:
  - test

test:
  stage: test
  script:
    - echo First test CI

將該檔案新增至本地Git緩衝區,並提交至遠端Gitlab倉庫。

此時在Gitlab專案的CI-CD -> [流水線] 功能下將會出現一個流水線執行情況,之後的每一次Git提交將會觸發此自動執行命令,執行的指令碼為我們之前編寫的[.gitlab-ci.yml]檔案中的程式碼,但是我們在執行時發現執行失敗,如下圖所示:

失敗原因如下:

Running with gitlab-runner 13.2.0 (353dd94e)
  on this is for test ci process demo. 0269f504
Preparing the "shell" executor
Using Shell executor...
Preparing environment
Running on zgs...
ERROR: Job failed (system failure): prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information

經過排查,發現安裝Gitlab-Runner的伺服器上面沒有對應的Java執行環境,即JDK。

解決執行CI流水線作業時出現Job failed (system failure): prepare environment: exit status 1.錯誤

錯誤截圖如下:

錯誤原因:

當Gitlan-Runner執行Job時,會使用Gitlab-Runner安裝時自動建立的賬號gitlan-runner執行,此賬號下的.bash_logout檔案中使用了clear命令,在該賬號退出時將會清除命令,但是在Gitlab-Runner執行時不允許清除命令,因此造成了此錯誤。

解決過程:

使用下面命令檢視Gitlab-Runner的執行日誌。

journalctl -u gitlab-runner

下面是執行命令的最後一部分日誌內容:

Jul 23 00:32:47 zgs gitlab-runner[867]: ERROR: Job failed (system failure): prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading>
Jul 23 00:32:47 zgs gitlab-runner[867]: ERROR: Job failed (system failure): prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading>
Jul 23 00:32:48 zgs gitlab-runner[867]: WARNING: Failed to process runner                   builds=0 error=prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/i>
Jul 23 00:32:48 zgs gitlab-runner[867]: WARNING: Failed to process runner                   builds=0 error=prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/i>

使用下面命令跳轉至gitlab-runner使用者的目錄下,修改.bash_logout檔案中內容。

cd /home/gitlab-runner/

檢視.bash_logout檔案中的內容如下:

# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

可以看到上面檔案中使用了clear_console命令,將檔案中程式碼註釋儲存即可,修改後檔案程式碼如下:

# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

#if [ "$SHLVL" = 1 ]; then
#    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
#fi

使用下面命令使該配置檔案生效。

sudo vi .bash_logout

重新執行失敗的任務即可執行成功,如下圖:

5.3.4 編寫.gitlab-ci.yml檔案,實現持續整合

編寫.gitlab-ci.yml測試命令使用

使用Gitlab Runner進行自動化編譯時,實在Gitlab Runner伺服器對應gitlab-runner使用者下的builds目錄下對應的資料夾內執行的命令,下面為從使用者根目錄至與Gitlab關聯專案執行命令的全部目錄:

zgs@zgs:/home/gitlab-runner$ ls
builds
zgs@zgs:/home/gitlab-runner$ cd builds/
zgs@zgs:/home/gitlab-runner/builds$ ls
0269f504
zgs@zgs:/home/gitlab-runner/builds$ cd 0269f504/
zgs@zgs:/home/gitlab-runner/builds/0269f504$ ls
0
zgs@zgs:/home/gitlab-runner/builds/0269f504$ cd 0/
zgs@zgs:/home/gitlab-runner/builds/0269f504/0$ ls
root
zgs@zgs:/home/gitlab-runner/builds/0269f504/0$ cd root/
zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root$ ls
test-ci  test-ci.tmp
zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root$ cd test-ci
zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root/test-ci$ ls
pom.xml  web

在該目錄下,我們可以使用 mvn -v 檢視對應maven的版本號相關內容,如下所示:

zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root/test-ci$ mvn -v
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 1.8.0_252, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-42-generic", arch: "amd64", family: "unix"

但是我們執行命令時實在Gitlab伺服器中執行的,因此需要複製maven命令的全路徑進行執行,安裝maven時的路徑如下:

/usr/share/maven/bin

修改.gitlab-ci.yml檔案,修改後內容如下:

stages:
  - test

test:
  script:
    - echo first test ci
    - /usr/share/maven/bin/mvn package

修改專案目錄的pom.xml檔案,新增web.xml專案檔案路徑,程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zgs</groupId>
    <artifactId>testci</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <webXml>src/main/web/WEB-INF/web.xml</webXml>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

專案程式碼結構如下所示:

將此改動推送至Gitlab倉庫,檢視CI的流水線執行情況如下:

編寫關於dockerfile以及docker-compose.yml檔案的具體內容

我們可以在下面路徑查詢到打包後的檔案,即war檔案。

/home/gitlab-runner/builds/0269f504/0/root/test-ci/target

在專案根目錄下建立docker資料夾,在該資料夾內建立Dockerfile檔案,專案結構如下圖所示:

修改.gitlab-ci.yml檔案中內容,新增將編譯後文件複製到docker目錄下程式碼,修改後檔案內容如下:

stages:
  - test

test:
  script:
    - echo first test ci
    - /usr/share/maven/bin/mvn package
    - cp target/testci-1.0-SNAPSHOT.war docker/testci.war

編寫Dockerfile檔案內容如下,這裡從DAO站點下拉取tomcat的docker映象,並將該目錄下的testci.war檔案複製到docker映象內的tomcat資料夾內。

FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testci.war /usr/local/tomcat/webapps

在專案根目錄下建立docker-compose.yml檔案,用於管理Docker映象和容器,程式碼如下:

version: '3.1'
services:
  testci:
    build: docker #編譯的映象目錄
    restart: always
    container_name: testci
    ports:
    - 8080:8080

再次修改.gitlab-ci.yml檔案,新增docker-compose相關命令,用於使用docker-compose命令管理容器,修改後程式碼如下:

stages:
  - test

test:
  script:
    - echo first test ci
    - /usr/share/maven/bin/mvn package
    - cp target/testci-1.0-SNAPSHOT.war docker/testci.war
    - docker-compose down
    - docker-compose up -d --build

提交至程式碼倉庫,在Gitlab中檢視流水線作業已經執行成功。

可以使用docker ps命令在宿主機上檢視testci對應的容器,Gitlab Runner使用的是對應宿主機的docker。

我們使用http://192.168.254.129:8080/testci/連線訪問我們的站點發現不能正常訪問,其中192.168.254.129是Gitlab Runner的宿主機伺服器,自動整合之後將會在該伺服器建立一個testci的Docker容器執行我們的站點。

使用 docker exec -it 容器ID bash命令進入到tomcat容器的/usr/local/tomcat/webapps/testci目錄,發現該目錄可以正常訪問但是隻有META-INF、WEB-INF兩個資料夾,並沒有index.html檔案,因此我們無法正常訪問。

這是由於在執行.gitlab-co.yml檔案中有一個mvn package命令執行打包操作時出現了問題,並沒有將我們的專案檔案完全裝載進war包中,我們可以修改專案的pom.xml配置檔案,將我們專案的頁面檔案包含進war中,修改後pom.xml檔案如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zgs</groupId>
    <artifactId>testci</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <webXml>src/main/web/WEB-INF/web.xml</webXml>
                    <warSourceDirectory>src/main/web</warSourceDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

重新提交至Gitlab程式碼倉庫,執行CI流程,我們再次進入部署後的tomcat容器中的/usr/local/tomcat/webapps/testci目錄,發現index.html檔案已經包含在對應的資料夾中,如下所示:

zgs@zgs:/home/gitlab-runner/builds/0269f504/0/root/test-ci/target/testci-1.0-SNAPSHOT$ docker exec -it 90 bash
root@90859d3021d8:/usr/local/tomcat# ls
LICENSE  NOTICE  RELEASE-NOTES	RUNNING.txt  bin  conf	include  lib  logs  native-jni-lib  temp  webapps  work
root@90859d3021d8:/usr/local/tomcat# cd webapps/
root@90859d3021d8:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager  testci  testci.war
root@90859d3021d8:/usr/local/tomcat/webapps# cd testci
root@90859d3021d8:/usr/local/tomcat/webapps/testci# ls
META-INF  WEB-INF  index.html

使用http://192.168.254.129:8080/testci/域名可以正常訪問站點,截圖如下:

刪除名稱為none的image

使用docker images 命令檢視宿主機的所有映象發現有很多名稱為none的映象,是因為我們在執行docker-compose命令時,會將舊的映象置為none,然後生成新的映象。

zgs@zgs:~$ docker images 
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
test-ci_testci               latest              ec0a969b7e6c        4 minutes ago       334MB
<none>                       <none>              4f1d7e31d372        19 minutes ago      334MB
<none>                       <none>              9a70c4a0343d        28 minutes ago      334MB
<none>                       <none>              8854aa023fb9        About an hour ago   334MB
<none>                       <none>              ed797bef8a6b        About an hour ago   334MB
<none>                       <none>              dfd27b782909        2 hours ago         334MB
twang2218/gitlab-ce-zh       11.1.4              1935cc9f8798        24 months ago       1.61GB
daocloud.io/library/tomcat   8.5.15-jre8         b8dfe9ade316        3 years ago         334MB

在我們之後越來越多的提交就會進行多次構建,也就會產生多個名稱為none的映象,這樣將會產生硬碟空間的極大浪費,我們可以使用下面的命令將這些名稱為none的映象刪除,命令如下:

docker rmi $(docker images -qf dangling=true)

執行結果如下:

zgs@zgs:~$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
test-ci_testci               latest              ec0a969b7e6c        9 minutes ago       334MB
twang2218/gitlab-ce-zh       11.1.4              1935cc9f8798        24 months ago       1.61GB
daocloud.io/library/tomcat   8.5.15-jre8         b8dfe9ade316        3 years ago         334MB

我們可以將該命令寫入.gitlab-ci.yml檔案中,每次將會把之前名稱為none的映象刪除,完善後的.gitlab-ci.yml檔案如下:

stages:
  - test

test:
  script:
    - echo first test ci
    - /usr/share/maven/bin/mvn package
    - cp target/testci-1.0-SNAPSHOT.war docker/testci.war
    - docker-compose down
    - docker-compose up -d --build
    - docker rmi $(docker images -qf dangling=true)

CI整合測試

修改index.html中的程式碼,提交至程式碼倉庫,然後重新整理頁面發現可以自動更新,相關截圖如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test-CI</title>
</head>
<body>
hello,this is a demo for test CI process.
<br/>
你好,張冠勝!
</body>
</html>


5.4 CD介紹

CD(Continuous Deploy),包含持續交付、持續部署,可以使用Jenkins實現。

持續交付:將程式碼交付給專業的測試團隊進行測試。

持續部署:將測試通過的程式碼,釋出到生產環境。

5.5 實現持續交付和持續部署

5.5.1 安裝Jenkins

官網:https://www.jenkins.io/

使用Docker方式安裝Jenkins:https://www.jenkins.io/zh/blog/2018/12/10/the-official-Docker-image/

可以使用Docker-Compose安裝Jenkins軟體,對應的yml檔案如下:

version: '3.1'
services:
  jenkins:
    image: jenkins/jenkins
    restart: always
    container_name: jenkins
    ports:
      - 8888:8080 # Web管理使用
      - 50000:50000 # Jenkins內部通訊使用埠
    volumes:
      - ./data:/var/jenkins_home

在/opt目錄下建立docker_jenkins目錄,並將上面的yml檔案放在該目錄下。

zgs@zgs:/opt/docker_jenkins$ pwd
/opt/docker_jenkins
zgs@zgs:/opt/docker_jenkins$ ls
docker-compose.yml
zgs@zgs:/opt/docker_jenkins$ cat docker-compose.yml 
version: '3.1'
services:
  jenkins:
    image: jenkins/jenkins
    restart: always
    container_name: jenkins
    ports:
      - 8888:8080 # Web管理使用
      - 50000:50000 # Jenkins內部通訊使用埠
    volumes:
      - ./data:/var/jenkins_home

執行下面命令使用docker-compose獲取Jenkins映象。

docker-compose up -d

執行完畢後,可以使用docker ps命令檢視當前執行的容器,Jenkins容器已經正常執行。

zgs@zgs:/opt/docker_jenkins$ docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                          PORTS                                                          NAMES
8e1d33e74317        jenkins/jenkins                 "/sbin/tini -- /usr/…"   51 seconds ago      Restarting (1) 15 seconds ago                                                                  jenkins
027f38b36a87        test-ci_testci                  "catalina.sh run"        16 hours ago        Up 3 hours                      0.0.0.0:8080->8080/tcp                                         testci
f174354636b5        twang2218/gitlab-ce-zh:11.1.4   "/assets/wrapper"        3 days ago          Up 3 hours (healthy)            0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   gitlab

但是我們使用docker-compose的日誌檢視命令檢視Jenkins的啟動情況時,發現存在許可權問題,具體日誌如下:

zgs@zgs:/opt/docker_jenkins$ docker-compose logs -f
Attaching to jenkins
jenkins    | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
jenkins    | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
jenkins    | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
jenkins    | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
jenkins    | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

這是因為/opt/docker_jenkins/data目錄Jenkins是沒有操作許可權的,那麼我們要給Jenkins賦予對應的操作許可權,對應程式碼如下:

zgs@zgs:/opt/docker_jenkins$ pwd
/opt/docker_jenkins
zgs@zgs:/opt/docker_jenkins$ ls
data  docker-compose.yml
zgs@zgs:/opt/docker_jenkins$ sudo chmod 777 data/
[sudo] password for zgs: 
zgs@zgs:/opt/docker_jenkins$ ll
total 16
drwxr-xr-x 3 root root 4096 Jul 25 02:00 ./
drwxr-xr-x 5 root root 4096 Jul 25 01:51 ../
drwxrwxrwx 2 root root 4096 Jul 25 02:00 data/
-rw-r--r-- 1 root root  267 Jul 25 01:53 docker-compose.yml
zgs@zgs:/opt/docker_jenkins$ docker-compose restart
Restarting jenkins ... done

檢視對應的日誌,如果出現下面的內容則說明啟動成功:

jenkins    | *************************************************************
jenkins    | *************************************************************
jenkins    | *************************************************************
jenkins    | 
jenkins    | Jenkins initial setup is required. An admin user has been created and a password generated.
jenkins    | Please use the following password to proceed to installation:
jenkins    | 
jenkins    | 891836a4b38447219f937e599dd415b9
jenkins    | 
jenkins    | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
jenkins    | 
jenkins    | *************************************************************
jenkins    | *************************************************************
jenkins    | *************************************************************
jenkins    | 
jenkins    | 2020-07-25 12:22:53.442+0000 [id=25]	INFO	jenkins.InitReactorRunner$1#onAttained: Completed initialization
jenkins    | 2020-07-25 12:22:53.486+0000 [id=19]	INFO	hudson.WebAppMain$3#run: Jenkins is fully up and running
jenkins    | 2020-07-25 12:22:54.241+0000 [id=39]	INFO	h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
jenkins    | 2020-07-25 12:22:54.246+0000 [id=39]	INFO	hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
jenkins    | 2020-07-25 12:22:54.282+0000 [id=39]	INFO	hudson.model.AsyncPeriodicWork#lambda$doRun$0: Finished Download metadata. 51,356 ms

訪問下面地址可以訪問Jenkins站點:

http://192.168.254.129:8888/login?from=%2F

按照頁面提示,將下面的位置的檔案中獲取初始密碼填入頁面中。

/var/jenkins_home/secrets/initialAdminPassword

上面的目錄為docker容器內的路徑,這裡我們對映到了宿主機的data資料夾中,具體路徑如下:

/opt/docker_jenkins/data/secrets/initialAdminPassword

其實,在剛在檢視Jenkins啟動日誌時已經將對應的金鑰顯示在了日誌中。

輸入完密碼後,需要等待一段時間,Jenkins進行初始化啟動。

點選【選擇外掛來安裝】,除預設選擇的外掛外需選擇自定義的外掛安裝,選擇安裝的外掛如下列表:

Git Parameter
Publish Over SSH

然後點選安裝按鈕。



然後系統執行安裝操作,需要等待一段時間,快則1-2個小時,慢則1-2天,安裝期間可以使用docker-compose logs -f檢視安裝日誌,前提為進入到Jenkins對應的docker compose資料夾內執行。

外掛安裝完成後,建立第一個管理員使用者。


配置例項,可以使用預設的URL地址。



點選【重啟】按鈕,等待一段時間後,Jenkins已完成並且配置完成。

使用我們剛才設定的管理員賬號、密碼登入。



看到上面的介面則證明Jenkins已安裝成功。

5.5.2 配置目標伺服器

程式程式碼 -> Gitlab -> Jenkins -> 目標部署伺服器

Jenkins連線目標部署伺服器

在這裡我們配置將生成的目標檔案部署至對應伺服器中,配置步驟如下。

在Jenkins頁面中選在 系統管理 -> 系統配置,如下圖所示:


在【系統配置】功能頁面向下查詢到【Publish over SSH】部分,如下圖所示:


在【SSH Servers】點選【新增】按鈕,新增Gitlab伺服器的SSH登入資訊,點選【高階】按鈕可以配置更多的登入資訊,我們這裡配置的是密碼和埠號,配置完成後可以點選【Test Configuration】按鈕對配置的登入資訊進行測試。


測試配置時出現了一個錯誤資訊,是因為配置的目標路徑在伺服器上面不存在。

使用下面命令在目標伺服器上面建立對應目錄後,再次進行測試,可以測試成功。

zgs@zgs:/opt/docker_gitlab$ cd /usr/local/
zgs@zgs:/usr/local$ ls
bin  etc  games  include  lib  man  sbin  share  src
zgs@zgs:/usr/local$ sudo mkdir jenkins
[sudo] password for zgs: 
zgs@zgs:/usr/local$ ls
bin  etc  games  include  jenkins  lib  man  sbin  share  src

點選【儲存】按鈕即完成了目標伺服器的配置。

5.5.3 配置Jenkins免密碼登入Gitlab

原理是將Jenkins容器內部的SSH密碼配置到Gitlab伺服器的SSH中,這樣就可以實現免登入功能。

首先,通過下面命令進入到Jenkins容器內部。

zgs@zgs:/usr/local$ docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                    PORTS                                                          NAMES
8e1d33e74317        jenkins/jenkins                 "/sbin/tini -- /usr/…"   8 days ago          Up 41 minutes             0.0.0.0:50000->50000/tcp, 0.0.0.0:8888->8080/tcp               jenkins
027f38b36a87        test-ci_testci                  "catalina.sh run"        8 days ago          Up 41 minutes             0.0.0.0:8080->8080/tcp                                         testci
f174354636b5        twang2218/gitlab-ce-zh:11.1.4   "/assets/wrapper"        11 days ago         Up 41 minutes (healthy)   0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   gitlab
zgs@zgs:/usr/local$ docker exec -it 8e1d bash

登入Jenkins容器內部後,在任意目錄下執行命令即可生成對應的SSH密碼,執行命令後如果使用預設配置需要連續按3次回車,命令如下:

zgs@zgs:/usr/local$ docker exec -it 8e1d bash
jenkins@8e1d33e74317:/$ ssh-keygen -t rsa -C "[email protected]"
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa): 
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa.
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:L5H35D4FF5gUI4ZLybfbjJbIxIn2kNwNp3QKanKYUhI [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|E.     . oo.++   |
|. .   . B.+.o..  |
| o o o O @ .   . |
|. + + * O.o . .  |
| . + . =S..*.o   |
|        ++=+o .  |
|        ... o.   |
|         . ..    |
|            ..   |
+----[SHA256]-----+

通過上面命令可以發現,生成的SSH金鑰檔案路徑為:/var/jenkins_home/.ssh/id_rsa.pub.我們在配置Jenkins容器時,已經將該目錄在我們的宿主機上面進行了對映,可以在宿主機上檢視此檔案。

由於.ssh目錄為隱藏目錄,需要使用ls -a命令才能檢視此目錄。

zgs@zgs:/opt/docker_jenkins/data$ pwd
/opt/docker_jenkins/data
zgs@zgs:/opt/docker_jenkins/data$ ls -a
.                                                                           jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml
..                                                                          jenkins.security.ResourceDomainConfiguration.xml
.bash_history                                                               jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml
.cache                                                                      jenkins.telemetry.Correlator.xml
com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml  jobs
config.xml                                                                  .lastStarted
copy_reference_file.log                                                     logs
github-plugin-configuration.xml                                             net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml
.groovy                                                                     nodeMonitors.xml
hudson.model.UpdateCenter.xml                                               nodes
hudson.plugins.build_timeout.operations.BuildStepOperation.xml              org.jenkinsci.plugins.github_branch_source.GitHubConfiguration.xml
hudson.plugins.emailext.ExtendedEmailPublisher.xml                          org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml
hudson.plugins.git.GitSCM.xml                                               org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml
hudson.plugins.git.GitTool.xml                                              org.jenkins.plugins.lockableresources.LockableResourcesManager.xml
hudson.plugins.timestamper.TimestamperConfig.xml                            .owner
hudson.tasks.Mailer.xml                                                     plugins
hudson.tasks.Shell.xml                                                      queue.xml.bak
hudson.triggers.SCMTrigger.xml                                              scriptApproval.xml
identity.key.enc                                                            secret.key
.java                                                                       secret.key.not-so-secret
jenkins.fingerprints.GlobalFingerprintConfiguration.xml                     secrets
jenkins.install.InstallUtil.installingPlugins                               .ssh
jenkins.install.InstallUtil.lastExecVersion                                 updates
jenkins.install.UpgradeWizard.state                                         userContent
jenkins.model.ArtifactManagerConfiguration.xml                              users
jenkins.model.GlobalBuildDiscarderConfiguration.xml                         war
jenkins.model.JenkinsLocationConfiguration.xml                              workflow-libs

跳轉至.ssh目錄下即可檢視生成的SSH公鑰資訊,具體命令如下:

zgs@zgs:/opt/docker_jenkins/data$ cd .ssh/
zgs@zgs:/opt/docker_jenkins/data/.ssh$ ls
id_rsa  id_rsa.pub
zgs@zgs:/opt/docker_jenkins/data/.ssh$ cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2xXksxDQua8Btw5/JmybYJe/Yt2CdF86cv2sSqnH3IUiOIfa2mQuCNkTr6zlc29ZCiw4NQqx/6UfXsSneh01m+oaGwN09tLhbxjtTxApWpga62kqZvddmRU+aVIHG9byC4ysWO2cPK07uYNZFTzbBy/krG1HIwACG0uUoCKMATDnp4H8v71BVsj5AcULTz8yP9cLRkgkjPn1TamNzX10Xn9mac8kHiBBSLfmK1T/pdW1njksCsw+ICwkACcq95YjQt/6zJTX1jf61c4amBj9qPshc2+pF5rRjp2M76c3seCRuIxGMEAzNdvxvaNkm0SngMwg7tcnftb+2aBKnTZ49 [email protected]

把上面的公鑰檔案中的內容在Gitlab中進行配置,在Gitlab頁面右上角的下拉選單中點選【設定】。




7.5.4 配置JDK和Maven

複製本地的JDK和Maven的壓縮包到data目錄下。

zgs@zgs:~/data/software$ ls
apache-maven-3.6.3-bin.tar.gz  docker-compose  jdk-8u261-linux-x64.tar.gz
zgs@zgs:~/data/software$ sudo cp apache-maven-3.6.3-bin.tar.gz /opt/docker_jenkins/data/
zgs@zgs:~/data/software$ sudo cp jdk-8u261-linux-x64.tar.gz /opt/docker_jenkins/data/
zgs@zgs:~/data/software$ cd /opt/docker_jenkins/data/
zgs@zgs:/opt/docker_jenkins/data$ ls
apache-maven-3.6.3-bin.tar.gz                                               jenkins.security.ResourceDomainConfiguration.xml
com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml  jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml
config.xml                                                                  jenkins.telemetry.Correlator.xml
copy_reference_file.log                                                     jobs
github-plugin-configuration.xml                                             logs
hudson.model.UpdateCenter.xml                                               net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml
hudson.plugins.build_timeout.operations.BuildStepOperation.xml              nodeMonitors.xml
hudson.plugins.emailext.ExtendedEmailPublisher.xml                          nodes
hudson.plugins.git.GitSCM.xml                                               org.jenkinsci.plugins.github_branch_source.GitHubConfiguration.xml
hudson.plugins.git.GitTool.xml                                              org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml
hudson.plugins.timestamper.TimestamperConfig.xml                            org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml
hudson.tasks.Mailer.xml                                                     org.jenkins.plugins.lockableresources.LockableResourcesManager.xml
hudson.tasks.Shell.xml                                                      plugins
hudson.triggers.SCMTrigger.xml                                              queue.xml.bak
identity.key.enc                                                            scriptApproval.xml
jdk-8u261-linux-x64.tar.gz                                                  secret.key
jenkins.fingerprints.GlobalFingerprintConfiguration.xml                     secret.key.not-so-secret
jenkins.install.InstallUtil.installingPlugins                               secrets
jenkins.install.InstallUtil.lastExecVersion                                 updates
jenkins.install.UpgradeWizard.state                                         userContent
jenkins.model.ArtifactManagerConfiguration.xml                              users
jenkins.model.GlobalBuildDiscarderConfiguration.xml                         war
jenkins.model.JenkinsLocationConfiguration.xml                              workflow-libs
jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml

手動解壓,使用下面命令將JDK和Maven解壓至當前目錄。

tar -zxvf jdk-8u261-linux-x64.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz

在Jenkins配置頁面配置JDK和Maven。





點選【儲存】按鈕即可。

5.5.5 手動拉取Gitlab專案

使用SSH無密碼連線時,第一次連線需要手動拉取依次程式碼,用於確定連線正常。

使用下面命令進入Jenkins的Docker容器內。

zgs@zgs:/opt/docker_jenkins/data$ docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                  PORTS                                                          NAMES
8e1d33e74317        jenkins/jenkins                 "/sbin/tini -- /usr/…"   8 days ago          Up 11 hours             0.0.0.0:50000->50000/tcp, 0.0.0.0:8888->8080/tcp               jenkins
027f38b36a87        test-ci_testci                  "catalina.sh run"        9 days ago          Up 11 hours             0.0.0.0:8080->8080/tcp                                         testci
f174354636b5        twang2218/gitlab-ce-zh:11.1.4   "/assets/wrapper"        12 days ago         Up 11 hours (healthy)   0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   gitlab
zgs@zgs:/opt/docker_jenkins/data$ docker exec -it 8e1 bash
jenkins@8e1d33e74317:/$ 

登入Gitlab站點的專案主頁,複製專案對應的SSH專案程式碼,然後在Jenkins對應的Docker容器內執行Git clone命令將對應的專案程式碼從Gitlab中拉取到Jenkins伺服器內。


zgs@zgs:/opt/docker_jenkins/data$ docker exec -it 8e1 bash
jenkins@8e1d33e74317:/$ git clone [email protected]:root/test-ci.git
fatal: could not create work tree dir 'test-ci': Permission denied

可以看到執行git clone命令時出現了錯誤,在當前路徑下沒有許可權建立test-ci專案的目錄,我們可以按照下面的命令解決此問題。

jenkins@8e1d33e74317:/$ cd /var/jenkins_home/
jenkins@8e1d33e74317:~$ git clone [email protected]:root/test-ci.git
Cloning into 'test-ci'...
The authenticity of host '192.168.254.129 (192.168.254.129)' can't be established.
ECDSA key fingerprint is SHA256:WufO0MKIlFCuvHo/8eZ/3yM0h/bLnMhQH8NCgF1Y0jE.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.254.129' (ECDSA) to the list of known hosts.
remote: Counting objects: 76, done.
remote: Compressing objects: 100% (45/45), done.
remote: Total 76 (delta 29), reused 42 (delta 15)
Receiving objects: 100% (76/76), 6.65 KiB | 0 bytes/s, done.
Resolving deltas: 100% (29/29), done.

拉取完程式碼後,可以將對應目錄刪除,具體命令如下:

jenkins@8e1d33e74317:~$ ls
apache-maven-3.6.3							    jenkins.mvn.GlobalMavenConfig.xml
apache-maven-3.6.3-bin.tar.gz						    jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml
com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml  jenkins.security.ResourceDomainConfiguration.xml
config.xml								    jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml
copy_reference_file.log							    jenkins.telemetry.Correlator.xml
github-plugin-configuration.xml						    jobs
hudson.model.UpdateCenter.xml						    logs
hudson.plugins.build_timeout.operations.BuildStepOperation.xml		    net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml
hudson.plugins.emailext.ExtendedEmailPublisher.xml			    nodeMonitors.xml
hudson.plugins.git.GitSCM.xml						    nodes
hudson.plugins.git.GitTool.xml						    org.jenkins.plugins.lockableresources.LockableResourcesManager.xml
hudson.plugins.gradle.Gradle.xml					    org.jenkinsci.plugins.gitclient.JGitApacheTool.xml
hudson.plugins.timestamper.TimestamperConfig.xml			    org.jenkinsci.plugins.gitclient.JGitTool.xml
hudson.tasks.Ant.xml							    org.jenkinsci.plugins.github_branch_source.GitHubConfiguration.xml
hudson.tasks.Mailer.xml							    org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml
hudson.tasks.Maven.xml							    org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml
hudson.tasks.Shell.xml							    plugins
hudson.triggers.SCMTrigger.xml						    queue.xml.bak
identity.key.enc							    scriptApproval.xml
jdk-8u261-linux-x64.tar.gz						    secret.key
jdk1.8.0_261								    secret.key.not-so-secret
jenkins.fingerprints.GlobalFingerprintConfiguration.xml			    secrets
jenkins.install.InstallUtil.installingPlugins				    test-ci
jenkins.install.InstallUtil.lastExecVersion				    updates
jenkins.install.UpgradeWizard.state					    userContent
jenkins.model.ArtifactManagerConfiguration.xml				    users
jenkins.model.GlobalBuildDiscarderConfiguration.xml			    war
jenkins.model.JenkinsLocationConfiguration.xml				    workflow-libs
jenkins@8e1d33e74317:~$ rm -rf test-ci/