微信小程序CI機(jī)器人云構(gòu)建詳解(二)之jenkins一鍵發(fā)布

背景

相信長期在做小程序的同學(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

image

然后創(chuàng)建一個任務(wù), 這里選擇流水線(有興趣可以了解下其他項)切揭, 點擊確定

image

點擊流水線找到編輯script的地方

image

這里可以選擇在服務(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語法的功能


image.png

以git為例,會自動生成相應(yīng)的語法衅疙,避免很多查文檔的時間


image.png

示例步驟選擇git,填寫我們的Git倉庫莲趣,這時會顯示連接不上git。

五饱溢、拉取git倉庫代碼

根據(jù)上文所述喧伞,我們需要生成流水線腳本,但是想要讓倉庫和jenkins建立ssh鏈接绩郎,需要配置git倉庫的公鑰和jenkins的私鑰憑據(jù)潘鲫。
本次示例我用的是coding倉庫。

1. 配置git倉庫公鑰

image.png

2. 配置jenkins私鑰

除了在git上配置公鑰外肋杖,還需要在jenkins上配置下憑據(jù)溉仑,點擊添加


image.png

選擇類型為ssh username,其他input的可以自己定一下的兽愤,這里需要一下彼念,關(guān)于private項填的是私鑰挪圾,需要復(fù)制id_rsa的內(nèi)容,填寫完成后點擊添加逐沙,并在 Credentials 一欄選擇填入私鑰


image.png

image.png

當(dāng)前頁面沒有顯示紅色提示 表示添加成功~
image.png

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)程


image.png

點擊console output可以查看當(dāng)前l(fā)og棚赔,workspaces可以查看當(dāng)前工作空間


image.png

可以看到當(dāng)前工作空間為倉庫代碼
image.png

六、詢問當(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)入下圖報錯

image.png

然后去jenkins的插件管理 安裝這個插件


image.png

然后重新構(gòu)建眶痰,你填寫版本信息后點擊繼續(xù),就表示這步可以成功進(jìn)行了


image.png

七梯啤、執(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

image.png

1.安裝nodejs環(huán)境

這里的運行環(huán)境和本機(jī)沒有關(guān)系本姥,類似于一個沙盒,所以如果要安裝node環(huán)境需要安裝Config File Provider PluginNodeJS Plugin這兩個插件

2.配置全局工具

安裝完成后添加全局工具杭棵,找到"系統(tǒng)管理 -> 全局工具配置 -> NodeJS" ,點擊nodejs安裝氛赐,默認(rèn)項即可魂爪,點擊保存,重啟jenkins服務(wù)艰管,回到服務(wù)器滓侍,輸入命令 service jenkins restart


image.png

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白名單


image.png

image.png

八牲芋、提交新的版本號信息到倉庫

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ā)者工具去打開各個小程序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載赔癌,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末澜沟,一起剝皮案震驚了整個濱河市灾票,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茫虽,老刑警劉巖刊苍,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異濒析,居然都是意外死亡正什,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門号杏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婴氮,“玉大人,你說我怎么就攤上這事盾致≈骶” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵庭惜,是天一觀的道長罩驻。 經(jīng)常有香客問我,道長护赊,這世上最難降的妖魔是什么惠遏? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任砾跃,我火速辦了婚禮,結(jié)果婚禮上节吮,老公的妹妹穿的比我還像新娘抽高。我一直安慰自己,他們只是感情好课锌,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布厨内。 她就那樣靜靜地躺著,像睡著了一般渺贤。 火紅的嫁衣襯著肌膚如雪雏胃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天志鞍,我揣著相機(jī)與錄音瞭亮,去河邊找鬼。 笑死固棚,一個胖子當(dāng)著我的面吹牛统翩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播此洲,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼厂汗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了呜师?” 一聲冷哼從身側(cè)響起娶桦,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汁汗,沒想到半個月后衷畦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡知牌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年祈争,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片角寸。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡菩混,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袭厂,到底是詐尸還是另有隱情墨吓,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布纹磺,位于F島的核電站,受9級特大地震影響亮曹,放射性物質(zhì)發(fā)生泄漏橄杨。R本人自食惡果不足惜秘症,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望式矫。 院中可真熱鬧乡摹,春花似錦、人聲如沸采转。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽故慈。三九已至板熊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間察绷,已是汗流浹背干签。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拆撼,地道東北人容劳。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像闸度,于是被迫代替她去往敵國和親竭贩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容