1. 程式人生 > 其它 >Jenkins持續整合入門到精通(進階篇)

Jenkins持續整合入門到精通(進階篇)

視訊參考:https://www.bilibili.com/video/BV1Vp4y1b7ZN?p=51

1. Jenkins+Docker+SpringCloud持續整合流程說明


大致流程說明:

1)開發人員每天把程式碼提交到Gitlab程式碼倉庫
2)Jenkins從Gitlab中拉取專案原始碼,編譯並打成jar包,然後構建成Docker映象,將映象上傳到Harbor私有倉庫。
3)Jenkins傳送SSH遠端命令,讓生產部署伺服器到Harbor私有倉庫拉取映象到本地,然後建立容器。
4)最後,使用者可以訪問到容器
服務列表

2.環境準備

2.1 SpringCloud微服務原始碼概述

專案架構: 前後端分離

後端技術棧: SpringBoot+SpringCloud+SpringDataJpa(Spring全家桶)

微服務專案結構:

tensquare_parent:父工程,存放基礎配置
tensquare_common:通用工程,存放工具類
tensquare_eureka_server:SpringCloud的Eureka註冊中心
tensquare_zuul:SpringCloud的閘道器服務
tensquare_admin_service:基礎許可權認證中心,負責使用者認證(使用JWT認證)
tensquare_gathering:一個簡單的業務模組,活動微服務相關邏輯
資料庫結構:

(1)本地部署微服務
SpringBoot微服務專案打包,必須在pom中匯入該外掛

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

打包後在target下產生jar包

前端靜態web網站
前端技術棧: NodeJS+VueJS+ElementUI
使用Visual Studio Code開啟原始碼
1)本地執行

npm run dev 

打包靜態web網站

npm run build

打包後,產生dist目錄的靜態檔案

3)部署到nginx伺服器
把dist目錄的靜態檔案拷貝到nginx的html目錄,啟動nginx

4)啟動nginx,並訪問
http://localhost:82

2.2 Docker安裝和配置

Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低。
Docker容器技術 vs 傳統虛擬機器技術


Docker技術就是讓我們更加高效輕鬆地將任何應用在Linux伺服器部署和使用

2.2.1 Docker安裝

(1)解除安裝舊版本

yum list installed | grep docker 列出當前所有docker的包
yum -y remove docker的包名稱 解除安裝docker包
rm -rf /var/lib/docker 刪除docker的所有映象和容器

(2)安裝必要的軟體包

sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2

(3)設定下載的映象倉庫

sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/dockerce.repo

(4)列出需要安裝的版本列表

yum list docker-ce --showduplicates | sort -r

5)安裝指定版本

sudo yum install docker-ce-18.06.1.ce

6)檢視版本

docker -v

7)啟動Docker

sudo systemctl start docker 啟動
sudo systemctl enable docker 設定開機啟動

8)新增阿里雲映象下載地址

vi /etc/docker/daemon.json

內容如下

{
	"registry-mirrors": ["https://zydiol88.mirror.aliyuncs.com"]
}

9)重啟Docker

sudo systemctl restart docker

Docker基本命令快速入門
1)映象命令
映象:相當於應用的安裝包,在Docker部署的任何應用都需要先構建成為映象

docker search 映象名稱 搜尋映象
docker pull 映象名稱 拉取映象
docker images 檢視本地所有映象
docker rmi -f 映象名稱 刪除映象
docker pull openjdk:8-jdk-alpine

2)容器命令
容器:容器是由映象建立而來。容器是Docker執行應用的載體,每個應用都分別執行在Docker的每個容器中

docker run -i 映象名稱:標籤 執行容器(預設是前臺執行)
docker ps 檢視執行的容器
docker ps -a 查詢所有容器

常用的引數:

-i:執行容器
-d:後臺守方式執行(守護式)
–name:給容器新增名稱
-p:公開容器埠給當前宿主機
-v:掛載目錄

docker exec -it 容器ID/容器名稱 /bin/bash 進入容器內部
docker start/stop/restart 容器名稱/ID 啟動/停止/重啟容器
docker rm -f 容器名稱/ID 刪除容器

2.3 Dockerfile映象指令碼快速入門

Dockerfile其實就是我們用來構建Docker映象的原始碼,當然這不是所謂的程式設計原始碼,而是一些命令的組合,只要理解它的邏輯和語法格式,就可以編寫Dockerfile了。
簡單點說,Dockerfile的作用:它可以讓使用者個性化定製Docker映象。因為工作環境中的需求各式各樣,網路上的映象很難滿足實際的需求。
dockerfile常見命令

映象構建示意圖:

可以看到,新映象是從基礎映象一層一層疊加生成的。每安裝一個軟體,就在現有映象的基礎上增加一層。
RUN、CMD、ENTRYPOINT的區別?
RUN:用於指定 docker build 過程中要執行的命令,即是建立 Docker 映象(image)的步驟
CMD:設定容器的啟動命令, Dockerfile 中只能有一條 CMD 命令,如果寫了多條則最後一條生效,CMD不支援接收docker run的引數。
ENTRYPOINT:入口程式是容器啟動時執行的程式, docker run 中最後的命令將作為引數傳遞給入口程式 ,ENTRYPOINY類似於 CMD 指令,但可以接收docker run的引數 。
以下是mysql官方映象的Dockerfile示例:

FROM oraclelinux: 7 - slim 

ARG MYSQL_SERVER_PACKAGE = mysql - community - server - minimal - 5.7.28 
ARG MYSQL_SHELL_PACKAGE = mysql - shell - 8.0.18

