一、概述
1.簡介
在工作中接觸到CD/CI,Devops相關的技術,本文記錄Jenkins的基本使用。Jenkins是一款開源的持續集成工具,能夠集成一套自動化部署任務。
目標
- 通過jenkins從github拉取代碼(web應用)
- 通過jenkins進行maven編譯打包
- jenkins發送打好的jar包,發送到另一台需要部署的虛擬機上(已安裝docker)
- 通過dockerfile打新鏡像
- 停掉已運行的容器,並啟動新的容器
2.環境准備
兩台虛擬機 (實現利用Jenkins從github拉取代碼,並通過maven打包,部署到另一台服務器的docker容器中)
a.一台安裝了docker (用於部署程序)
b.一台安裝了maven jdk8 git (用於安裝jenkins,並拉取代碼,編譯打包)
二、安裝、啟動、配置Jenkins
1.下載Jenkins
本文采用部署war包的方式安裝Jenkins,首先下載jenkins war包。
$ wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
官方鏈接:
1.安裝向導: https://jenkins.io/zh/doc/book/installing/#setup-wizard
2.war包下載: http://mirrors.jenkins.io/war-stable/
2.啟動Jenkins
通過war包的方式啟動Jenkins的方式很簡單,直接使用java -jar命令就可以啟動了,Jenkins默認端口是8080 如果需要指定端口可以修改啟動參數
$ java -jar jenkins.war --httpPort=9090
啟動成功后會自動生成admin賬號以及密碼,第一次登錄時需要用到
3.初次登錄Jenkins
訪問部署Jenkins那台服務器的9090端口,輸入初始密碼
進入安裝向導,選擇【安裝推薦插件】,當然也可以自定義需要安裝的插件
推薦的安裝的插件如下圖,等待下載安裝。
插件下載安裝后,創建管理員賬號
接下來配置Jenkins實例絕對地址(本文采用默認URL),這個值會和Jenkins參數BUILD_URL有關
保存后,開始使用Jenkins,使用剛配置的管理員賬號登錄即可
補充安裝插件:
由於我們會將jenkins打好的包發送到另外一台服務器進行部署,因此需要再安裝【Publish Over SSH】【Publish Over FTP】插件。
使用admin賬號登錄jenkins,點擊【系統管理】-【插件管理】-【可選插件】,搜索"publish over",選擇【Publish Over SSH】【Publish Over FTP】插件,並直接安裝。
配置ssh,點擊【系統管理】-【系統設置】,新增,輸入遠程服務器ip,以及用戶名和密碼,並填寫遠程服務器的訪問路徑(這里是根目錄) 點擊test查看是否連接成功,成功后保存配置即可
三、任務創建與執行
1.【方式1】創建自由風格的任務
下面將創建一個基於上下游自由風格的任務,實現我們的目標
創建好后,在配置界面,可以看到自由風格的任務包含下面幾點內容
1.在【General】中,選擇參數化構建過程,使用文本參數,定義參數為branch,即在構建任務前,可以傳遞的參數。
2.【源碼管理】選擇git,輸入倉庫地址,並添加憑據,類型選擇【Username with password】,用戶名、密碼分別填寫github賬號和密碼。
3.【構建】,添加兩個構架步驟,1.執行shell,2.Send files or execute commands over SSH
shell命令步驟用於使用maven打包
Send files or execute commands over SSH 用戶發送打好的包到部署服務器
這里補充說一下,jenkins自帶了很多環境變量可以直接使用,例如工作目錄 WORKSPACE等,訪問jenkins這個路徑可以查看 http://192.168.152.133:9090/env-vars.html/
shell命令步驟:通過maven打包
cd eureka # 進入項目工程 mvn clean package -Dmaven.test.skip=true # maven 打包
Send files or execute commands over SSH 步驟
這個步驟會指定需要被發送的jar包,以及發送到遠程服務器的指定路徑,並構建一個新的鏡像進行部署。
補充:基礎鏡像Dockerfile(基礎鏡像安裝openjdk 1.8),基礎鏡像可以安裝配置一些軟件、環境,之后需要部署的程序都可以FROM這個基礎鏡像

FROM centos:7 RUN yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

