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 "502558513@qq.com"
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 502558513@qq.com
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 502558513@qq.com

把上面的公鑰文件中的內容在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 git@192.168.254.129: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 git@192.168.254.129: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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM