一、Jenkins構(gòu)建pipeline項(xiàng)目
pipeline是一套jenkins官方提供的插件,它可以用來在jenkins中實(shí)現(xiàn)和集成連續(xù)交付。
pipeline定義了完成過一個CI/CD流程的步驟,通過執(zhí)行這個流程代替手工自動去完成CI/CD,這個流程是由使用者自己定義的,整個流程主要有agent、param、stage三部分組成。
stage 定義了在整個 pipeline 中執(zhí)行的概念上不同的任務(wù)子集
agent指示Jenkins為整個管道分配執(zhí)行器(在節(jié)點(diǎn)上)和工作區(qū)。
param是為整個流程提供參數(shù)的。比如你使用git進(jìn)行代碼管理,你需要構(gòu)建某個流程,這時候你只要在構(gòu)建的時候指定分支參數(shù)就可以構(gòu)建項(xiàng)目。
1、Jenkins頁面創(chuàng)建pipeline項(xiàng)目


2、GitLab上創(chuàng)建pipeline腳本文件


pipeline腳本如下:
pipeline{
agent any
parameters {
gitParameter name: 'git_version',
branchFilter: 'origin/(.*)',
type: 'PT_TAG',
defaultValue: 'v1.0',
description: '發(fā)布新版本'
choice(name: 'choice', choices: ['publish','rollback'],description: 'publish: 發(fā)布版本\nrollback: 回滾版本')
}
stages{
stage("下載代碼"){
steps{
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@10.0.0.200:dev/gitlab_test.git']]])
}
}
stage("檢測代碼"){
steps{
sh "/opt/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectName=${WORKSPACE} \
-Dsonar.projectKey=html \
-Dsonar.sources=."
}
}
stage("是否部署"){
steps{
input message: '確定要部署嗎?', ok: 'ok'
}
}
stage("部署代碼"){
steps{
sh "sh -x /server/scripts/jenkins.sh"
}
}
}
post {
success {
dingTalk accessToken: '878146e038041b550825b079049cafdf2db77b88221a81a75c9c684b42c80cc8', imageUrl: '', jenkinsUrl: '', message: 'pipeline構(gòu)建成功', notifyPeople: ''
}
failure {
dingTalk accessToken: '878146e038041b550825b079049cafdf2db77b88221a81a75c9c684b42c80cc8', imageUrl: '', jenkinsUrl: '', message: 'pipeline構(gòu)建失敗', notifyPeople: ''
}
}
}
部署代碼腳本如下:
vim /server/scripts/jenkins.sh
#!/bin/bash
CODEDIR=/html
IP=172.16.1.7
TAR_CODE(){
cd ${WORKSPACE}
tar zcf /opt/${git_version}.tar.gz ./* ‐‐exclude=.git ‐‐exclude=Jenkins_pipeline
}
SCP_CODE(){
ssh ${IP} "mkdir ${CODEDIR}/${git_version} -p"
scp /opt/${git_version}.tar.gz ${IP}:${CODEDIR}/${git_version}
}
XF(){
ssh ${IP} "cd ${CODEDIR}/${git_version} && tar xf ${git_version}.tar.gz && rm -rf ${git_version}.tar.gz"
}
CREATE_LN(){
ssh ${IP} "cd ${CODEDIR} && rm -rf www && ln -s ${git_version} www"
}
main(){
if [[ "${choice}" == "publish" ]];then
if [[ "$GIT_COMMIT" == "GIT_PREVIOUS_SUCCESSFUL_COMMIT" ]];then
echo "構(gòu)建失敗,該版本已發(fā)布"
else
TAR_CODE
SCP_CODE
XF
CREATE_LN
fi
else
CREATE_LN
fi
}
main
3、配置pipeline項(xiàng)目


4、測試pipeline項(xiàng)目是否能正常運(yùn)行



二、Jenkins設(shè)置節(jié)點(diǎn)
需要準(zhǔn)備一臺新的服務(wù)器,本文將SonarQube服務(wù)器作為slave節(jié)點(diǎn)
Jenkins其實(shí)自帶分布式特性,是Master/Slave的模型。在Master上分配任務(wù),然后在Slave或者M(jìn)aster上完成。這個特性帶來兩個好處:(1)能夠有效分擔(dān)主節(jié)點(diǎn)上的壓力,加快構(gòu)建速度;(2)能夠指定特定的任務(wù)在特定的主機(jī)上進(jìn)行。
節(jié)點(diǎn)服務(wù)器不需要安裝jenkins(只需要運(yùn)行一個slave節(jié)點(diǎn)服務(wù)),構(gòu)建事件的分發(fā)由master端(jenkins主服務(wù))來執(zhí)行。
1、遠(yuǎn)程復(fù)制將Jenkins主機(jī)上的相關(guān)文件
[root@jenkins test]# ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.8
[root@jenkins test]# scp -r /opt/sonar-scanner/ 172.16.1.8:/opt
[root@jenkins test]# scp -r /opt/maven/ 172.16.1.8:/opt
[root@jenkins test]# ssh 172.16.1.8 "mkdir -p /server/scripts"
[root@jenkins test]# scp /server/scripts/* 172.16.1.8:/server/scripts
2、節(jié)點(diǎn)服務(wù)器進(jìn)行相關(guān)操作
[root@sonarqube ~]# ssh-keygen
[root@sonarqube ~]# ssh-copy-id -i .ssh/id_rsa.pub 172.16.1.7 #與web服務(wù)器建立密鑰連接
[root@sonarqube ~]# cd /opt
[root@sonarqube opt]# rpm -ivh jdk-8u181-linux-x64.rpm
[root@sonarqube opt]# mkdir jenkins
3、在Jenkins管理中新建節(jié)點(diǎn)


4、配置從節(jié)點(diǎn)

5、檢查是否連接成功

6、修改流水線腳本進(jìn)行測試

7、在GitLab上添加slave節(jié)點(diǎn)的部署密鑰



8、進(jìn)入Jenkins項(xiàng)目添加私鑰



9、點(diǎn)擊構(gòu)建查看執(zhí)行狀態(tài)

