持续集成/持续部署(3)Jenkins(2)
JenkinsPipeline
CI/CD持續集成/持續部署
持續集成(Continuous integration)是一種軟件開發實踐,即團隊開發成員經常集成它們的工作,通過每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而盡早地發現集成錯誤。
比如(你家裝修廚房,其中一項是鋪地磚,邊角地磚要切割大小。如果一次全切割完再鋪上去,發現尺寸有誤的話浪費和返工時間就大了,不如切一塊鋪一塊。這就是持續集成。)
持續部署(continuous deployment)是通過自動化的構建、測試和部署循環來快速交付高質量的產品。某種程度上代表了一個開發團隊工程化的程度,畢竟快速運轉的互聯網公司人力成本會高于機器,投資機器優化開發流程化相對也提高了人的效率。
比如(裝修廚房有很多部分,每個部分都有檢測手段,如地磚鋪完了要測試漏水與否,線路鋪完了要通電測試電路通順,水管裝好了也要測試冷水熱水。如果全部裝完了再測,出現問題可能會互相影響,比如電路不行可能要把地磚給挖開……。那么每完成一部分就測試,這是持續部署。)
持續交付 Continuous Delivery:頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審盡早發現生產環境中存在的問題;如果評審通過,代碼就進入生產階段
比如(全部裝修完了,你去驗收,發現地磚顏色不合意,水池太小,灶臺位置不對,返工嗎?所以不如沒完成一部分,你就去用一下試用驗收,這就是持續交付。)
敏捷思想中提出的這三個觀點,還強調一件事:通過技術手段自動化這三個工作。加快交付速度。
pipeline介紹
Jenkins 2.0的精髓是Pipeline as Code,是幫助Jenkins實現CI到CD轉變的重要角色。什么是Pipeline,簡單來說,就是一套運行于Jenkins上的工作流框架,將原本獨立運行于單個或者多個節點的任務連接起來,實現單個任務難以完成的復雜發布流程。Pipeline的實現方式是一套Groovy DSL,任何發布流程都可以表述為一段Groovy腳本,并且Jenkins支持從代碼庫直接讀取腳本,從而實現了Pipeline as Code的理念。
Pipeline 是一個用戶定義的 CD 流水線模式。Pipeline 代碼定義了通常包含構建、測試和發布步驟的完整的構建過程。
Node
???node 是一個機器,它是 Jenkins 環境的一部分,并且能夠執行 Pipeline。同時,node 代碼塊也是腳本式 Pipeline 語法的關鍵特性。
Stage
???Stage 塊定義了在整個 Pipeline 中執行的概念上不同的任務子集(例如“構建”,“測試”和“部署”階段),許多插件使用它來可視化或呈現 Jenkins 管道狀態/進度。
Step
???一項任務。從根本上講,一個步驟告訴 Jenkins 在特定時間點(或過程中的“步驟”)要做什么。例如,使用 sh step:sh ‘make’ 可以執行 make 這個 shell 命令。
創建pipeline項目
將測試代碼粘貼到pipeline腳本中
pipeline{ agent any stages{stage("get code"){steps{echo "get code from scm"}}stage("package"){steps{echo "packge code"}}stage("deploy"){steps{echo "deploy packge to node1"}} } }執行完成查看結果
將freestyle項目集成到pipeline
將jenkinsfile寫入到game項目中
完成后點擊提交改變
在jenkins執行pipeline測試
在sonar客戶端配置文件中需要配置 服務端的信息
[root@jenkins conf]# pwd /usr/local/sonar/conf [root@jenkins conf]# cat sonar-scanner.properties #Configure here general information about the environment, such as SonarQube server connection details for example #No information about specific project should appear here#----- Default SonarQube server sonar.host.url=http://10.0.0.202:9000 sonar.login=f254aa77ea29dead6ac3f9990052cab3f3809918#----- Default source code encoding sonar.sourceEncoding=UTF-8配置完成在繼續執行pipeline
參數化構建
執行參數化構建
腳本
[root@jenkins scripts]# cat deploy.sh #!/bin/sh CODE_DIR="/var/lib/jenkins/workspace/devloy-job/" WEB_DIR="/code"get_code_tar(){cd $CODE_DIR && tar zcf /opt/web_${git_version}.tar.gz ./* }scp_code_web(){scp /opt/web_${git_version}.tar.gz 10.0.0.7:$WEB_DIR }code_tarxf(){ssh 10.0.0.7 "cd $WEB_DIR &&mkdir web_${git_version} && tar xf web_${git_version}.tar.gz -C web_${git_version} && rm -rf web_${git_version}.tar.gz"} ln_html(){ssh 10.0.0.7 "cd $WEB_DIR && rm -rf html && ln -s web_${git_version} html" }main(){get_code_tar;scp_code_web;code_tarxf;ln_html; } if [ "$deploy_env" == "deploy" ];then.#判斷如果版本已經發布過則退出if [ $GIT_COMMIT = $GIT_PREVIOUS_SUCCESSFUL_COMMIT ]thenecho "當前版本已經發布過不允許重復構建"exitelsemainfi elif [ "$deploy_env" == "rollback" ];thenln_html fiJenkins創建Maven
安裝maven
在jenkins服務器執行 刪除maven rpm包解壓 [root@jenkins ~]# ll total 291048 -rw-r--r-- 1 root root 8491533 Aug 27 2018 apache-maven-3.3.9-bin.tar.gz [root@jenkins ~]# tar xf apache-maven-3.3.9-bin.tar.gz [root@jenkins ~]# mv apache-maven-3.3.9-bin.tar.gz /usr/local/mavenPATH變量添加mvn命令路徑 [root@jenkins ~]# tailf -1 /etc/profile export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sonar/bin/:/usr/local/maven/bin"使用mvn編譯代碼
1. 上傳hellow word包 [root@jenkins ~]# ll drwxr-xr-x 5 root root 91 Aug 6 2019 hello-world-war [root@jenkins ~]# cd hello-world-war/ [root@jenkins hello-world-war]# #mvn package 打包 #mvn clean 清除上一次的打包編譯 [root@jenkins hello-world-war]# mvn package ...........執行成功
執行成功后會看到 jar包
安裝tomcat
10.0.0.7:安裝jdk和tomcat
1.下載tomcat
2.將war包放入ROOT代碼目錄
[root@jenkins hello-world-war]# scp target/hello-world-war-1.0.0.war 10.0.0.7:/usr/local/tomcat/webapps/ROOT hello-world-war-1.0.0.war 100% 2402 2.5MB/s 00:003.啟動tomcat
[root@test ~]# /usr/local/tomcat/bin/startup.sh4.訪問10.0.0.7:8080
代碼集成到jenkins
1.上傳java代碼到gitlab
上傳java代碼到10.0.0.200
2.在gitlab上創建java項目
自己在gitlab創建一個名稱為java的項目 屬于test組
3. 設置遠程倉庫 將代碼推送到gitlab java項目
2.jenkins創建項目拉取代碼并執行mvn編譯
創建后在全局工具配置maven的家目錄
修改maven的默認倉庫
將配置粘貼到配置文件中的第158行的下面
/usr/local/maven/conf/settings.xml
命令行測試mvn
[root@jenkins ~]# cd hello-world-war/ [root@jenkins hello-world-war]# mvn package #查看走的是阿里云的maven倉庫 Downloading: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar Downloaded: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar (0 B at 0.0 KB/sec)安裝nexus私服
[root@nexus ~]# ll total 286068 -rw-r--r-- 1 root root 170023183 Aug 14 2018 jdk-8u181-linux-x64.rpm -rw-r--r-- 1 root root 122904706 Aug 22 2018 nexus-3.13.0-01-unix.tar.gz [root@nexus ~]# tar xf nexus-3.13.0-01-unix.tar.gz [root@nexus ~]# ll total 286068 -rw-r--r-- 1 root root 170023183 Aug 14 2018 jdk-8u181-linux-x64.rpm drwxr-xr-x 9 root root 163 Aug 11 15:44 nexus-3.13.0-01 -rw-r--r-- 1 root root 122904706 Aug 22 2018 nexus-3.13.0-01-unix.tar.gz drwxr-xr-x 3 root root 20 Aug 11 15:44 sonatype-work [root@nexus ~]# mv nexus-3.13.0-01 /usr/local/nexus啟動nexus [root@nexus ~]# cd /usr/local/nexus/bin/ [root@nexus bin]# ll [root@nexus bin]# ./nexus start登錄nexus
http://10.0.0.203:8081/
默認用戶名: admin
默認密碼: admin123
配置maven
將/usr/local/maven/conf/settings.xml備份
將settings.xml復制到/usr/local/maven/conf
IP地址修改成自己nexus服務器的地址
配置jenkins的集群
安裝部署基礎環境
第一步: 把10.0.0.8作為jenkins的從節點
安裝 jdk
略
安裝 git
略
10.0.0.8和10.0.0.7做免秘鑰(需要推送代碼到7)
[root@web02 ~]# ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7將jenkins的sonar客戶端目錄拷貝到10.0.0.8
[root@jenkins ~]# scp -r /usr/local/sonar/ 10.0.0.8:/usr/local/將jenkins的maven目錄拷貝到10.0.0.8
[root@jenkins ~]# scp -r /usr/local/maven/ 10.0.0.8:/usr/local/創建腳本目錄
[root@web02 ~]# mkdir -p /server/scripts [root@jenkins ~]# scp /server/scripts/* 10.0.0.8:/server/scripts/做 hosts解析
[root@web02 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.0.200 gitlab.ahui.com第二步: jenkins服務器和從節點10.0.0.8做免秘鑰
[root@jenkins ~]# ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.8第三步: 將10.0.0.8從節點的公鑰放到gitlab的root賬號下 擁有下載代碼的權限
[root@web02 ~]# ssh-keygen [root@web02 ~]# cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0qPazNGJ+PsJk5109Zn7qEnlnZ+sipEUKJn4oS2AYMxMPvHacgRtzEyNI35rOVKPb6G/N5dF+F+SwHfCHz2/mIrTmVkvBCTROHQ4EhTReR9BdW9y0Eo1S9fmI7zoBchqH0SJQRazoVuhmxWkDhwLAQ93IDMm1eMKFZgxpXXoxy0e7FBOcH+xWwd4OmrYWgp0SQOXgZcQRegeRcLNJp2+sBFwwEGxPCUgl7lgUokAaICRpNpmZgXwnIcqYt0b5Zfgefej0yNnIMnioYIWwTkSfvU+3LmYa92ibBWRFxMVlTnTiIYa7cUP5tNqT+hMYg+M7ukTICT82O3g0ObpETB57 root@web02添加節點
配置從節點SSH連接方式
添加jenkins的私鑰
添加客戶端的工具位置
總結
以上是生活随笔為你收集整理的持续集成/持续部署(3)Jenkins(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]阮杰:从散户到身价过亿的私募掌门人
- 下一篇: android 手写签批_Android