暑期實習期間,所在的技術中臺—效能研發團隊規劃設計并結合公司開源協同實作符合DevOps理念的研發工具平臺,實作研發程序自動化、標準化;
實習期間對DevOps的理解一直懵懵懂懂,最近觀看了阿里專家帶你玩轉容器云原生DevOps 公開課開始系統的學習DevOps,所以根據學習視頻整理出以下學習筆記希望分享給更多對此感興趣的同學~
課程大綱如下圖所示,會陸續進行更新:
從零搭建CI/CD系統標準化交付流程
- 1. 什么是 CI/CD
- 2. Jenkins CI 介紹
- 3. Jenkins系統架構
- 4. 用Jenkins搭建一個CI/CD系統
- 1. 安裝 Docker
- 2. 啟動 Jenkins Master 容器
- 3. 安裝插件
- 4. Jenkins 構建簡單示例 & master 節點設定
- 5. 配置構建節點
- 6. 運行構建第一個專案
- 7. 將專案打包成docker鏡像推送到鏡像倉庫
- 8. 部署到k8s集群
- 5. 總結
- 6. CICD系統推薦:阿里云CodePipeline
本節課程會教大家從零搭建一個 CI/CD 系統,并通過一個最佳實踐的演示來學習如何使用 CI/CD 系統,
1. 什么是 CI/CD
首先我們先了解一下 CICD 的概念:

持續集成稱為 CI、持續交付和持續部署可以統稱為 CD,
-
持續集成 其實是一種軟體專案管理的方法,依據資產庫(比如說原始碼或者類別庫等)的變更,能夠的自動的去完成代碼的編譯、測驗部署以及其中的一些問題的反饋,通俗來講就是程式員在向版本庫中提交代碼以后,持續集成服務器能夠自動的發現或者是定時發現這個變更,然后依據這些原始碼的變更對代碼重新進行構建、測驗、部署這整個程序,
持續集成的思想是要求我們能夠做到以下幾點:一是說自動構建無需人員參與,這個能節省大量人力成本;二是說能夠自動檢測原始碼版本庫的變更,這個可以通過輪詢、定時策略、使用觸發器或者是程式員自己使用命令來觸發構建等等方式來實作;三就是說反饋機制,構建是不同的步驟的,其中每個步驟出現了問題以后都應該能自動的快速的反饋給正確的人,這個正確的人就是說代碼的提交者或者是這個產品的測驗人員或者是審查人員等等,現在就是說在每一次構建的時候,都應該把之前的環境清理干凈,保證本次構建是一個純凈的構建環境,避免臟資料對這個構建或者測驗產生影響,
-
持續交付 是說能夠自動化的、頻繁的將軟體的新版本能夠交付給質量團隊測驗團隊或者是用戶,目的就是在保證在上生產環境之前可以盡早的發現存在的問題,
-
持續部署 是在持續交付的下一步進行,指的是代碼通過評審以后能夠自動化的部署到生產環境當中
這三個概念里邊其實都有一個持續這個詞,意思就是說我們從代碼提交到部署到生產環境,其中的每一個環節出現問題的時候都能夠快速的把問題反饋給相關人員進行修復,避免了最后到生產環境以后,你才能發現這個問題,然后回頭再去解決這個問題的代價是非常大的,這個就是CICD的核心思想,
2. Jenkins CI 介紹
程式員必讀:七款出色的GitHub功能集成工具 - 51CTO.COM
目前在市場上有多款可用于搭建 CI/CD 系統的工具,其中 Jenkins 是非常流行的一款開源的持續集成、持續交付的平臺,它擁有豐富的插件檔案以及良好的社區,在國內大多數公司的話,在私有的持續集成持續交付方案的話,都會選擇它來做服務器,開發者可以用它快速的搭建符合自己業務場景的流水線流程,結合大量的開源插件,您可以輕松的滿足不同語言、不同平臺、包括不同框架的持續基層場景,無論是現在使用越來越多的 GitLab CI 或者是在開源領域廣受好評的 Travis CI 的話都是無法替代 Jenkins 在持續集成領域的地位的,

