前言
上篇說了基于docker或k8s動(dòng)態(tài)創(chuàng)建agent的環(huán)境荠瘪,實(shí)際項(xiàng)目中針對(duì)后端java項(xiàng)目通過agent流水線進(jìn)行簡單發(fā)布茵休。這篇將對(duì)前端node項(xiàng)目發(fā)布展開
思路
- 安裝node環(huán)境
- 拉代碼
- yarn build構(gòu)建出靜態(tài)文件目錄
- 將構(gòu)建出來的目錄打成tar包
- 發(fā)送到遠(yuǎn)程機(jī)器(nginx)的上傳目錄下
- 備份遠(yuǎn)程機(jī)器(nginx)下此項(xiàng)目web目錄
- 將上傳目錄下的tar包解壓至web發(fā)布目錄--實(shí)現(xiàn)更新發(fā)布
基于以上步驟,如果jenkins本機(jī)去做部署造成,那需要jenkins宿主機(jī)需要有node環(huán)境才能打包的显熏,并且可能不同項(xiàng)目要用到不同版本的Nodejs,到時(shí)候還需要對(duì)版本進(jìn)行切換來使用晒屎。如果用Jenkins agent發(fā)布喘蟆,就能在一定程度上避免這些問題缓升。 啟用臨時(shí)node環(huán)境的agent容器做構(gòu)建,構(gòu)建完刪除蕴轨,不需要jenkins宿主機(jī)安裝node港谊。創(chuàng)建多個(gè)nodejs版本的pod模板,在不同項(xiàng)目中配置所需要的版本agent pod即可橙弱。
項(xiàng)目實(shí)踐
針對(duì)兩個(gè)項(xiàng)目health-tools(Node-16.0.0)和bottom-library(Node-12.20.2) 兩個(gè)node版本分別演示歧寺;
- jenkins--節(jié)點(diǎn)管理--配置pod模板。我這里配置兩個(gè)模板用來標(biāo)識(shí)nodejs16.0.0和nodejs12.20.2
- 模板配置與容器配置
兩個(gè)pod模板區(qū)別只在于標(biāo)簽標(biāo)識(shí)棘脐,容器名斜筐,鏡像名的不用。其余設(shè)置都一樣的
保存退出荆残。
- 新建一個(gè)流水線
大致寫一下:
依賴不同node版本的任務(wù)在調(diào)度時(shí)奴艾,只需 控制agentpod標(biāo)簽即可label 'node1600'
pipeline {
agent {
label 'node12202'
}
options {
skipDefaultCheckout()
}
environment {
BUILD_ENV = "beta"
APP_NAME = "bottom-library"
APP_ENV = "test"
GROUP = "eyun"
UPLOAD_DIR = "/mnt/opt/upload/${APP_ENV}/${GROUP}"
BACK_DIR = "${UPLOAD_DIR}/bakup/${APP_NAME}"
WEB_DIR = "/mnt/opt/web/${APP_ENV}/${GROUP}"
}
stages {
stage('get code'){
steps{
git branch: 'tianye-test', credentialsId: '248e1fa0-6165-4a81-8297-4107e413207c', url: 'https://gitlab.xxx.com/yiyun/bottom-library.git'
}
}
stage('npm build'){
steps{
container('node12202') {
sh 'yarn cache clean && yarn --update-checksums'
sh 'yarn config set registry https://registry.npm.taobao.org'
sh 'yarn'
sh 'yarn run build:${BUILD_ENV}'
}
}
}
stage('build tar package'){
steps{
script{
sh 'tar cf ${APP_NAME}.tar ${APP_NAME}'
}
}
}
stage('deploy to nginx-server'){
steps {
script{
sh 'ssh root@k8s011.test.hw "mkdir -p ${UPLOAD_DIR} ;mkdir -p ${BACK_DIR}; mkdir -p ${WEB_DIR}"'
sh 'scp ${APP_NAME}.tar root@k8s011.test.hw:${UPLOAD_DIR}'
sh 'ssh root@k8s011.test.hw "if [ -d ${WEB_DIR}/${APP_NAME} ];then mv ${WEB_DIR}/${APP_NAME} ${BACK_DIR}/$(date +%Y%m%d-%H%M%S);fi;cd ${UPLOAD_DIR} ; tar xf ${APP_NAME}.tar -C ${WEB_DIR}/"'
}
}
}
}
}
這里在最后一步可直接用shell寫,這樣需要自己提前在做一遍免密:將.ssh文件掛載到agent卷中内斯。
更好的方法是用插件Publish over SSH:
4.下載安裝插件Publish over SSH (略)
5. 配置遠(yuǎn)程機(jī)器
jenkins系統(tǒng)管理-全局設(shè)置
6. 流水線代碼生成
回到pipeline的job中蕴潦,點(diǎn)擊流水線語法,選擇 Publish over SSH
生成的片段俘闯,覆蓋之前的shell命令
stage('deploy to nginx-server'){
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'h5-agent-to-k8s011', sshCredentials: [encryptedPassphrase: '{AQAAABAAAAAg+IOUqK/AGVv8s+ZyE/Lxev25B6gxvMC1fr3L+dqa/QljF8a35njuiiT+zy17CFgg}', key: '', keyPath: '', username: 'root'], transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "mkdir -p ${UPLOAD_DIR} ${BACK_DIR} ${WEB_DIR};if [ -d ${WEB_DIR}/${APP_NAME} ];then DATE_FODER=`date +%Y%m%d-%H%M%S`;mv ${WEB_DIR}/${APP_NAME} ${BACK_DIR}/\${DATE_FODER};fi;cd ${UPLOAD_DIR}; tar xf ${APP_NAME}.tar -C ${WEB_DIR}/", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '${UPLOAD_DIR}', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '${APP_NAME}.tar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
}
}
7. 測試構(gòu)建
node1600和node12202的兩個(gè)任務(wù)同時(shí)構(gòu)建
結(jié)果成功
——————————————————————————————————————————————
注意事項(xiàng):
a. 發(fā)送文件的形式潭苞,插件片段和原生ssh命令
b. 利用sshpublish,agent去執(zhí)行的時(shí)候用賬號(hào)密碼認(rèn)證最方便
c. 免密可以將宿主機(jī)提前打通真朗,再用卷的形式將.ssh掛載到容器中
d. pipeline中引用變量需要注意""和'',如果在sh中引用jenkins上定義的變量sh用"";這其中如果在這個(gè)sh語句中在摻雜定義shell中的變量 需要加一個(gè)反斜杠\
,如\${shell_var}
————————————————————————————————————————————————
To Do List :
- node構(gòu)建時(shí)的依賴目錄掛載出來此疹,減少構(gòu)建時(shí)間
- job的workspace掛載出來,省去每次都重新去拉代碼