Jenkins學習筆記
Jenkins是一個開源軟體專案,是基於Java開發的一種持續整合工具,用於監控持續重複的工作。說白了就是減少人工的干預 利用軟體去完成自動化構建的任務,比如web應用釋出,一些php/java/js等語言開發的專案 開發完成後需要部署到遠端伺服器上 從開發者提交程式碼至git上後,一切的事情都有Jenkins去完成。這就是企業中所說的的持續整合(CI),另外還有持續交付(CD) 持續部署(CD)
安裝
安裝方式有rpm包和war包 這2中比較普遍。這裡採用的是rpm
- 持續整合(Continunous Integration:CI) 程式碼合併,構建,部署,測試都在一起,不斷的執行這個過程,並對結果反饋
持續交付(Continunous Delivery:CD) 部署到生產環境,給使用者使用
持續部署(Continunous Deployment:CD) 部署到生產環境
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key yum install jenkins -y systemctl start jenkins
開啟瀏覽器訪問 http://172.16.113.146:8080
可以看到 密碼儲存在 /var/lib/jenkins/secrets/initiaAdminPassword 下
可以按自己的需求定義外掛 這裡就安裝預設外掛
常用外掛
使用者許可權管理
外掛:Role-based Authorization Strategy
設定許可權之前 先允許註冊新使用者 系統管理 >> 全域性安全配置 >> 安全域 >> 允許新使用者註冊
開啟系統管理 進入 Manage and Assign Roles 進入角色許可權配置介面
通過角色的許可權 來控制使用者的許可權 Global roles: 全域性角色 User:即為新建立的角色 一般來說只需要一個讀取許可權即可 admin: 預設建立 管理員使用
Project roles:專案角色 Team-A: A-.* # 匹配A開頭的每個專案 Team-B: B-.* # 配配B開頭的每個專案 (之後將使用者新增到專案組裡即可)
將新註冊的使用者 新增到角色中和專案組中
引數化構建 外掛:Extended Choice Parameter 新增引數化構建過程 密碼引數及文字引數 為常用
Git Parmeter 顯示git分支(結合前面定義的引數化構建的branch來使用)
Jenkins slave ( 子節點需要有java環境)
遠端工作目錄 /var/lib/jenkins 啟動方式SSH 新增使用者名稱密碼 認證方式 Manually trusted key Verification Strategy 構建專案中配置 限制專案的執行節點 填上slave標籤名 就可以指定節點構建
pipeline 流水線構建
pipeline構建 其他配置很少 基本都寫在腳本里 node節點 拉取git程式碼 釋出編譯等等… 下圖就是 構建的過程及展示,每個步驟全都分開 並提供日誌檢視
pipeline的核心概念: node:節點 一個node就是一個jenkins節點,或者是master,或者是agent,是執行step的菌體環境
step:步驟 step是一個最基本的操作單元,由各類jenkins plugin提供
stage:階段 一個pipeline可以劃分為若干個stage,每個stage代表一組操作,例如build,test,deploy stage是一個邏輯分組的概念,可以跨多個node
官方提供的github示例指令碼語法:
node { // 如果在從節點構建 在這裡宣告 def mvnHome stage('Preparation') { // stage是步驟 這是拉取git程式碼 git 'https://github.com/jglick/simple-maven-project-with-tests.git' mvnHome = tool 'M3' } stage('Build') { //構建 if (isUnix()) { sh "'${mvnHome}/bin/mvn' -Dmaven.test.failure.ignore clean package" } else { bat(/"${mvnHome}\bin\mvn" -Dmaven.test.failure.ignore clean package/) } } stage('Results') { // 結果/打包 junit '**/target/surefire-reports/TEST-*.xml' archive 'target/*.jar' } }
也可以將指令碼放到git上 便於指定
# 這是一個以wordpress為例的指令碼: node ("slave-172.16.113.149") { stage('git checkout') { checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submodu leCfg: [], userRemoteConfigs: [[url: '[email protected]:/home/git/repos/wordpress.git']]]) } stage('code copy') { sh '''rm -rf ${WORKXPACE}/.git cp -rf /usr/share/nginx/html /data/backup/html-$(date +"%Y-%m-%d") rm -rf /usr/share/nginx/html/* cp -rf ${WORKSPACE} /usr/share/nginx/html echo "ok" >> /usr/share/nginx/html/A-pipeline-wp/status.html''' } stage('test') { sh '''curl http://wps.qxfell.com/status.html''' } }
# 這是一個以maven構建的指令碼例子: node ("slave-172.16.113.147") { stage('git checkout') { checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submodu leCfg: [], userRemoteConfigs: [[url: '[email protected]:/home/git/repos/solo.git']]]) } stage('maven build') { sh ''' echo $(hostname) export JAVA_HOME=/usr/local/jdk8u45 /usr/local/maven-3.5/bin/mvn clean package -Dmaven.test.skip=true''' } stage('deploy') { sh '''export JAVA_HOME=/usr/local/jdk8u45 JENKINS_NODE_COOKIE=dontkillme TOMCAT_NAME=tomcat8 TOMCAT_HOME=/usr/local/$TOMCAT_NAME WWWROOT=$TOMCAT_HOME/webapps/ROOT [ -d $WWWROOT ] && mv $WWWROOT /data/backup/${TOMCAT_NAME}-$(date +"%Y-%m-%d") rm -rf $WWWROOT/* unzip ${WORKSPACE}/target/*.war -d $WWWROOT PID=$(ps -ef | grep catalina | grep -v "grep" | awk \'{print $2}\') [ -n "$PID" ] && kill -9 $PID /bin/bash $TOMCAT_HOME/bin/startup.sh echo "ok" >> $WWWROOT/status.html''' }