CICD:Jenkins入門和使用


最近,我們使用的開發服務器被回收了,換了一台新的服務器,CI/CD平台需要重新搭建。
我的運維能力一直薄弱,所以借此機會學習了一番如何使用Jenkins進行持續集成開發和部署,實踐並踩了一些坑,在此記錄一下。

引言

假如沒有CI/CD平台

想要部署到服務器,我們需要本地打包上傳至服務器,或上傳源碼至服務器上打包,覆蓋原來的安裝包,進行部署。

當所需要部署的只是一個jar包或者只是一個服務,並且代碼不經常更新,這樣是可以的。但是開發過程中,更常見的是代碼經常迭代更新,並且項目中有多個組件。
這帶來了大量的機械重復勞動,打包、上傳、構建、測試、發布,如果都由人工操作,很容易混淆代碼版本、不易跟蹤異常。如果代碼有多個分支版本,需要應對多個測試/生產環境,勞動量會指數級別飆升,到人無法承受的地步。
而Jenkins提供了解決方案,使我們可以一勞永逸地應對部署。

Jenkins可以做什么

它的流水線操作正如其名,將機械的工作流程提煉出來,重復執行,可以定義成定時操作,可以定義觸發條件,可以填寫參數,可以寫入控制語句。
代替我們完成:
1、拉取源碼至服務器(與代碼管理平台直接集成,可集成gitlab/svn等)
2、打包源碼(可選擇使用maven、nodeJS等等打包工具)
3、測試
4、准備環境
5、發布
總之,一切需要的工作,都可以定義成流水線里的一個流程。

Jenkins搭建與配置

本次安裝的Jenkins是Jenkins中文社區提供的中文鏡像版,不僅做了漢化,Jenkins可以靈活使用的1500多個插件也提供了國內的鏡像地址,安裝只需要一條docker指令。

1、環境准備

1、查看系統版本,預留空間和Jenkins運行端口
2、安裝docker

2、快速開始

  • 創建容器

docker run -d -v /jenkins_home:/var/jenkins_home -u 0 -p 8786:8080  --name jenkins jenkinszh/jenkins-zh

指令解釋:
-d: 后台運行
-v:將Jenkins主目錄掛在出來
-u 0 :將系統用戶傳入(0為root用戶),避免一些權限問題
-p :指定映射到宿主機的端口,如果8786端口被占用也可以使用其他端口
--name:指定運行容器名稱為jenkins
jenkinszh/jenkins-zh Jenkins中文社區提供的鏡像名稱,docker會檢測本地有無該鏡像,如果沒有,會自動拉取。

  • docker logs jenkins 查看日志

運行之后,訪問宿主機ip+ 8786(指定端口),看到Jenkins初始頁面。
Jenkins初始頁面

Jenkins創建成功!

3、初始化

稍微等待之后,自動跳轉至管理員登錄頁面。

管理員登陸頁面

創建容器時我們已經將該目錄掛載到宿主機了,所以可以直接訪問映射出的文件:
cat /jenkins_home/secrets/initialAdminPassword

也可以使用docker exec指令訪問容器內文件:
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
輸入密碼,登陸進入新手入門頁面。
新手入門
選擇安裝推薦插件。
如果有安裝失敗的,可以點擊繼續,直接跳過,進入Jenkins管理頁面,等待后續使用時再進行安裝。
插件安裝頁面,因為網速原因經常失敗,重試幾次即可

4、新建聲明式流水線

點擊左側新建item,可以創建新的任務,如下圖所示。

創建流水線任務

選擇流水線。

現在就可以創建流水線,用於部署正在開發的項目了。

5、常用流水線 + 工具 +插件 使用及配置

流水線語法請參考:

如何使用聲明式流水線
可以使用Jenkins自帶的流水線語句生成工具來輔助編寫:
生成語句工具

插件和其他配置均為可選,根據使用需求靈活安裝。
在此記錄一些插件/工具,並給出它們在流水線腳本中的使用范例。、

