Jenkins agent-Nodejs项目实践

前言

上篇说了基于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版本分别演示;

  1. jenkins--节点管理--配置pod模板。我这里配置两个模板用来标识nodejs16.0.0和nodejs12.20.2
4-node实践-模板1.png
  1. 模板配置与容器配置

两个pod模板区别只在于标签标识,容器名,镜像名的不用。其余设置都一样的

4-node实践-容器模板1.png
4-node实践-容器模板2.png
4-node实践-容器模板3.png

保存退出。

  1. 新建一个流水线
    大致写一下:
    依赖不同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系统管理-全局设置


5-node实践-ssh插件配置.png

6. 流水线代码生成

回到pipeline的job中,点击流水线语法,选择 Publish over SSH

5-node实践-ssh片段配置1.png
5-node实践-ssh片段配置2.png

生成的片段,覆盖之前的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的两个任务同时构建

6-node实践-结果1.png

结果成功


6-node实践-结果2.png

——————————————————————————————————————————————

注意事项:

a. 发送文件的形式,插件片段和原生ssh命令
b. 利用sshpublish,agent去执行的时候用账号密码认证最方便
c. 免密可以将宿主机提前打通,再用卷的形式将.ssh挂载到容器中
d. pipeline中引用变量需要注意""和'',如果在sh中引用jenkins上定义的变量sh用"";这其中如果在这个sh语句中在掺杂定义shell中的变量 需要加一个反斜杠\,如\${shell_var}

————————————————————————————————————————————————

To Do List :

  1. node构建时的依赖目录挂载出来,减少构建时间
  2. job的workspace挂载出来,省去每次都重新去拉代码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容