前言
上篇说了基于docker或k8s动态创建agent的环境,实际项目中针对后端java项目通过agent流水线进行简单发布。这篇将对前端node项目发布展开
思路
- 安装node环境
- 拉代码
- yarn build构建出静态文件目录
- 将构建出来的目录打成tar包
- 发送到远程机器(nginx)的上传目录下
- 备份远程机器(nginx)下此项目web目录
- 将上传目录下的tar包解压至web发布目录--实现更新发布
基于以上步骤,如果jenkins本机去做部署,那需要jenkins宿主机需要有node环境才能打包的,并且可能不同项目要用到不同版本的Nodejs,到时候还需要对版本进行切换来使用。如果用Jenkins agent发布,就能在一定程度上避免这些问题。 启用临时node环境的agent容器做构建,构建完删除,不需要jenkins宿主机安装node。创建多个nodejs版本的pod模板,在不同项目中配置所需要的版本agent pod即可。
项目实践
针对两个项目health-tools(Node-16.0.0)和bottom-library(Node-12.20.2) 两个node版本分别演示;
- jenkins--节点管理--配置pod模板。我这里配置两个模板用来标识nodejs16.0.0和nodejs12.20.2
- 模板配置与容器配置
两个pod模板区别只在于标签标识,容器名,镜像名的不用。其余设置都一样的
保存退出。
- 新建一个流水线
大致写一下:
依赖不同node版本的任务在调度时,只需 控制agentpod标签即可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. 配置远程机器
jenkins系统管理-全局设置
6. 流水线代码生成
回到pipeline的job中,点击流水线语法,选择 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. 测试构建
node1600和node12202的两个任务同时构建
结果成功
——————————————————————————————————————————————
注意事项:
a. 发送文件的形式,插件片段和原生ssh命令
b. 利用sshpublish,agent去执行的时候用账号密码认证最方便
c. 免密可以将宿主机提前打通,再用卷的形式将.ssh挂载到容器中
d. pipeline中引用变量需要注意""和'',如果在sh中引用jenkins上定义的变量sh用"";这其中如果在这个sh语句中在掺杂定义shell中的变量 需要加一个反斜杠\
,如\${shell_var}
————————————————————————————————————————————————
To Do List :
- node构建时的依赖目录挂载出来,减少构建时间
- job的workspace挂载出来,省去每次都重新去拉代码