CI&CD:html
若是springboot-demo須要修改某些代碼,按照上述流程,是否是又要從新打包?而後寫Dockerfile,push鏡像,而後寫k8s配置文件等等之類的操做,在生產環境咱們也會遇到發包更新頻繁的問題,那麼有什麼辦法提升咱們的發佈效率與協做效率呢?這裏咱們一般會引入CI&CD的概念java
持續集成(Continuous integration,簡稱CI:頻繁地(一天屢次或者N次)將代碼集成到主幹。將軟件我的研發的部分向軟件總體部分交付,頻繁進行集成以便更快地發現其中的錯誤。node
持續交付(Continuous delivery):指的是,頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審。若是評審經過,代碼就進入生產階段。持續交付在持續集成的基礎上,將集成後的代碼部署到更貼近真實運行環境的「類生產環境」(production-like environments)中。持續交付優先於整個產品生命週期的軟件部署,創建在高水平自動化持續集成之上。git
持續部署(continuous deployment,簡稱CD):是持續交付的下一步,指的是代碼經過評審之後,自動部署到生產環境。持續部署的目標是,代碼在任什麼時候刻都是可部署的,能夠進入生產階段。持續部署的前提是能自動化完成測試、構建、部署等步驟。github
持續集成、持續交付、持續部署提供了一個優秀的 DevOps 環境。對於整個開發團隊來講,能很大地提高開發效率,好處與挑戰並行。不管如何,頻繁部署、快速交付以及開發測試流程自動化都將成爲將來軟件工程的重要組成部分。web
咱們就來感覺一下CICD帶來的效率,首先咱們基於先前的SpringBoot-demo工程進行發佈,當有Push操做的時候會經過Web Hook鉤子讓Jenkins進行構建,推送,讓後簡歷docker鏡像,k8s構建pod。發佈服務:spring
基礎環境準備:docker
(1)建立jenkins的taskapache
(2)拉取github代碼,在最下面編寫pipeline,而後「保存和當即構建「,同時能夠查看「Console Output」api
腳本以下
node { def mvnHome stage('Preparation') { // for display purposes git 'https://github.com/itcrazy2016/springboot-demo.git' } }
建立完返回首頁點擊構建:
(3)來到Jenkins安裝節點: /root/.jenkins/workspace/springboot-demo
(4)配置springboot-demo的task,修改pipeline內容 ,增長maven構建,而後「保存和當即構建「,同時能夠查看「Console Output」
node { def mvnHome stage('Preparation') { // for display purposes git 'https://github.com/wuzhenzhao/springboot-demo.git' } dir('/root/.jenkins/workspace/springboot-demo/springboot-demo') { // 切換到/home/jenkins目錄中作一些事情 // some block stage('Maven Build') { sh "mvn clean package" } } }
(5)來到節點:ll /root/.jenkins/workspace/springboot-demo/springboot-demo
先看Jenkins控制檯的輸出
看看服務器的目錄,果真生成了 target目錄。
至此,咱們已經能夠經過在jenkins上手動構建的方式,拿到github上的代碼,而且用maven進行構建。
(1)在github上配置jenkins的webhook地址,配置GitHub Server [系統管理]->[系統配置]->[找到github服務器]->找到Github,這裏有 Web Hook的地址:
選擇構建觸發器,而且選擇Github Hook觸發
而後配置Github:
(2)生成Personal access tokens
Jenkins訪問github須要受權,因此在github上生成token交給jenkins使用,即 Personal access tokens.
github的Settings[我的信息右上角]-->Developer settings-->Personal access tokens
Generate new token 最後保存好該token,好比: 0b9d624404e95d6fe36f86d84374f2dcce402b43
(3) 配置GitHub Server [系統管理]->[系統配置]->[找到github服務器]->[添加github服務器] 而後按照下面圖片步驟進行操做:
jenkins安裝插件:
01 安裝github plugin插件:[系統管理]->[插件管理]->[可選插件] 02 安裝gitlab插件和gitlab hook插件:[系統管理]->[插件管理]->[可選插件]
系統設置找到Github,這裏有 Web Hook的地址:
配置完是這樣的:
而後用 IDEA 提交如下代碼測試一下,確保無誤進行下面的操做。
build&push鏡像:通過前面的折騰,確定能夠獲取到代碼,而且用maven進行構建了,最終拿到一個target/xxx.jar
來到 jenkins安裝主機節點上的workspace目錄:cd /root/.jenkins/workspace
(1) 建立文件夾準備一個文件,名稱爲springboot-demo-build-image.sh
mkdir /root/.jenkins/workspace/scripts/ vi /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
(2)編寫springboot-demo-build-image.sh文件
# 進入到springboot-demo目錄 cd ../springboot-demo # 編寫Dockerfile文件 cat <<EOF > Dockerfile FROM openjdk:8-jre-alpine COPY target/springboot-demo-1.0-SNAPSHOT.jar /springboot-demo.jar ENTRYPOINT ["java","-jar","/springboot-demo.jar"] EOF echo "Dockerfile created successfully!" # 基於指定目錄下的Dockerfile構建鏡像 docker build -t registry.cn-hangzhou.aliyuncs.com/wuzz-docker/springboot-demo:v1.0 . # push鏡像,這邊須要阿里雲鏡像倉庫登陸,在當前安裝了jenkins主機上登陸 docker push registry.cn-hangzhou.aliyuncs.com/wuzz-docker/springboot-demo:v1.0
sudo docker login --username=隨風去wuzz registry.cn-hangzhou.aliyuncs.com 先登陸。
chmod +x /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh 給文件受權
(3)增長pipeline
node { def mvnHome stage('Preparation') { // for display purposes git 'https://github.com/wuzhenzhao/springboot-demo.git' } dir('/root/.jenkins/workspace/springboot-demo/springboot-demo') { // 切換到/home/jenkins目錄中作一些事情 // some block stage('Maven Build') { sh "mvn clean package" } stage('Build Image') { sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh" } } }
(4):從新構建,成功以下
查看鏡像:docker images
看看阿里雲倉庫是否有鏡像了:
通過前面的折騰,如今已經可以把鏡像push到鏡像倉庫了,接下來就是k8s拉取鏡像而且運行在集羣中咯。根據前面的經驗,確定再建立一個stage,而後運行sh腳本,腳本中執行內容,包括yaml文件
(1) 編寫springboot-demo.yaml文件 。在/root/.jenkins/workspace/scripts/目錄下建立springboot-demo.yaml
# 以Deployment部署Pod apiVersion: apps/v1 kind: Deployment metadata: name: springboot-demo spec: selector: matchLabels: app: springboot-demo replicas: 1 template: metadata: labels: app: springboot-demo spec: containers: - name: springboot-demo image: registry.cn-hangzhou.aliyuncs.com/wuzz-docker/springboot-demo:v1.0 ports: - containerPort: 8888 --- # 建立Pod的Service apiVersion: v1 kind: Service metadata: name: springboot-demo spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: springboot-demo --- # 建立Ingress,定義訪問規則 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: springboot-demo spec: rules: - host: springboot.wuzz.com http: paths: - path: / backend: serviceName: springboot-demo servicePort: 80
(2)編寫k8s-deploy-springboot-demo.sh文件
vi /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
kubectl delete -f /root/.jenkins/workspace/scripts/springboot-demo.yaml kubectl apply -f /root/.jenkins/workspace/scripts/springboot-demo.yaml echo "k8s deploy success!"
(3)編寫pipeline:
node { def mvnHome stage('Preparation') { // for display purposes git 'https://github.com/wuzhenzhao/springboot-demo.git' } dir('/root/.jenkins/workspace/springboot-demo/springboot-demo') { // 切換到/home/jenkins目錄中作一些事情 // some block stage('Maven Build') { sh "mvn clean package" } stage('Build Image') { sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh" } stage('K8S Deploy') { sh "/root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh" } } }
chmod +x /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh 受權。
先查看一下 Nodes 是都是 ready :kubectl get nodes:
確保網絡沒問題:查看系統 pods:kubectl get pods --all-namespaces -w
這個時候IDEA 修改後提交代碼,會觸發構建:
查看 pod,service,ingress信息
再查看一下 pod 的啓動日誌 :kubectl logs -f pod-name:
到這裏就部署完成了,因爲我這裏是阿里雲沒有域名,沒法再本地操做,到了這一步,只要 k8s集羣沒問題,部署就沒問題了。若是 Jenkins 是部署在 worker 節點, worker執行不了kubectl