Jenkins agent-Nodejs項(xiàng)目實(shí)踐

前言

上篇說(shuō)了基于docker或k8s動(dòng)態(tài)創(chuàng)建agent的環(huán)境,實(shí)際項(xiàng)目中針對(duì)后端java項(xiàng)目通過(guò)agent流水線(xiàn)進(jìn)行簡(jiǎn)單發(fā)布。這篇將對(duì)前端node項(xiàng)目發(fā)布展開(kāi)

思路

  • 安裝node環(huán)境
  • 拉代碼
  • yarn build構(gòu)建出靜態(tài)文件目錄
  • 將構(gòu)建出來(lái)的目錄打成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)行切換來(lái)使用。如果用Jenkins agent發(fā)布,就能在一定程度上避免這些問(wèn)題。 啟用臨時(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版本分別演示;

  1. jenkins--節(jié)點(diǎn)管理--配置pod模板。我這里配置兩個(gè)模板用來(lái)標(biāo)識(shí)nodejs16.0.0和nodejs12.20.2
4-node實(shí)踐-模板1.png
  1. 模板配置與容器配置

兩個(gè)pod模板區(qū)別只在于標(biāo)簽標(biāo)識(shí),容器名,鏡像名的不用。其余設(shè)置都一樣的

4-node實(shí)踐-容器模板1.png
4-node實(shí)踐-容器模板2.png
4-node實(shí)踐-容器模板3.png

保存退出。

  1. 新建一個(gè)流水線(xiàn)
    大致寫(xiě)一下:
    依賴(lài)不同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寫(xiě),這樣需要自己提前在做一遍免密:將.ssh文件掛載到agent卷中。
更好的方法是用插件Publish over SSH:

4.下載安裝插件Publish over SSH (略)

5. 配置遠(yuǎn)程機(jī)器

jenkins系統(tǒng)管理-全局設(shè)置


5-node實(shí)踐-ssh插件配置.png

6. 流水線(xiàn)代碼生成

回到pipeline的job中,點(diǎn)擊流水線(xiàn)語(yǔ)法,選擇 Publish over SSH

5-node實(shí)踐-ssh片段配置1.png
5-node實(shí)踐-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. 測(cè)試構(gòu)建

node1600和node12202的兩個(gè)任務(wù)同時(shí)構(gòu)建

6-node實(shí)踐-結(jié)果1.png

結(jié)果成功


6-node實(shí)踐-結(jié)果2.png

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

注意事項(xiàng):

a. 發(fā)送文件的形式,插件片段和原生ssh命令
b. 利用sshpublish,agent去執(zhí)行的時(shí)候用賬號(hào)密碼認(rèn)證最方便
c. 免密可以將宿主機(jī)提前打通,再用卷的形式將.ssh掛載到容器中
d. pipeline中引用變量需要注意""和'',如果在sh中引用jenkins上定義的變量sh用"";這其中如果在這個(gè)sh語(yǔ)句中在摻雜定義shell中的變量 需要加一個(gè)反斜杠\,如\${shell_var}

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

To Do List :

  1. node構(gòu)建時(shí)的依賴(lài)目錄掛載出來(lái),減少構(gòu)建時(shí)間
  2. job的workspace掛載出來(lái),省去每次都重新去拉代碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容