主頁 >  其他 > 容器云原生DevOps學習筆記——第三期:從零搭建CI/CD系統標準化交付流程

容器云原生DevOps學習筆記——第三期:從零搭建CI/CD系統標準化交付流程

2021-11-12 14:06:20 其他

暑期實習期間,所在的技術中臺—效能研發團隊規劃設計并結合公司開源協同實作符合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 的概念:
image-20211106111802702
持續集成稱為 CI、持續交付和持續部署可以統稱為 CD

  • 持續集成 其實是一種軟體專案管理的方法,依據資產庫(比如說原始碼或者類別庫等)的變更,能夠的自動的去完成代碼的編譯、測驗部署以及其中的一些問題的反饋,通俗來講就是程式員在向版本庫中提交代碼以后,持續集成服務器能夠自動的發現或者是定時發現這個變更,然后依據這些原始碼的變更對代碼重新進行構建、測驗、部署這整個程序,

    持續集成的思想是要求我們能夠做到以下幾點:一是說自動構建無需人員參與,這個能節省大量人力成本;二是說能夠自動檢測原始碼版本庫的變更,這個可以通過輪詢、定時策略、使用觸發器或者是程式員自己使用命令來觸發構建等等方式來實作;三就是說反饋機制,構建是不同的步驟的,其中每個步驟出現了問題以后都應該能自動的快速的反饋給正確的人,這個正確的人就是說代碼的提交者或者是這個產品的測驗人員或者是審查人員等等,現在就是說在每一次構建的時候,都應該把之前的環境清理干凈,保證本次構建是一個純凈的構建環境,避免臟資料對這個構建或者測驗產生影響,

  • 持續交付 是說能夠自動化的、頻繁的將軟體的新版本能夠交付給質量團隊測驗團隊或者是用戶,目的就是在保證在上生產環境之前可以盡早的發現存在的問題,

  • 持續部署 是在持續交付的下一步進行,指的是代碼通過評審以后能夠自動化的部署到生產環境當中

這三個概念里邊其實都有一個持續這個詞,意思就是說我們從代碼提交到部署到生產環境,其中的每一個環節出現問題的時候都能夠快速的把問題反饋給相關人員進行修復,避免了最后到生產環境以后,你才能發現這個問題,然后回頭再去解決這個問題的代價是非常大的,這個就是CICD的核心思想,



2. Jenkins CI 介紹

程式員必讀:七款出色的GitHub功能集成工具 - 51CTO.COM

目前在市場上有多款可用于搭建 CI/CD 系統的工具,其中 Jenkins 是非常流行的一款開源的持續集成、持續交付的平臺,它擁有豐富的插件檔案以及良好的社區,在國內大多數公司的話,在私有的持續集成持續交付方案的話,都會選擇它來做服務器,開發者可以用它快速的搭建符合自己業務場景的流水線流程,結合大量的開源插件,您可以輕松的滿足不同語言、不同平臺、包括不同框架的持續基層場景,無論是現在使用越來越多的 GitLab CI 或者是在開源領域廣受好評的 Travis CI 的話都是無法替代 Jenkins 在持續集成領域的地位的,
image-20211106114838794
我們選擇使用 Jenkins ,還有以下幾個理由:第一是說 Jenkins 是在所有的3A產品中安裝和配置上最簡單的;第二是它是基于web訪問,用戶的界面是非常友好、直觀和靈活的,在很多種情況下的話,他還提供了 Ajax 的及時反饋,第三它是基于 Java 開發的,但是它的構建的話是不限于這個 Java 應用;第四是它擁有大量的插件,極大的擴展了Jenkins 功能,這些插件都是開源的,而且可以直接通過 web 界面來進行安裝和管理,



3. Jenkins系統架構

在搭建 Jenkins CI/CD系統之前,我們有必要先了解一下 Jenkins 的系統架構:
image-20211106213423961
Jenkins 系統架構它是一個 masterslave 的系統架構,我們說的 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 節點之間的連接方式主要有兩種:

  1. 一種就是說 master 到 slave 節點的網路鏈路是通的,這種情況下的話,我們是可以使用 SSH 的方式,使用用戶名、密碼連接和啟動 slave 節點;
  2. 另外一種情況就是說 master 到 slave 這個網路鏈路不通,但是 slave 到 master 這個網路鏈路是通的,這種情況下的話,我們就可以使用 JNLP 的連接方式,


4. 用Jenkins搭建一個CI/CD系統

接下來我們會使用 Jenkins 搭建 CI/CD系統,首先我們來看看我們要實踐的一個構建流程:

image-20211106115241645上圖其實就是一個應用從原始碼提交到部署到生產環境中所需要運行的一些步驟:首先開發者需要推送代碼到原始碼倉庫,這個源碼倉庫可以是 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 服務是否啟動
image-20211106215022700

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進行訪問,如下圖所示則代表成功~
image-20211106222654355
Jenkins 第一次安裝的時候會給你初始化一個密碼,然后我們根據提示查看密碼復制即可登陸

[root@zsr02 ~]# cat /var/jenkins_home/secrets/initialAdminPassword
b83af83a04c64ad696c4e8f681286a93

到此 Jenkins Master 容器安裝完成,接下來我們進行插件的啊裝

3. 安裝插件

登陸成功后,可以看到 Jenkins 給我們提供了兩個選項:一個就是安裝推薦的插件,一個是選擇插件的安裝,我們新手剛搭建起來的話,可以直接點擊安裝推薦的插件,后續的話,我們可以在 Jenkins 的插件管理界面上邊自定義的添加自己想要的插件,

在這里插入圖片描述

此時報錯了,安裝程序中出現一個錯誤: No such plugin: cloudbees-folder
image-20211106223421720
這是因為缺少 cloudbees-folder 插件,我們下載即可:cloudbees-folder下載地址
image-20211106224449859
下載后得到 cloudbees-folder.hpi 檔案,接下來我們只需將它拷貝到 Jenkins 的插件目錄中即可,插件目錄的位置在我們啟動 Jenkins 容器時所掛載的宿主機目錄/war/WEB-INF/detached-plugins中:
image-20211106224638070
這里為:/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

image-20211106225224019
然后可以在 Jenkins 插件目錄中看到 cloudbees-folder.hpi
image-20211106225438045
然后我們重啟容器