我們選擇使用 Jenkins ,還有以下幾個理由:第一是說 Jenkins 是在所有的3A產品中安裝和配置上最簡單的;第二是它是基于web訪問,用戶的界面是非常友好、直觀和靈活的,在很多種情況下的話,他還提供了 Ajax 的及時反饋,第三它是基于 Java 開發的,但是它的構建的話是不限于這個 Java 應用;第四是它擁有大量的插件,極大的擴展了Jenkins 功能,這些插件都是開源的,而且可以直接通過 web 界面來進行安裝和管理,
3. Jenkins系統架構
在搭建 Jenkins CI/CD系統之前,我們有必要先了解一下 Jenkins 的系統架構:

Jenkins 系統架構它是一個 master、slave 的系統架構,我們說的 Jenkins master 就是 Jenkins 服務器,Jenkins slave 的話其實就是我們說的構建節點,兩者相當于是 server 和 agent 的一個概念,
master 它主要是用來提供 web 介面,讓用戶來管理 job 和 slave, job 就是我們說的構建的專案,它是可以運行在 master 本機上,或者是被分配到這個 slave 節點上進行運行的,一個 master 節點通常可以關聯多個 slave 用來做為不同的 job 或者是相同的 job 的不同配置來服務的,雖然 master 也能用來做構建,但是我們在最佳實踐中不建議這么做,我們應該把不同語言型別的應用的構建分類,根據類別的不同運行在對應的 slave 構建環境下邊,這樣便于管理且能避免不必要的錯誤的產生,
當 job 被分配到slave 上進行運行的時候,此時 master 和 slave 其實是建立的一個雙向位元組流的鏈接,其中 master 與 slave 節點之間的連接方式主要有兩種:
- 一種就是說 master 到 slave 節點的網路鏈路是通的,這種情況下的話,我們是可以使用 SSH 的方式,使用用戶名、密碼連接和啟動 slave 節點;
- 另外一種情況就是說 master 到 slave 這個網路鏈路不通,但是 slave 到 master 這個網路鏈路是通的,這種情況下的話,我們就可以使用 JNLP 的連接方式,
4. 用Jenkins搭建一個CI/CD系統
接下來我們會使用 Jenkins 搭建 CI/CD系統,首先我們來看看我們要實踐的一個構建流程:
上圖其實就是一個應用從原始碼提交到部署到生產環境中所需要運行的一些步驟:首先開發者需要推送代碼到原始碼倉庫,這個源碼倉庫可以是 GitHub、Git Bucket、GitLab 等原始碼倉庫,這些都是通過不同的插件來安裝來集成到 Jenkins 系統中進行支持的,一般我們會在原始碼倉庫端配置一個 webhook,原始碼倉庫監聽到這個推送的動作以后意味著應用的代碼有更新,就需要重新構建編譯和部署驗證,這個 webhook 就是用來通知 Jenkins server 自動觸發構建作業的,Jenkins server 也就是 CI server 在接收到通知以后就要運行構建專案,它在運行構建專案之前會先從我們全域配置的一個 k8s 集群中動態的分配一個構建節點,所有的專案構建都會運行在這個構建節點上面,比如說 maven 打包命令、測驗命令等等的,
然后在本節的課程當中構建物,也就是說應用的 jar/war 包會被打包進 Docker 容器鏡像里邊,并推送到的鏡像倉庫,我們這邊使用的是阿里云鏡像倉庫,然后部署應用的時候,再從鏡像倉庫中拉取對應的 image,最終把應用部署到 k8s 集群當中,構建程序當中有任何失敗了的步驟的話,都應該及時的通知到相關的人員,使用郵件或者是使用釘釘通知的話都可以,然后整個構建完成了以后,我們從 k8s 是集群當中分配出來的構建節點是可以釋放掉的,這樣就是一方面是說我們每次構建的時候都是一個新的構建環境,另一方面就是說可以這樣動態分配動態銷毀來構建資源的話,可以節省很多的計算資源,
環境準備:CentOS7 騰訊云服務器、阿里云容器服務、阿里云容器鏡像服務、Gitee
[root@zsr02 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
搭建 Jenkins 系統,就是要先安裝一個 Jenkins 的 master,我們這邊選擇容器化搭建 Jenkins 系統的方式,首先我們會在一個 CentOS7.4 的機器上去安裝 Docker 服務,然后使用 Docker 去啟動 Jenkins master,master 啟動起來以后我們就可以登錄到他的 web 界面上邊去,從界面上去給他安裝插件,然后配置構建節點,并且運行第一個構建專案
1. 安裝 Docker
# 1.移除以前docker相關包
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2. 配置yum源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3. 安裝docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 4. 啟動docker
systemctl enable docker --now
# 5. 配置阿里云加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
以上操作完成后,我們可以使用 systemctl status docker來查看 Docker 服務是否啟動

2. 啟動 Jenkins Master 容器
我們通過 docker run 運行一個容器,-u root 表示以 root 身份來啟動這個容器,-itd 表示以互動模式后臺運行這個容器,-p 8080:8080 表示把容器內部的8080埠(Jenkins master會占用該埠)映射到這個主機上的8080埠,50000埠的話也是如此,是用于JNLP連接的,然后我們用的這個 Jenkins 的鏡像的話,其 Jenkins master 相關的一些配置都會放到 var/jenkins_home 目錄下邊,我們把它映射到宿主機上面,另外我們在 Jenkins 上面可能會用到 docker 的命令,所以我們把宿主機上的 docker.sock 掛載到容器里;然后我們可以給這個容器加個名字 jenkins-master,最后一行是 jenkinssci/blueocean,這個是是 Jenkins master 鏡像的 blueocean 的版本,我們會從 DockerHub 的公共鏡像倉庫里面去拉取這個鏡像,然后把它啟動成一個服務,
docker run -u root -itd -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name jenkins-master jenkinsci/blueocean
下載啟動之后,我們可以用以下命令查看已經啟動的容器,也可以查看8080是否已經被宿主機堅監聽:
[root@zsr02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34326090ece5 jenkinsci/blueocean "/sbin/tini -- /usr/…" 5 minutes ago Up 5 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins-master
[root@zsr02 ~]# netstat -anp|grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 2692/docker-proxy
tcp6 0 0 :::8080 :::* LISTEN 2696/docker-proxy
然后我們可以通過瀏覽器進行訪問,通過宿主機公網ip:8080進行訪問,如下圖所示則代表成功~

Jenkins 第一次安裝的時候會給你初始化一個密碼,然后我們根據提示查看密碼復制即可登陸
[root@zsr02 ~]# cat /var/jenkins_home/secrets/initialAdminPassword
b83af83a04c64ad696c4e8f681286a93
到此 Jenkins Master 容器安裝完成,接下來我們進行插件的啊裝
3. 安裝插件
登陸成功后,可以看到 Jenkins 給我們提供了兩個選項:一個就是安裝推薦的插件,一個是選擇插件的安裝,我們新手剛搭建起來的話,可以直接點擊安裝推薦的插件,后續的話,我們可以在 Jenkins 的插件管理界面上邊自定義的添加自己想要的插件,

此時報錯了,安裝程序中出現一個錯誤: No such plugin: cloudbees-folder

這是因為缺少 cloudbees-folder 插件,我們下載即可:cloudbees-folder下載地址

下載后得到 cloudbees-folder.hpi 檔案,接下來我們只需將它拷貝到 Jenkins 的插件目錄中即可,插件目錄的位置在我們啟動 Jenkins 容器時所掛載的宿主機目錄/war/WEB-INF/detached-plugins中:

這里為:/var/jenkins_home/war/WEB-INF/detached-plugins
我們可以使用 scp 命令進行拷貝,注意這里的用戶名、ip地址、拷貝路徑要換成自己服務器的相應資訊!
scp cloudbees-folder.hpi root@152.136.245.137:/var/jenkins_home/war/WEB-INF/detached-plugins

然后可以在 Jenkins 插件目錄中看到 cloudbees-folder.hpi

然后我們重啟容器
[root@zsr02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34326090ece5 jenkinsci/blueocean "/sbin/tini -- /usr/…" About an hour ago Up 5 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins-master
[root@zsr02 ~]# docker restart 34326090ece5
34326090ece5
然后再次訪問 公網ip:8080 ,此時可能會出現如下界面,我們稍等一下就好,它會自動重繪

然后再次會進入到登陸界面,我們按照上述輸入密碼再次登陸選擇安裝推薦的插件即可成功

4. Jenkins 構建簡單示例 & master 節點設定
推薦插件安裝完成之后,會進入到如下圖所示界面,我們來創建一個管理員用戶

接下來的url設定我們采用默認的

到此安裝完成

然后進入到后臺管理界面

在 Jenkins 的主頁面上面,我們可以看到左邊有新建任務、用戶串列、構建歷史、系統管理等等一些串單,我們可以先點擊新建任務,這邊需要輸入一個任務的名稱,這個任務的話就是我們剛剛所通常說的專案或者是作業,下邊可以選擇自由風格軟體專案流水線等等,我們這邊是先配置一個最簡單的自由風格的軟體專案

點擊確定可以進入到作業的配置頁面,我們可以看到它是分六個部分的:General、原始碼管理、構建觸發器、構建、構建環境、構建后操作,我們可以以 master 作為構建節點來運行一個最簡單的任務,比如這里列印一行字串

保存以后,點擊立即構建,然后可以看到構建歷史這邊會出現一個完成了的構建號,

我們點進去該構建號,然后在控制臺輸出面板可以看到我們剛剛執行的命令資訊:它是由哪個用戶運行的,以及他的作業空間,以及他最終的完成的狀態,

我們剛剛其實講到就是說在 Jenkins CI 這個系統里不希望 master 作為構建節點,所以我們需要在系統設定里邊關于系統的主目錄以及執行者數量作出修改,原先是2,我們把它設定成零進行保存,

這樣設定的話,Jenkins master 就不允許作業運行在它上邊,我們需要另外給它配置 slave 節點去執行相應的 job,
5. 配置構建節點
我們也是以容器的方式來啟動構建節點,首先拉取鏡像并啟動容器
# 拉取鏡像
docker pull registry.cn-beijing.aliyuncs.com/codepipeline/jenkins-slave-java:latest
# 啟動鏡像(將容器里的22埠,也就是SSH的埠映射到宿主機的30001上)
docker run -itd -p 30001:22 -v /var/run/docker.sock:/var/run/docker.sock registry.cn-beijing.aliyuncs.com/codepipeline/jenkins-slave-java:latest
為了接下來的ssh遠程連接到該容器,我們首先要進入該容器設定一些用戶名和密碼,默認的登陸用戶名是root,我們進入到容器中設定登陸密碼,記住該密碼
[root@zsr02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e280aa72ea7 registry.cn-beijing.aliyuncs.com/codepipeline/jenkins-slave-java:latest "/usr/sbin/sshd -D" 2 seconds ago Up 2 seconds 0.0.0.0:30001->22/tcp, :::30001->22/tcp gracious_keller
34326090ece5 jenkinsci/blueocean "/sbin/tini -- /usr/…" 4 days ago Up 4 days 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins-master
[root@zsr02 ~]# docker exec -it 5e280aa72ea7 /bin/bash
root@5e280aa72ea7:/# sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
然后我們依次點擊 Manage-Jenkins --> Manage Nodes and Clouds,這里我們可以看到只有 master 這一個節點,由于剛才它已經被我們設定了可執行數量為0,因此它現在是沒法去構建 job,

因此我們需要新建一個節點,起名字叫做 slave-java,勾選固定節點,然后點擊ok

然后進入到詳細設定頁面,首先來設定并發構建數,我們可以改成5;然后設定 Job 在該構建節點上的作業空間,這里為 /home/jenkins;然后設定標簽,標簽用于在 Job 的配置中選擇,可以映射到具體的構建節點,用法一般選擇只允許運行系結到這臺機器上的 Job;

啟動方式的話,我們可以選擇 SSH 遠程連接方式,其中的主機就是宿主機的公網ip地址,登陸憑證的話我們需要創建一個 SSH 登陸的用戶名和密碼,也就是我們前面設定的容器用戶名密碼,用戶名為root,密碼為你自己前面設定的

然后這里的 Credentials 選擇以上創建的憑證;host key 選擇不采用驗證策略

然后我們點開這里的高級,修改埠號設定為30001,因為我們容器啟動的時候將容器內的22映射到了宿主機的30001

以上設定都設定完成后,點擊保存即可看到新創建的節點

此時該節點顯示?,代表與 Jekins master 連接是有問題的,這里是因為它在初始化,我們等待一會即可看到 slave-java 節點已經正常的連接,而且它是有五個 executor 的執行者,也就是說有五個 job 可以在這個節點上面并行構建,

現在我們就可以回到剛才我們的新建的任務里邊修改它的配置,讓其來在我們剛剛創建的 slave-java 節點上進行運行,

在 General 區域的我們可以限制專案的運行節點,這里要填一個標簽,就是前面我們配置 slave-java 節點設定的標簽,

設定完保存,然后點擊立即構建,可以看到構建成功

然后我們查看其控制臺輸出,可以看到它成功運行在 slave-java 機器上

6. 運行構建第一個專案
在對 Jenkins 系統的使用有了一個基本的了解以后,我們就可以配置一個更復雜的作業,來自動化一個應用從源代碼的提交到整個應用部署這一整個程序,正如我們下圖中所示的一樣,我們需要配置去拉取原始碼,對原始碼進行構建,構建出來的 war 包打包成 docker 鏡像,并推送到鏡像倉庫,最終把這個應用鏡像部署到容器集群的這樣一個程序,
我們回到 Jenkins 的主頁面,現在新建一個任務,名字叫做 java-demo 構建,選擇一個自由風格的軟體專案,

首先我們需要配置這個 job 可以運行在 slave-java 構建節點上面,

然后我們需要配置一個原始碼管理,這里有一個我自己的專案代碼,地址為:https://gitee.com/zhong_siru/staff-manage-system.git,它是一個公共倉庫,可以直接克隆下來,而不需要配置用戶名密碼,如果是私有倉庫的話,這邊需要添加一個包含用戶名和密碼的證書,然后原始碼的分支的話,這里是main,

再往下在構建這部分的話,我們添加一個執行 shell,將 maven 打包命令寫進去,
mvn package -B -DskipTests
上述操作設定完成后,保存任務,然后點擊立即構建,我們來看控制臺輸出,首先是 admin 用戶,然后運行在 slave-java 節點上邊進行原始碼的拉取原始碼構建,

然后根據構建命令進行構建,在構建程序中,會先拉取一些依賴的 jar 包,

然后執行打包命令,可以看到在 target 目錄下生成了 spring-04-system-0.0.1-SNAPSHOT.jar 包,構建成功,


7. 將專案打包成docker鏡像推送到鏡像倉庫
以上我們成功運行構建了一個專案,在該任務配置里邊的話,我們在 slave-java 節點上將原始碼的拉取下來進行構建,構建產物也就是這個 jar 包其實是放置在該構建節點上面的,我們應該要將它打包成一個docker 鏡像,然后推送到鏡像倉庫,
這樣我們需要使用到一個插件,這個插件目前是沒有安裝的,我們需要在 Manage Jenkins 中的 Manage Plugins 中的可選插件中搜索CloudBees Docker Build and Publish這個插件點擊 Download now and install after restar,也就是下載然后重啟安裝,因為所有插件的安裝都得在 Jenkins master 重啟后才生效,

重啟是需要一定的時間,我們在 docker 鏡像打包完成以后,需要把它推送到鏡像倉庫里邊,這邊我們就會使用到另外一個阿里云的服務叫做容器鏡像服務,這個服務目前也是免費的,第一次使用我們需要創建一個命名空間,這里創建過一個 bareth 的命名空間,

然后還需要在訪問憑證界面中設定一下 Register 的登錄密碼,這個和你登錄阿里云控制臺的這個用戶密碼是不一樣的,

我們可以回頭去看一下這個 Jenkins master 已經重啟成功,重新登錄一下,然后我們點進 java-demo 這個專案的構建對它進行配置,我們再增加一個構建步驟來打包成鏡像并推送到鏡像倉庫,
前面安裝完插件以后,這邊就會出現一個docker build and publish 的插件,這個插件就是能幫助我們打包 docker 鏡像并且進行推送,接下來我們就是需要填入這個插件所需要的各個引數項,它每個引數項的后邊都會有一個問號,就是一些幫助的檔案,如果我們有什么不明白的,可以點開這個問號來看一下有哪些資訊我們可以參考,

首先就是這個 Repository Name 的話,格式為name space/倉庫名稱,倉庫的名稱的話,我們可以起個名字,比如說 java -demo,Tag 的話就是說這個鏡像它的標簽我們可以給出 v1,Docker host URI 以及 server credentials 我們可以不用管,
然后我們需要寫這個 Docker registered URL,對于阿里云的容器鏡像服務來說的話,我們查詢一下他的公網地址,復制一下,加上 v2 代表這個API 的版本為2,

然后我們需要添加一個鏡像倉庫的用戶名密碼作為證書,賬號是阿里云賬號,密碼就是前面設定的 Registry 的密碼

然后保存立即構建,之前我們可以看一下這個控制臺的輸出,可以發現出錯了

命令提示 /home/jenkins/workspace/java-demo/Dockerfile 下沒有該檔案,意思就是我們缺少一個 Dockerfile,由于該任務是運行在 slave-java 構建節點上的,也就是一個容器,因此我們可以進入該容器中,在指定位置添加一個 Dockerfile

Dockerfile檔案內容如下:
FROM java:8
MAINTAINER zsr
ADD target/springboot-04-system-0.0.1-SNAPSHOT.jar /staff-manage-system.jar
CMD ["--server.port=8081"]
EXPOSE 8081
ENTRYPOINT ["java","-jar","/staff-manage-system.jar"]
添加之后,我們在 Jenkins 頁面上重新執行 java-demo任務,觀察控制臺變化,等待一會,就可以看到已經 success,鏡像已經推送到我們的阿里云鏡像倉庫

我們回到阿里云鏡像倉庫界面,可以看到 java-demo 的鏡像推送上來

再看一下它的鏡像版本的話,也是 v1 跟 latest 兩個版本,因為該插件默認會把 latest 標簽也推送上來,這個就完成了docker 鏡像的構建和推送這個步驟,

8. 部署到k8s集群
接下來我們要做的事情,就是把這個打好的 docker 鏡像部署到容器集群里邊,這里就部署到 k8s 集群中,我們首先需要安裝一個插件

然后在 Jenkins 這端我們要去給 java-demo 這個任務新增一個構建步驟,選則 Deploy to Kubenetes

首先需要配置一個證書,選擇這個 Kubenetes configuration 這個型別,id 設定為k8s,這邊的話我已經提前準備好一個 kubenetes 集群,

然后我們現在先復制一下他的 KubeConfig 的資訊添加到 Content 區域,然后點擊保存,

這里選擇我們剛剛創建的證書,然后 configure files 的話是我們要部署的樣本檔案,這里為 deployment.yaml,該檔案是放在這個gitee原始碼檔案里邊的,

deployment.yaml 內容如下:
apiVersion: v1
kind: Deployment
metadata:
name: java-demo-001
spec:
replicas: 2
selector:
matchLabels:
app: java-demo-001
template:
metadata:
labels:
app:java-demo-001
spec:
containers;
- name: java-demo-001
image: registry.cn-hangzhou.aliyuncs.com/bareth/java-demo:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: java-demo-001
spec:
ports:
- port:80
targetPort:8080
name: java-demo-001
selector:
app: java-demo-001
type: LoadBalancer
上述配置添加完成以后,我們保存,然后進行構建,可以看一下這個控制臺的輸出:

可以看到首先是打包鏡像,然后是鏡像的推送,最后是部署我們剛剛指定的deployment,執行結果為 success,
此時專案鏡像已經成功推送到 k8s 的集群中,然后我們在阿里云容器集群里的控制臺界面就可以看到推送上來的 java-demo-001 服務以及它的外部訪問資訊,這樣我們通過該外部端點就可以直接訪問該專案啦!

5. 總結
到目前為止,我們就已經完成了一個專案從原始碼的拉取、編譯構建、打包成docker鏡像、推送鏡像到影響倉庫、部署到k8s容器集群這一系列流程的自動化,最終實作我們可以從瀏覽器上邊訪問到這個服務,
以上只是我們為了講解搭建的一個最簡單CICD系統,對于真正在生產中使用CICD系統遠不止如此,還需要很多其他的作業,如下所示:
- Jenkins master 容災
- Jenkins slave節點規劃和鏡像制作插件管理
- 訪問權限配置
- 原始碼管理、觸發器、構建結果通知等
- 日常運維:資料清理、備份
- 組件更新升級
- 安全漏洞修補
6. CICD系統推薦:阿里云CodePipeline
阿里云公共云服務 CodePipeline 是基于 Jenkins 做的二次開發的 CICD系統,相比 Jenkins 有很多優點:
第一就是它是一個 SaaS 化的持續交付引擎,也就是只要阿里云用戶登錄上來就能使用的一個免費服務,
- 使用程序中用戶不需要運維,開箱即用,其中 Jenkins master、Jenkins slave 節點的運維都由 CodePipeline 來完成,用戶只需要使用這個服務,并且它已經集成了很多常用的插件,并且符合用戶的使用習慣做了一些二次開發,
- 它的構建節點,都是通過一個容器集群來動態提供的,動態生成動態銷毀,可以保證這個構建節點是全新的且資源按需分配不浪費,另外當用戶的構建物在構建完成以后,需要上傳到用戶自己的存盤空間,比如說OSS的Bucket上或者是容器鏡像倉庫,保證用戶自己的構建物或者是代碼是不會外泄的,

第二是它是全量兼容Jenkins插件,目前開放出來的插件都是經過阿里云安全加固的插件,并且然后一些優秀的自研插件,可以根據開發者的需求不斷的開放,也會不定期的反饋回給社區進行開放,而且開放的插件的話會更適用于阿里云的場景,

第三是它與阿里云產品生態無縫集成,比如說OSS、容器服務、容器的鏡像倉庫服務等等,此外還支持多種的部署環境,比如說可以部署到ECS,或者部署到我們剛剛演示的容器集群中,

第四是它具有多維度安全策略保障,首先構建節點是用完即焚的,每個人都是一個獨立的構建環境,不會跟其他用戶混在一起,避免臟資料的污染;然后構建物的上傳可以上傳到用戶自己的私有的OSS倉庫,或者是用戶私有的容器鏡像倉庫,最后就是說其提供的專用插件是經過安全加固的,

最后就是它支持多種方式部署,如下圖所示:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356216.html
標籤:其他
上一篇:Docker命令學習筆記


上圖其實就是一個應用從原始碼提交到部署到生產環境中所需要運行的一些步驟:首先開發者需要推送代碼到原始碼倉庫,這個源碼倉庫可以是 GitHub、Git Bucket、GitLab 等原始碼倉庫,這些都是通過不同的插件來安裝來集成到 Jenkins 系統中進行支持的,一般我們會在原始碼倉庫端配置一個 webhook,原始碼倉庫監聽到這個推送的動作以后意味著應用的代碼有更新,就需要重新構建編譯和部署驗證,這個 webhook 就是用來通知 Jenkins server 自動觸發構建作業的,Jenkins server 也就是 CI server 在接收到通知以后就要運行構建專案,它在運行構建專案之前會先從我們全域配置的一個 k8s 集群中動態的分配一個構建節點,所有的專案構建都會運行在這個構建節點上面,比如說 maven 打包命令、測驗命令等等的,