$ docker build -t base_image .
具體配置:
- Name:選擇之前配置的需要遠程部署的主機
- Source files:需要發送到遠程主機的文件(注意路徑,這里使用相對路徑,相對於在jenkins workspace這個任務的路徑 這里是相對於這個路徑: /root/.jenkins/workspace/Job1 )
- Remove prefix:刪除路徑前綴(發送的文件名會受【Source files】配置的影響,這里需要刪除路徑前綴)
- Remote directory:遠程主機需要接收包的路徑(這個路徑是相對路徑,相對於之前配置遠程服務器信息的Remote Directory,由於之前配置的是根路徑,因此這里可以使用絕對路徑)
- Exec command:包發送成功后,執行的命令
# 在遠程服務器上
cd /data/deploy
docker build -t eureka_image:${branch} .
docker run -dit -p 18080:8761 eureka_image:${branch} /bin/bash #暴露端口 宿主機18080端口與容器8761端口映射
附上需要部署程序的Dockerfile
FROM base_image:latest ADD eureka-0.0.1-SNAPSHOT.jar /data/eureka.jar WORKDIR /data ENTRYPOINT ["java","-jar","eureka.jar"] EXPOSE 8761
執行
配置完成后點擊保存,Build with Parameters,輸入參數(需要部署的分支),點擊開始構建
點擊正在進行的任務,【控制台輸出】可以看到構建日志
可以看到最后是SUCCESS,說明構建成功。如果構建失敗可以根據日志提示進行排查。
訪問服務器18080端口,看到Eureka界面,說明部署成功。
2.【方式2(推薦)】創建Pipeline任務
創建以及配置
新建一個【流水線】任務,創建好后直接編寫Pipeline script
pipeline{ agent any //代理 options { // 針對流水線的控制選項 timeout(time: 10, unit: 'MINUTES') } parameters { // 1.構建構建參數 string(name: 'BRANCH', defaultValue: 'dev', description: '分支') } stages { // 2.包含以系列stage stage('Pull Code') { // 3.stage 定義代碼拉取階段 steps{ // 6.步驟 git branch: '$BRANCH', credentialsId: 'your credentials', url: 'https://github.com/SherryXRJ/test.git' // 9.選擇git倉庫 } } stage('Build') { // 4.stage 定義構建階段 environment { // 10.環境變量定義 skipTest = 'true' } input { // 11.pipeline用戶輸入框 id "Deploy" // 默認與stage一致 message "Should we Build now?" ok "Yes, we should." submitter "admin" // 可以提點擊確認的用戶 parameters { // 14.參數定義 string(name: 'MSG', defaultValue: 'admin', description: 'Who should I say hello to?') } } steps{ // 7.步驟 sh 'printenv' sh 'echo msg: ${MSG}' sh ''' cd eureka mvn clean package -Dmaven.test.skip=$skipTest ''' } } stage('Deploy'){ // 5.stage 定義部署階段 when { // 12.pipeline scripe 條件分支 allOf { // allOf not anyOf expression { return params.BRANCH == 'dev' } // 只有dev分支才部署 // other conditions ... } } steps{ // 8.步驟 sh ''' echo ${PERSON} ''' // 15.ssh腳本 sshPublisher(publishers: [sshPublisherDesc(configName: 'remote_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /data/deploy docker build -t eureka_image:${branch} . docker run -dit -p 18080:8761 eureka_image:${branch} /bin/bash''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/data/deploy', remoteDirectorySDF: false, removePrefix: 'eureka/target/', sourceFiles: 'eureka/target/eureka-0.0.1-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } } post { //13.post步驟 success { // always changed failure success unstable aborted echo "success" } } }
這里對上面的pipeline script進行說明:
- parameters: 注釋1 14
- 構建參數,定義任務參數。在自由風格的任務中,參數化構建是在界面上進行的新增,這里通過腳本定義,參數為需要拉取的分支
- stages:注釋2
- 需要在stages中定義一系列的stage
- stage:注釋3.4.5
- 可以定義階段名稱
- steps: 注釋6.7.8
- 具體執行步驟,可以為shell腳本、流水線腳本等
- 流水線腳本:注釋9.15
- 可以通過Jenkins界面操作生成流水線腳本
- environment:注釋10
- 環境變量,在本任務中定義環境變量,該環境變量僅在每次執行的任務中生效
- input:注釋11
- 用戶輸入框,例如這里配置,當任務執行到‘Build’階段時,需要admin用戶點擊確認,才能繼續執行
- when:注釋12
- 條件判斷,滿足了這些條件才能執行之后的步驟(上面的腳本中只有當構建的分支為dev時,才進行Deploy步驟)
- post: 注釋13
- 當該任務狀態發生改變時,會觸發post里對應階段的內容(狀態包括:always, changed,failure,success,unstable,aborted)
補充說明通過Jenkins界面生成流水線腳本,以git腳本為例(ssh腳本同理)
可以參考官網語法:Jenkins官方語法介紹
啟動
可以看到【階段視圖】
外部訪問成功(由於虛擬機重啟,ip地址變更,這里的ip地址與之前的ip地址不同,請讀者忽略這個問題)