# Install server 
RUN yum install -y https://repo.mysql.com/mysql-community-minimal-release- el7.rpm \ 
https://repo.mysql.com/mysql-community-release-el7.rpm \ 
	&& yum-config-manager --enable mysql57-server-minimal \ 
	&& yum install -y \ 
		$MYSQL_SERVER_PACKAGE \ 
		$MYSQL_SHELL_PACKAGE \ 
		libpwquality \ 
	&& yum clean all \ 
	&& mkdir /docker-entrypoint-initdb.d 

VOLUME /var/lib/mysql COPY docker-entrypoint.sh /entrypoint.sh 
COPY healthcheck.sh /healthcheck.sh 
ENTRYPOINT ["/entrypoint.sh"] 
HEALTHCHECK CMD /healthcheck.sh 
EXPOSE 3306 33060 
CMD ["mysqld"]

使用Dockerfile製作微服務映象

我們利用Dockerfile製作一個Eureka註冊中心的映象

1)上傳Eureka的微服務jar包到linux的某個目錄下

2)在編寫Dockerfile

FROM openjdk:8-jdk-alpine 
ARG JAR_FILE 
COPY ${JAR_FILE} app.jar 
EXPOSE 10086 
ENTRYPOINT ["java","-jar","/app.jar"]

3)構建映象

docker build --build-arg JAR_FILE=tensquare_eureka_server-1.0-SNAPSHOT.jar -t eureka:v1 .

注意最後有一個.表示當前路徑
4)檢視映象是否建立成功

docker images

5)建立容器

docker run -i --name=eureka -p 10086:10086 eureka:V1

6)訪問容器
http://192.168.66.101:10086

2.4.Harbor映象倉庫安裝及使用

Harbor(港口,港灣)是一個用於儲存和分發Docker映象的企業級Registry伺服器。
除了Harbor這個私有映象倉庫之外,還有Docker官方提供的Registry。相對Registry,Harbor具有很多優勢:

  1. 提供分層傳輸機制,優化網路傳輸 Docker映象是是分層的,而如果每次傳輸都使用全量檔案(所以用FTP的方式並不適合),顯然不經濟。必須提供識別分層傳輸的機制,以層的UUID為標識,確定傳輸的物件。
  2. 提供WEB介面,優化使用者體驗 只用映象的名字來進行上傳下載顯然很不方便,需要有一個使用者介面可以支援登陸、搜尋功能,包括區分公有、私有映象。
  3. 支援水平擴充套件叢集 當有使用者對映象的上傳下載操作集中在某伺服器,需要對相應的訪問壓力作分解。
  4. 良好的安全機制 企業中的開發團隊有很多不同的職位,對於不同的職位人員,分配不同的許可權,具有更好的安全性。

2.4.1 HarBor安裝

需要安裝在92.168.66.102上面
1)先安裝Docker並啟動Docker(參考以前的)
2)安裝docker-compose

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker- compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

3)給docker-compose新增執行許可權

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

4)檢視docker-compose是否安裝成功

docker-compose -version

5)下載Harbor的壓縮包(本課程版本為:v1.9.2)
https://github.com/goharbor/harbor/releases
6)上傳壓縮包到linux,並解壓

tar -xzf harbor-offline-installer-v1.9.2.tgz
mkdir /opt/harbor
mv harbor/* /opt/harbor
cd /opt/harbor

7)修改Harbor的配置

vi harbor.yml

修改hostname和port

hostname: 192.168.66.102
port: 85

8)安裝Harbor

./prepare
./install.sh

9)啟動harbor

docker-compose up -d 啟動
docker-compose stop 停止
docker-compose restart 重新啟動

10)訪問Harbor
http://192.168.66.102:85
預設賬戶密碼:admin/Harbor12345

2.4.2在Harbor建立使用者和專案

1)建立專案

Harbor的專案分為公開和私有的:

公開專案:所有使用者都可以訪問,通常存放公共的映象,預設有一個library公開專案。
私有專案:只有授權使用者才可以訪問,通常存放專案本身的映象。

我們可以為微服務專案建立一個新的專案:

2)建立使用者

建立的使用者為: itcast/Itcast123
3)給私有專案分配使用者
進入tensquare專案->成員




4)以新使用者登入Harbor

2.4.3 把映象上傳到Harbor

1)給映象打上標籤

docker tag eureka:v1 192.168.66.102:85/tensquare/eureka:v1

2)推送映象

docker push 192.168.66.102:85/tensquare/eureka:v1

如果出現以下錯誤:
The push refers to repository [192.168.66.102:85/tensquare/eureka]
Get https://192.168.66.102:85/v2/: http: server gave HTTP response to HTTPS client
解決方法:把Harbor地址加入到Docker信任列表

vi /etc/docker/daemon.json
{
	"registry-mirrors": ["https://zydiol88.mirror.aliyuncs.com"], 
	"insecure-registries": ["192.168.66.102:85"] 
}

需要重啟Docker

4)再次執行推送命令,會提示許可權不足
denied: requested access to the resource is denied
需要先登入Harbor,再推送映象

5)登入Harbor

docker login -u 使用者名稱 -p 密碼 192.168.66.102:85


從Harbor下載映象(注意這個是在103機器上修改和前面的有區別)

需求:在192.168.66.103伺服器完成從Harbor下載映象

1)安裝Docker,並啟動Docker(已經完成)
2)修改Docker配置

vi /etc/docker/daemon.json
{
	"registry-mirrors": ["https://zydiol88.mirror.aliyuncs.com"], 
	"insecure-registries": ["192.168.66.102:85"] 
}

重啟docker

3)先登入,再從Harbor下載映象

docker login -u 使用者名稱 -p 密碼 192.168.66.102:85
docker pull 192.168.66.102:85/tensquare/eureka:v1