在工做中接觸到CD/CI,Devops相關的技術,本文記錄Jenkins的基本使用。Jenkins是一款開源的持續集成工具,可以集成一套自動化部署任務。html
兩臺虛擬機 (實現利用Jenkins從github拉取代碼,並經過maven打包,部署到另外一臺服務器的docker容器中)java
a.一臺安裝了docker (用於部署程序)git
b.一臺安裝了maven jdk8 git (用於安裝jenkins,並拉取代碼,編譯打包)github
本文采用部署war包的方式安裝Jenkins,首先下載jenkins war包。web
$ wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
官方連接:docker
1.安裝嚮導: https://jenkins.io/zh/doc/book/installing/#setup-wizardshell
2.war包下載: http://mirrors.jenkins.io/war-stable/express
經過war包的方式啓動Jenkins的方式很簡單,直接使用java -jar命令就能夠啓動了,Jenkins默認端口是8080 若是須要指定端口能夠修改啓動參數centos
$ java -jar jenkins.war --httpPort=9090
啓動成功後會自動生成admin帳號以及密碼,第一次登陸時須要用到bash
訪問部署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.在【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 .
具體配置:
# 在遠程服務器上
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界面,說明部署成功。
新建一個【流水線】任務,建立好後直接編寫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進行說明:
補充說明經過Jenkins界面生成流水線腳本,以git腳本爲例(ssh腳本同理)
能夠參考官網語法:Jenkins官方語法介紹
能夠看到【階段視圖】
外部訪問成功(因爲虛擬機重啓,ip地址變動,這裏的ip地址與以前的ip地址不一樣,請讀者忽略這個問題)