[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 ,此時可能會出現如下界面,我們稍等一下就好,它會自動重繪

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

4. Jenkins 構建簡單示例 & master 節點設定

推薦插件安裝完成之后,會進入到如下圖所示界面,我們來創建一個管理員用戶
image-20211107012625218
接下來的url設定我們采用默認的

在這里插入圖片描述

到此安裝完成

在這里插入圖片描述

然后進入到后臺管理界面
image-20211107013007413
在 Jenkins 的主頁面上面,我們可以看到左邊有新建任務、用戶串列、構建歷史、系統管理等等一些串單,我們可以先點擊新建任務,這邊需要輸入一個任務的名稱,這個任務的話就是我們剛剛所通常說的專案或者是作業,下邊可以選擇自由風格軟體專案流水線等等,我們這邊是先配置一個最簡單的自由風格的軟體專案
image-20211107114058028
點擊確定可以進入到作業的配置頁面,我們可以看到它是分六個部分的:General、原始碼管理、構建觸發器、構建、構建環境、構建后操作,我們可以以 master 作為構建節點來運行一個最簡單的任務,比如這里列印一行字串
image-20211107114351156
保存以后,點擊立即構建,然后可以看到構建歷史這邊會出現一個完成了的構建號,
image-20211107121923108
我們點進去該構建號,然后在控制臺輸出面板可以看到我們剛剛執行的命令資訊:它是由哪個用戶運行的,以及他的作業空間,以及他最終的完成的狀態,
image-20211107122050249
我們剛剛其實講到就是說在 Jenkins CI 這個系統里不希望 master 作為構建節點,所以我們需要在系統設定里邊關于系統的主目錄以及執行者數量作出修改,原先是2,我們把它設定成零進行保存,
image-20211107122417148
這樣設定的話,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,
image-20211107184321025
因此我們需要新建一個節點,起名字叫做 slave-java,勾選固定節點,然后點擊ok
在這里插入圖片描述

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

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

在這里插入圖片描述

然后這里的 Credentials 選擇以上創建的憑證;host key 選擇不采用驗證策略
image-20211107190309346
然后我們點開這里的高級,修改埠號設定為30001,因為我們容器啟動的時候將容器內的22映射到了宿主機的30001
image-20211107192046141
以上設定都設定完成后,點擊保存即可看到新創建的節點
image-20211107193419543
此時該節點顯示?,代表與 Jekins master 連接是有問題的,這里是因為它在初始化,我們等待一會即可看到 slave-java 節點已經正常的連接,而且它是有五個 executor 的執行者,也就是說有五個 job 可以在這個節點上面并行構建,
image-20211110202421818
現在我們就可以回到剛才我們的新建的任務里邊修改它的配置,讓其來在我們剛剛創建的 slave-java 節點上進行運行,
image-20211110202912609
在 General 區域的我們可以限制專案的運行節點,這里要填一個標簽,就是前面我們配置 slave-java 節點設定的標簽,
image-20211110203111782
設定完保存,然后點擊立即構建,可以看到構建成功
image-20211110203334364
然后我們查看其控制臺輸出,可以看到它成功運行在 slave-java 機器上
image-20211110210302018

6. 運行構建第一個專案

在對 Jenkins 系統的使用有了一個基本的了解以后,我們就可以配置一個更復雜的作業,來自動化一個應用從源代碼的提交到整個應用部署這一整個程序,正如我們下圖中所示的一樣,我們需要配置去拉取原始碼,對原始碼進行構建,構建出來的 war 包打包成 docker 鏡像,并推送到鏡像倉庫,最終把這個應用鏡像部署到容器集群的這樣一個程序,
image-20211106115241645

我們回到 Jenkins 的主頁面,現在新建一個任務,名字叫做 java-demo 構建,選擇一個自由風格的軟體專案,
image-20211110213823087
首先我們需要配置這個 job 可以運行在 slave-java 構建節點上面,
image-20211110215118548
然后我們需要配置一個原始碼管理,這里有一個我自己的專案代碼,地址為:https://gitee.com/zhong_siru/staff-manage-system.git,它是一個公共倉庫,可以直接克隆下來,而不需要配置用戶名密碼,如果是私有倉庫的話,這邊需要添加一個包含用戶名和密碼的證書,然后原始碼的分支的話,這里是main,
image-20211110215134492
再往下在構建這部分的話,我們添加一個執行 shell,將 maven 打包命令寫進去,

mvn package -B -DskipTests

上述操作設定完成后,保存任務,然后點擊立即構建,我們來看控制臺輸出,首先是 admin 用戶,然后運行在 slave-java 節點上邊進行原始碼的拉取原始碼構建,
image-20211110222525358
然后根據構建命令進行構建,在構建程序中,會先拉取一些依賴的 jar 包,

在這里插入圖片描述

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

7. 將專案打包成docker鏡像推送到鏡像倉庫

以上我們成功運行構建了一個專案,在該任務配置里邊的話,我們在 slave-java 節點上將原始碼的拉取下來進行構建,構建產物也就是這個 jar 包其實是放置在該構建節點上面的,我們應該要將它打包成一個docker 鏡像,然后推送到鏡像倉庫,

這樣我們需要使用到一個插件,這個插件目前是沒有安裝的,我們需要在 Manage Jenkins 中的 Manage Plugins 中的可選插件中搜索CloudBees Docker Build and Publish這個插件點擊 Download now and install after restar,也就是下載然后重啟安裝,因為所有插件的安裝都得在 Jenkins master 重啟后才生效,
image-20211110223557884
重啟是需要一定的時間,我們在 docker 鏡像打包完成以后,需要把它推送到鏡像倉庫里邊,這邊我們就會使用到另外一個阿里云的服務叫做容器鏡像服務,這個服務目前也是免費的,第一次使用我們需要創建一個命名空間,這里創建過一個 bareth 的命名空間,
image-20211111172151578
然后還需要在訪問憑證界面中設定一下 Register 的登錄密碼,這個和你登錄阿里云控制臺的這個用戶密碼是不一樣的,
image-20211111143442928
我們可以回頭去看一下這個 Jenkins master 已經重啟成功,重新登錄一下,然后我們點進 java-demo 這個專案的構建對它進行配置,我們再增加一個構建步驟來打包成鏡像并推送到鏡像倉庫,

前面安裝完插件以后,這邊就會出現一個docker build and publish 的插件,這個插件就是能幫助我們打包 docker 鏡像并且進行推送,接下來我們就是需要填入這個插件所需要的各個引數項,它每個引數項的后邊都會有一個問號,就是一些幫助的檔案,如果我們有什么不明白的,可以點開這個問號來看一下有哪些資訊我們可以參考,
image-20211110235824032
首先就是這個 Repository Name 的話,格式為name space/倉庫名稱,倉庫的名稱的話,我們可以起個名字,比如說 java -demo,Tag 的話就是說這個鏡像它的標簽我們可以給出 v1,Docker host URI 以及 server credentials 我們可以不用管,

然后我們需要寫這個 Docker registered URL,對于阿里云的容器鏡像服務來說的話,我們查詢一下他的公網地址,復制一下,加上 v2 代表這個API 的版本為2,
image-20211111172052554
然后我們需要添加一個鏡像倉庫的用戶名密碼作為證書,賬號是阿里云賬號,密碼就是前面設定的 Registry 的密碼
image-20211111001412863
然后保存立即構建,之前我們可以看一下這個控制臺的輸出,可以發現出錯了
image-20211111150406162
命令提示 /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,鏡像已經推送到我們的阿里云鏡像倉庫
image-20211111145724174
我們回到阿里云鏡像倉庫界面,可以看到 java-demo 的鏡像推送上來
image-20211111145827140
再看一下它的鏡像版本的話,也是 v1 跟 latest 兩個版本,因為該插件默認會把 latest 標簽也推送上來,這個就完成了docker 鏡像的構建和推送這個步驟,
image-20211111145917883

8. 部署到k8s集群

接下來我們要做的事情,就是把這個打好的 docker 鏡像部署到容器集群里邊,這里就部署到 k8s 集群中,我們首先需要安裝一個插件
image-20211111013636720
然后在 Jenkins 這端我們要去給 java-demo 這個任務新增一個構建步驟,選則 Deploy to Kubenetes

在這里插入圖片描述

首先需要配置一個證書,選擇這個 Kubenetes configuration 這個型別,id 設定為k8s,這邊的話我已經提前準備好一個 kubenetes 集群,
image-20211111162317434
然后我們現在先復制一下他的 KubeConfig 的資訊添加到 Content 區域,然后點擊保存,
image-20211111154600434
這里選擇我們剛剛創建的證書,然后 configure files 的話是我們要部署的樣本檔案,這里為 deployment.yaml,該檔案是放在這個gitee原始碼檔案里邊的,
image-20211111154715849
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 服務以及它的外部訪問資訊,這樣我們通過該外部端點就可以直接訪問該專案啦!
image-20211111162503381



5. 總結

到目前為止,我們就已經完成了一個專案從原始碼的拉取、編譯構建、打包成docker鏡像、推送鏡像到影響倉庫、部署到k8s容器集群這一系列流程的自動化,最終實作我們可以從瀏覽器上邊訪問到這個服務,

以上只是我們為了講解搭建的一個最簡單CICD系統,對于真正在生產中使用CICD系統遠不止如此,還需要很多其他的作業,如下所示:

  1. Jenkins master 容災
  2. Jenkins slave節點規劃和鏡像制作插件管理
  3. 訪問權限配置
  4. 原始碼管理、觸發器、構建結果通知等
  5. 日常運維:資料清理、備份
  6. 組件更新升級
  7. 安全漏洞修補


6. CICD系統推薦:阿里云CodePipeline

阿里云公共云服務 CodePipeline 是基于 Jenkins 做的二次開發的 CICD系統,相比 Jenkins 有很多優點:

第一就是它是一個 SaaS 化的持續交付引擎,也就是只要阿里云用戶登錄上來就能使用的一個免費服務,

  • 使用程序中用戶不需要運維,開箱即用,其中 Jenkins master、Jenkins slave 節點的運維都由 CodePipeline 來完成,用戶只需要使用這個服務,并且它已經集成了很多常用的插件,并且符合用戶的使用習慣做了一些二次開發,
  • 它的構建節點,都是通過一個容器集群來動態提供的,動態生成動態銷毀,可以保證這個構建節點是全新的且資源按需分配不浪費,另外當用戶的構建物在構建完成以后,需要上傳到用戶自己的存盤空間,比如說OSS的Bucket上或者是容器鏡像倉庫,保證用戶自己的構建物或者是代碼是不會外泄的,

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

在這里插入圖片描述

第三是它與阿里云產品生態無縫集成,比如說OSS、容器服務、容器的鏡像倉庫服務等等,此外還支持多種的部署環境,比如說可以部署到ECS,或者部署到我們剛剛演示的容器集群中,
image-20211111163450049
第四是它具有多維度安全策略保障,首先構建節點是用完即焚的,每個人都是一個獨立的構建環境,不會跟其他用戶混在一起,避免臟資料的污染;然后構建物的上傳可以上傳到用戶自己的私有的OSS倉庫,或者是用戶私有的容器鏡像倉庫,最后就是說其提供的專用插件是經過安全加固的,
image-20211111163528120
最后就是它支持多種方式部署,如下圖所示:
image-20211111163621845

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

標籤:其他

上一篇:Docker命令學習筆記

下一篇:HCNP Routing&Switching之BGP路由過濾和AS-Path-Filter

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

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more