背景
相信長期在做小程序的同學(xué)都有過以下經(jīng)歷:
1.只有固定的幾臺機(jī)器能發(fā)版蘸吓,換臺機(jī)器總擔(dān)心出現(xiàn)點問題 (心力成本)
2.多個小程序發(fā)版宣蠕,切換多個倉庫,甚至要用開發(fā)者工具去打開不同的項目(體力成本)
3.頻繁發(fā)版 + 發(fā)版流程瑣碎 + 可能存在的多個小程序,一天的時間被機(jī)械勞動的事耗掉半天(時間成本)
本文主要來分享一下我這邊的一套解決登澜,實現(xiàn)一鍵發(fā)布,統(tǒng)一管理飘庄,在讀之前最好先看下上一篇文章脑蠕,不然可能會有些阻礙(http://www.reibang.com/p/fb521576bd56)
關(guān)于jenkins:https://www.jenkins.io/zh/
一、大綱
整個pipeline計劃做到的事情
1.拉取代碼
2.詢問當(dāng)前需要變更的版本號
3.構(gòu)建(gulp, webpack跪削,npm)
4.更改后的版本文件提交到git倉庫
二空郊、創(chuàng)建software project
首先我們打開jekins,創(chuàng)建一個software project
然后創(chuàng)建一個任務(wù), 這里選擇流水線(有興趣可以了解下其他項)切揭, 點擊確定
點擊流水線找到編輯script的地方
這里可以選擇在服務(wù)器上編寫狞甚,還是從項目代碼中讀取jenkinsfile文件,我這里為了方便調(diào)試直接在jenkins機(jī)器上編寫了
pipeline script
流水線語法官方教程: https://www.jenkins.io/zh/doc/book/pipeline/廓旬,里面講的比較詳細(xì)哼审,可以先按下面的代碼運行,遇到問題再查教程
三孕豹、流水線結(jié)構(gòu)
寫流水線之前涩盾,先想好我們整個發(fā)布流程需要做什么?
以當(dāng)前例的話励背,大致分為5個環(huán)節(jié):
1.拉取代碼
2.詢問需要更改的版本號
3.安裝npm包
4.執(zhí)行發(fā)布
5.提交修改的版本號信息到倉庫
每一個環(huán)節(jié)都是一個stage春霍,先把stage列好,接下來我們一個一個補充
agent any
stages {
// 拉取git代碼
stage('git pull') {
steps {
}
}
// 詢問當(dāng)前版本信息
stage('inquirer version') {
steps {
}
}
// 構(gòu)建
stage('build') {
steps {
}
}
// 推送版本信息到git倉庫
stage('push version2git') {
steps {
}
}
}
}
四叶眉、流水線語法
很多插件的語法使用還是比較復(fù)雜和瑣碎的址儒,這里提供了一個自動生成pipieline語法的功能
以git為例,會自動生成相應(yīng)的語法衅疙,避免很多查文檔的時間
示例步驟選擇git,填寫我們的Git倉庫莲趣,這時會顯示連接不上git。
五饱溢、拉取git倉庫代碼
根據(jù)上文所述喧伞,我們需要生成流水線腳本,但是想要讓倉庫和jenkins建立ssh鏈接绩郎,需要配置git倉庫的公鑰和jenkins的私鑰憑據(jù)潘鲫。
本次示例我用的是coding倉庫。
1. 配置git倉庫公鑰
2. 配置jenkins私鑰
除了在git上配置公鑰外肋杖,還需要在jenkins上配置下憑據(jù)溉仑,點擊添加
選擇類型為ssh username,其他input的可以自己定一下的兽愤,這里需要一下彼念,關(guān)于private項填的是私鑰挪圾,需要復(fù)制id_rsa的內(nèi)容,填寫完成后點擊添加逐沙,并在 Credentials 一欄選擇填入私鑰
當(dāng)前頁面沒有顯示紅色提示 表示添加成功~
3.pipeline code
// 拉取git代碼
stage('git pull') {
steps {
git branch: 'master', credentialsId: '1', url: 'git@e.coding.net:lucky_lucy/test/xxxxxxxxx.git'
}
}
添加到指定位置后哲思,點擊保存,嘗試構(gòu)建一次查看是否成功吩案,點左下角#5可以查看當(dāng)前構(gòu)建進(jìn)程
點擊console output可以查看當(dāng)前l(fā)og棚赔,workspaces可以查看當(dāng)前工作空間
可以看到當(dāng)前工作空間為倉庫代碼
六、詢問當(dāng)前版本信息
jenkins是不支持交互式命令的徘郭,所以需要換一種實現(xiàn)靠益,查了下文檔jenkins是有api支持的,方法名為 input残揉,不過在進(jìn)行調(diào)用之前需要獲取之前的版本信息胧后,即讀取version.config.json這個文件,整體代碼如下:
// 詢問當(dāng)前版本信息
stage('inquirer version') {
steps {
script {
// 讀取版本信息
def versionJson = readJSON file: './version.config.json', text: ''
// 設(shè)置問題描述
def userInput = input(
id: 'versionInput',
message: '請設(shè)置版本信息',
parameters: [
[defaultValue: versionJson.version, description: '設(shè)置版本號', name: 'VERSION', $class: 'TextParameterDefinition'],
[defaultValue: 'jenkins CI is upload trial version as: ' + new Date().format('yyyy-MM-dd HH:mm:ss'), description: '設(shè)置版本描述(please use english)', name: 'VERSIONDESC', $class: 'TextParameterDefinition']
])
// 設(shè)置全局變量
env.VERSION = userInput.VERSION;
env.VERSIONDESC = userInput.VERSIONDESC;
// 重寫本地版本文件(為后續(xù)進(jìn)行版本提交做準(zhǔn)備)
writeJSON file: './version.config.json', json: [version: env.VERSION, versionDesc: env.VERSIONDESC], pretty: 4;
}
}
}
運行下, 會發(fā)現(xiàn)會提示等待抱环,鼠標(biāo)點擊后彈出模態(tài)框壳快,可以看到里面有從本地文件里提取出來的上個版本的信息,手動修改下即可
注意:readJSON和 writeJSON方法依賴 Pipeline Utility Steps(https://plugins.jenkins.io/pipeline-utility-steps) 這個插件镇草,沒有的話會出現(xiàn)入下圖報錯
然后去jenkins的插件管理 安裝這個插件
然后重新構(gòu)建眶痰,你填寫版本信息后點擊繼續(xù),就表示這步可以成功進(jìn)行了
七梯啤、執(zhí)行構(gòu)建
這里實際都是構(gòu)建流程竖伯,直接統(tǒng)一用一個“build stage” 即可, 這里步驟很簡單因宇,可以想一下從git clone下來一個項目應(yīng)該干什么七婴,這里實際就是在做這樣一件事情
stage('build') {
steps {
sh "npm install"
sh "npm run build"
}
}
不過這里依賴node環(huán)境,需要先處理下羽嫡,不然會報npm not found
1.安裝nodejs環(huán)境
這里的運行環(huán)境和本機(jī)沒有關(guān)系本姥,類似于一個沙盒,所以如果要安裝node環(huán)境需要安裝Config File Provider Plugin和NodeJS Plugin這兩個插件
2.配置全局工具
安裝完成后添加全局工具杭棵,找到"系統(tǒng)管理 -> 全局工具配置 -> NodeJS" ,點擊nodejs安裝氛赐,默認(rèn)項即可魂爪,點擊保存,重啟jenkins服務(wù)艰管,回到服務(wù)器滓侍,輸入命令 service jenkins restart
3.pipeline code
// 構(gòu)建
stage('build') {
steps {
sh "npm install -g yarn"
sh "yarn install"
sh "yarn wxci:upload"
}
}
4.上傳成功
這時候如果沒問題的話代碼應(yīng)該已經(jīng)發(fā)布到體驗版了,
這里如果報ip錯誤記得去微信公眾后臺添加一下上傳的ip白名單
八牲芋、提交新的版本號信息到倉庫
1.pipeline code
基本就是將之前手動輸入的命令寫到腳本里
// 推送版本信息到git倉庫
stage('push version2git') {
steps {
sh "git config --local user.name ${GIT_USER_NAME} && git config --local user.email ${GIT_USER_EMAIL}"
sh "git add version.config.json"
sh "git commit -m 'docs: 更改版本號為${VERSION}'"
sh "git push origin ${BRANCH_NAME}"
}
}
關(guān)于上面代碼中的"${}"撩笆,其實是預(yù)設(shè)的環(huán)境變量捺球,我們可以把一些固定的東西提出來,避免硬編碼夕冲,例如:
pipeline {
agent any
// 環(huán)境變量
environment {
GIT_USER_NAME = 'jenkinsCI'
GIT_USER_EMAIL = 'test@163.com'
GIT_ADDRESS = 'git@github.com:jinxuanzheng01/blog-xcx-ci-demo.git'
BRANCH_NAME = 'master'
}
}
2.更改jenkins賬號權(quán)限
直接進(jìn)行push的話氮兵,git會報權(quán)限不足,這里倒不是因為ssh秘鑰有問題歹鱼,而是jenkins在執(zhí)行的時候使用的不是linux機(jī)器的root權(quán)限泣栈,而是一個jenkins的賬號
3.運行pipeline
重新構(gòu)建,jenkins無報錯弥姻,查看git倉庫南片,執(zhí)行成功
九、Running success
到此為止,整個pipeline已經(jīng)work,你可以很輕松的嘗試一鍵發(fā)布小程序秀姐。
尤其是有多個小程序項目的時候桅咆,可以單獨建個分組,方便集中管理赠尾,再也不需要手動切入不同的倉庫,甚至使用小程序開發(fā)者工具去打開各個小程序。