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挂载出来,省去每次都重新去拉代码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容