Jenkins通過Pipeline流水線方式編譯前端項目的操作方法
本文記錄了本人在前端項目持續(xù)集成與自動化部署方面的實踐經(jīng)驗,使用 Jenkins 官方 jenkins:lts
鏡像為基礎(chǔ),構(gòu)建支持 Node.js 構(gòu)建和壓縮能力的運行環(huán)境,并通過聲明式 Pipeline 實現(xiàn)一套多環(huán)境(SIT/PROD)可選的一鍵部署流程。模板可直接參考最下方。
一、Jenkins 鏡像構(gòu)建
為滿足構(gòu)建前端項目的需求,需在 Jenkins 鏡像中安裝 Node.js、Yarn 以及 zip 命令,構(gòu)建用 Dockerfile 如下:
FROM jenkins/jenkins:lts USER root # 安裝 Node.js 和 Yarn RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \ apt-get install -y nodejs zip && \ npm install -g yarn # 設(shè)置國內(nèi) Yarn 源,加速依賴安裝 RUN yarn config set registry https://registry.npmmirror.com USER jenkins
二、Jenkins 插件安裝推薦
安裝 Jenkins 后,建議安裝以下插件以支持流水線、Node 構(gòu)建和遠(yuǎn)程部署功能:
Git Plugin
NodeJS Plugin
Yarn Plugin
Publish Over SSH
Build Name Setter
Pipeline
Blue Ocean
三、Jenkins 啟動配置(docker-compose)
使用 docker-compose
啟動 Jenkins,并配置數(shù)據(jù)持久化與宿主機(jī) Docker 訪問能力:
services: jenkins: image: d0fdd1f559e3 # 自定義鏡像 ID container_name: jenkins restart: on-failure:3 user: root ports: - "18080:8080" - "50000:50000" environment: TZ: Asia/Shanghai LANG: zh_CN.UTF-8 LANGUAGE: zh_CN:zh LC_ALL: zh_CN.UTF-8 volumes: - ./data:/var/jenkins_home - /usr/bin/docker:/usr/bin/docker - /var/run/docker.sock:/var/run/docker.sock - /etc/localtime:/etc/localtime:ro
四、前端自動部署 Pipeline
本流水線支持選擇部署環(huán)境(SIT 或 PROD),會自動選擇對應(yīng)分支、構(gòu)建命令與目標(biāo)服務(wù)器,核心流程包括:
拉取指定分支代碼
安裝依賴
構(gòu)建打包
壓縮構(gòu)建產(chǎn)物
上傳服務(wù)器并執(zhí)行部署腳本
?? 核心代碼片段如下:
parameters { choice(name: 'ENVIRONMENT', choices: ['sit', 'prod'], description: '請選擇部署環(huán)境') } environment { GIT_URL = 'http://192.168.1.100/xxx.git' GIT_CREDENTIAL_ID = '6c626e79-xxxx' SIT_BRANCH = 'sit' PROD_BRANCH = 'master' SIT_SERVER = '192.168.1.50' PROD_SERVER = '192.168.1.151' DEPLOY_PATH = '/home/web' DEPLOY_SCRIPT = 'deploy.sh' BUILD_DIR = 'dist' ZIP_FILE = 'dist.zip' }
?? 構(gòu)建流程關(guān)鍵步驟:
自動切換分支與目標(biāo)服務(wù)器: env.SELECTED_BRANCH = (params.ENVIRONMENT == 'sit') ? SIT_BRANCH : PROD_BRANCH env.TARGET_SERVER = (params.ENVIRONMENT == 'sit') ? SIT_SERVER : PROD_SERVER 構(gòu)建命令根據(jù)環(huán)境切換: def buildCmd = (params.ENVIRONMENT == 'sit') ? 'yarn run build:sit' : 'yarn run build:pro' sh "${buildCmd}" 構(gòu)建結(jié)果壓縮: cd dist && zip -r ../dist.zip . 上傳并部署: sshPublisher( configName: "${env.TARGET_SERVER}", transfers: [ sshTransfer( sourceFiles: "${ZIP_FILE}", remoteDirectory: "${DEPLOY_PATH}", execCommand: """ cd /home/${DEPLOY_PATH} bash ${DEPLOY_SCRIPT} """ ) ] )
五、部署腳本 deploy.sh(需提前準(zhǔn)備)
建議在目標(biāo)服務(wù)器 /home/web
目錄中準(zhǔn)備 deploy.sh
,執(zhí)行以下內(nèi)容(可按需定制):這里是簡單示例,可以自己修改腳本,添加備份等步驟
#!/bin/bash unzip -o dist.zip -d ./dist nginx -s reload # 若使用 nginx 提供服務(wù)
六、Pipeline流水線匯總參考
pipeline { agent any parameters { choice(name: 'ENVIRONMENT', choices: ['sit', 'prod'], description: '請選擇部署環(huán)境') } environment { GIT_URL = 'http://192.168.1.10/xxx.git' GIT_CREDENTIAL_ID = '6c626e79-856c-403e-a07b-96b8a40' SIT_BRANCH = 'develop' PROD_BRANCH = 'master' SIT_SERVER = '192.168.1.150' PROD_SERVER = '192.168.1.50' DEPLOY_PATH = 'home/web' DEPLOY_SCRIPT = 'deploy.sh' BUILD_DIR = 'dist' ZIP_FILE = 'dist.zip' // 壓縮文件的名稱 } stages { stage('拉取代碼') { steps { script { env.SELECTED_BRANCH = (params.ENVIRONMENT == 'sit') ? SIT_BRANCH : PROD_BRANCH env.TARGET_SERVER = (params.ENVIRONMENT == 'sit') ? SIT_SERVER : PROD_SERVER echo "當(dāng)前部署環(huán)境:${params.ENVIRONMENT}, 使用分支:${env.SELECTED_BRANCH}, 目標(biāo)主機(jī):${env.TARGET_SERVER}" checkout([$class: 'GitSCM', branches: [[name: "*/${env.SELECTED_BRANCH}"]], userRemoteConfigs: [[ url: "${env.GIT_URL}", credentialsId: "${env.GIT_CREDENTIAL_ID}" ]] ]) } } } stage('安裝依賴') { steps { sh 'yarn install' } } stage('構(gòu)建前端') { steps { script { def buildCmd = (params.ENVIRONMENT == 'sit') ? 'yarn run build:sit' : 'yarn run build:pro' echo "執(zhí)行構(gòu)建命令:${buildCmd}" sh "${buildCmd}" } } } stage('壓縮 dist 目錄') { steps { echo "壓縮 dist 目錄為 ${env.ZIP_FILE}" sh "cd dist && zip -r ../dist.zip ." } } stage('部署到前端服務(wù)器') { steps { echo "\033[32m****** 上傳并執(zhí)行部署 ******\033[0m" sshPublisher( publishers: [ sshPublisherDesc( configName: "${env.TARGET_SERVER}", transfers: [ // 上傳構(gòu)建產(chǎn)物 dist.zip sshTransfer( sourceFiles: "${ZIP_FILE}", removePrefix: '', remoteDirectory: "${DEPLOY_PATH}", // 相對 Jenkins SSH Remote Directory cleanRemote: false, execCommand: """ cd /home/${DEPLOY_PATH} bash ${DEPLOY_SCRIPT} """ ) ], verbose: true ) ] ) } } stage('完成') { steps { echo "? ${params.ENVIRONMENT} 環(huán)境部署完成" } } } post { success { echo "?? 發(fā)布成功:${params.ENVIRONMENT} 環(huán)境" } failure { echo "? 發(fā)布失敗,請檢查日志" } } }
后續(xù)可進(jìn)一步集成:
自動通知(釘釘、企業(yè)微信)
構(gòu)建緩存機(jī)制
部署灰度策略等
到此這篇關(guān)于Jenkins通過Pipeline流水線方式編譯前端項目的文章就介紹到這了,更多相關(guān)Jenkins Pipeline流水線內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Jenkins Pipeline中Docker鏡像構(gòu)建與推送的常見問題及解決方案
- jenkins如何通過pipeline部署springboot項目
- Jenkins遷移之pipeline共享庫的實踐示例
- jenkins插件Pipeline腳本jenkinsfile操作指南
- 構(gòu)建及部署jenkins?pipeline實現(xiàn)持續(xù)集成持續(xù)交付腳本
- jenkins 構(gòu)建項目之 pipeline基礎(chǔ)教程
- Jenkins Pipeline 部署 SpringBoot 應(yīng)用的教程詳解
- 使用Jenkins Pipeline自動化構(gòu)建發(fā)布Java項目的方法
相關(guān)文章
超好用的免費內(nèi)網(wǎng)穿透工具【永久免費不限制流量】
對于開發(fā)人員來講,演示內(nèi)網(wǎng)web站點、本地開發(fā)微信公眾號、小程序開發(fā)、調(diào)試第三方支付系統(tǒng)對接等開發(fā)環(huán)境,往往需要一個環(huán)境可以進(jìn)行調(diào)試,市面上內(nèi)網(wǎng)穿透工具有很多,這里推薦一款簡單又好用的cpolar,可以永久免費使用,不限制流量,支持http/https/tcp協(xié)議2022-09-09詳細(xì)介紹 進(jìn)程、線程和協(xié)程的區(qū)別
這篇文章主要介紹了詳細(xì)介紹 進(jìn)程、線程和協(xié)程的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-03-03大數(shù)據(jù)HelloWorld-Flink實現(xiàn)WordCount
這篇文章主要介紹了大數(shù)據(jù)HelloWorld-Flink實現(xiàn)WordCount的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08Grafana window下載安裝及influxdb集成配置的實現(xiàn)
本文主要介紹了Grafana window下載安裝及influxdb集成配置的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05最新WebStorm2020.2注冊碼永久激活(激活到2089年)
JetBrains旗下有多款編譯器工具(如:IntelliJ、WebStorm、PyCharm等)在各編程領(lǐng)域幾乎都占據(jù)了壟斷地位。今天給大家?guī)淼氖菍ebStorm最新版激活至2089年2020-09-09