一、集成git/gitlab

  • 配置憑據用於登陸驗證gitlab
    配置憑據
  • 參考語法
steps {
	git branch: 'dev', credentialsId: '***', url: 'https://git.***.git'
}

將創建好的憑據填入。

二、maven/nodeJS等構建工具使用

  • 工具安裝和配置
    在全局工具配置中配置NodeJS和Maven
    工具配置,指定環境變量

  • 使用maven打包

steps {
    script {
     sh "mvn clean install -Dmaven.test.skip=true -Plinux"
    }
}

  • 使用ln -s指令支持腳本中運行
    若執行時報錯無mvn指令(或npm、cnpm等),說明jenkins在/usr/local/bin目錄下沒有找到相應的指令。可以通過建立軟連接方式實現支持。
    /usr/local/bin下的軟連接
    可以將宿主機的工具包直接放入掛載目錄,進行映射,也可以在工具配置中選擇自動下載,在Jenkins內中再次安裝。

三、連接其他機器/執行腳本

  • 容器內
    直接使用下列流水線語言格式即可。
 script {
     sh "***"
    }
  • 執行宿主機內腳本
    (1)掛載進入容器內部
    缺點:若腳本運行環境和操作內容是宿主機文件,該方法無法實現。
    (2)使用ssh
  • 語句使用
    開啟免密校驗,使用 sh "ssh -o StrictHostKeyChecking=no -l root ${IP} '****'"格式的指令。
    注意指令格式為雙引號內套單引號,單引號內為希望在宿主機執行的指令
  • 插件使用
  • SSH Pipeline Step
    根據示例,可得,事先添加好憑據之后,很容易在指定ip上(包括宿主機)執行文件傳輸、腳本執行等操作。
def host = [:]
host.name = "host"
host.host = ""
host.allowAnyHosts = true
 
node {
    withCredentials([usernamePassword(credentialsId: '', passwordVariable: 'password', usernameVariable: 'userName')]) {
        host.user = userName
        host.password = password
        stage("SSH Steps Rocks!") {
            writeFile file: 'test.sh', text: 'ls'
            sshCommand remote: host, command: 'for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done'
            sshScript remote: host, script: 'test.sh'
            sshPut remote: host, from: 'test.sh', into: '.'
            sshGet remote: host, from: 'test.sh', into: 'test_new.sh', override: true
            sshRemove remote: host, path: 'test.sh'
        }
    }
}

構建結果
構建結果

  • Publish Over SSH
    安裝Publish Over SSH插件
    在Jenkins管理/系統管理/PublishOverSSH的相關配置中配置所需要的宿主機IP、用戶、密碼等等信息
    配置SSH Server
    可以在展開的高級設置中配置SSH服務器。
    查看Publis-Over-Server 插件說明獲取高級用法。

四、集成docker

因為我們的Jenkins服務是作為docker容器運行的,所以需要在容器內調用docker命令。
容器內調用docker命令有兩種:

原理說明:
Docker采用的是Client/Server架構,我們常用的docker命令只是docker client,通過該命令行執行命令的時候,實際是通過client與docker engine通信。
默認情況下,Docker的守護進程會生成一個socket(/var/run/docker.sock)文件來進行本地進程通信,智是UNIX域套接字,可以通過文件系統(而非網絡地址)進行尋址訪問。

根據上述原理,我們可以通過掛載宿主機socket文件進入Jenkins,使Jenkins可以使用宿主機docker命令。

  • 直接使用第四點中的SSH用法執行:
 sshCommand remote: host, command: 'docker *** '

五、生成歸檔文件

示例:

pipeline {
    
    agent any

 stages {
     
     stage("build"){
         steps{
             sh 'touch archive.jar'
         }
         
     }
     
     stage('archive') {  
            steps {
                archiveArtifacts artifacts: 'archive.jar', fingerprint: true 
            }
    }}
}

在build過程中生成歸檔文件,在archive過程中歸檔。
運行結果

在此頁面上可以直接下載歸檔好的文件。

其他(待補充)

1、配置時區
打開系統管理/命令行,運行:
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM