jenkins搭建

本文是基于寶塔面板的,如果自己搭建服務(wù)差別不大,根據(jù)自己的調(diào)整,這里不做展開。
如果需要安裝寶塔面板,自行搜索。當(dāng)然還必須要有一個云服務(wù)器,這個也自行查詢?nèi)绾谓鉀Q。

jenkins要支持web網(wǎng)頁,那么就要有web服務(wù)支持,一般都使用tomcat。在寶塔配置安裝tomcat

安裝完后 tomcat 目錄在 www -> server -> tomcat
寶塔面板中放行 8080 端口,注意:還需在阿里云或者騰訊云放行 8080 端口

現(xiàn)在復(fù)制寶塔面板地址,端口改為8080,安裝成功可以看到以下界面


image.png

安裝 jenkins
安裝Jenkins的方式有多種,可以運(yùn)行對應(yīng)系統(tǒng)類型的安裝包,可以通過docker獲取鏡像,也可以直接運(yùn)行war包。

我個人傾向于直接運(yùn)行war包的形式,只需下載jenkins.war后,運(yùn)行如下命令即可啟動Jenkins。

http://updates.jenkins-ci.org/download/war/
我選擇的版本是Jenkins 2.346.2

image.png

下載jenkins,得到 war 包后上傳到 www -> server -> tomcat -> webapps

image.png

然后重啟 apache,訪問 寶塔面板ip:8080/jenkins 就能看到以下界面了,Jenkins的默認(rèn)端口為8080

image.png

初始密碼在/home/www/.jenkins/secrets/initialAdminPassword


image.png

獲取到密碼填入上面的網(wǎng)頁,點(diǎn)擊繼續(xù)


image.png

Jenkins有非常多的插件,可以實(shí)現(xiàn)各種功能的擴(kuò)展。如果空間足夠,直接點(diǎn)擊推薦插件,繼續(xù)安裝,


image.png
image.png
image.png

到這里jenkins就安裝完畢了。

看一下存在的問題


image.png

上網(wǎng)搜了一下,多數(shù)的解答都是:系統(tǒng)管理–>系統(tǒng)設(shè)置里的Jenkins URL沒有寫對。首先檢查一下這里配置,如果改過啟動端口號,這里是需要保持一致的,并且IP需要設(shè)置為外網(wǎng)的IP,不能是localhost或127.0.0.1。不過我這里配置的沒有問題,重啟多次問題依舊。

本人是將jenkins.war放在tomcat容器中運(yùn)行,訪問Jenkins-系統(tǒng)管理,會提示“反向代理設(shè)置有誤”
https://blog.nowcoder.net/n/1cc86e51337e4c0892ffd2ac36af12dc
這位博主提供了下面兩種解決方法
在tomcat上部署jenkins的確有這一問題,可以直接點(diǎn)擊【不再顯示】就可以了,不會有什么影響
也可以換成java -jar來運(yùn)行jenkins,就不會有這問題了

java 11

sudo yum search java-11
安裝java 11
sudo yum install java-11-openjdk -y
安裝完之后,并不會自動切換到11,
java -version
which java
發(fā)現(xiàn)還是1.8

通過alternatives選擇版本,如下圖,選擇第三個,即我們剛安裝的java11
sudo alternatives --config java
java -version 發(fā)現(xiàn)成功切換了


image.png
image.png
image.png

Jenkins插件

Jenkins插件
image.png

針對搭建的iOS/Android持續(xù)集成打包平臺,我使用到了如下幾個插件。

  • GIT plugin (默認(rèn)已安裝)
  • SSH Credentials Plugin
  • Git Changelog Plugin: 獲取倉庫提交的commit log
  • Git Parameter
  • Multiple SCMs 多個git項(xiàng)目
  • build-name-setter:用于修改Build名稱
  • description setter plugin:用于在修改Build描述信息,在描述信息中增加顯示QRCode(二維碼)
  • PostBuildScript:在編譯完成后通過執(zhí)行腳本實(shí)現(xiàn)一些額外功能
  • Xcode integration: iOS專用(可選)
  • Gradle plugin: Android專用(可選 默認(rèn)已安裝)

安裝方式也比較簡單,直接在Jenkins的插件管理頁面搜索上述插件,點(diǎn)擊安裝即可。安裝完畢之后需要重啟jenkins,即重新加載配置。

如果安裝完插件,重啟卡住了,因?yàn)槲覀兪峭ㄟ^tomcat運(yùn)行的,所以可以直接重載tomcat的配置即可。

flutter 打包環(huán)境搭建

官方告訴我們使用snap安裝flutter,或者手動安裝

sudo snap install flutter --classic

我們當(dāng)然沒有安裝snap,所以查找snap安裝教程安裝對應(yīng)系統(tǒng)版本,最后終于成功了。

cat /etc/centos-release 查看系統(tǒng)版本,對應(yīng)的是centos7


image.png
image.png
$ sudo yum install epel-release
$ sudo yum install snapd
$ sudo systemctl enable --now snapd.socket
$ sudo ln -s /var/lib/snapd/snap /snap
$ sudo snap install flutter --classic

如果不形,安裝一下sudo snap install snap-store

flutter sdk-path

很不幸的是沒有發(fā)現(xiàn)flutter命令,我們看到snap/bin/底下已經(jīng)有了flutter dart的軟連接,也就是說只要把snap/bin/加入全局即可
vi .bash_profile

snap_bin_path="/snap/bin"

export PATH=$PATH:${snap_bin_path}

source .bash_profile

echo $PATH

flutter doctor -v

image.png

真正的flutter安裝在snap/flutter/目錄底下


image.png

android sdk

https://developer.android.google.cn/studio
如果不需要adnroid studio可以下載下面的commandlinetools,如果需要其他版本可以使用sdkmanager來安裝

image.png

下載android sdk,選擇一個目錄存放,我這里選擇/home/android
cd /home/android/

commandlinetools-linux-8512546_latest.zip 為當(dāng)前最新可下載的SDK tools 版本
安裝 SDK
cmd指令:wget https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip
其中commandlinetools-linux-8512546_latest.zip為上面截圖中紅色圈選的版本,安裝時可根據(jù)官網(wǎng)最新版本進(jìn)行替換下載

unzip commandlinetools-linux-8512546_latest.zip

cd cmdline-tools/


image.png

bin包含sdkmanager工具

其次,配置sdkmanager全局變量PATH

vi ~/.bash_profile

export SDK_HOME=/home/android
# 配置sdkmanager環(huán)境
export PATH=${SDK_HOME}/cmdline-tools/bin:$PATH 
# 配置通過cmdline-tools中的sdkmanager下載下來的tools中的sdkmanager
export PATH=${SDK_HOME}/tools/bin:$PATH  

執(zhí)行 source ~/.bash_profile 重新加載配置文件后生效
最后,以上環(huán)境配置好之后,可以執(zhí)行下面指令進(jìn)行檢查sdkmanager是否安裝成功以及對應(yīng)的版本信息

sdkmanager --sdk_root=/home/android/ --version

image.png

列出已安裝和可用的軟件包
sdkmanager --sdk_root=/home/android/ --list

我們項(xiàng)目選擇的是android-31以及31.0.0

sdkmanager --sdk_root=/home/android/ "platform-tools" 
sdkmanager --sdk_root=/home/android/ "platforms;android-31" 
sdkmanager --sdk_root=/home/android/ "build-tools;31.0.0"

下載了platform-tools之后,我們就可以把a(bǔ)db也一塊配置上去了
vi ~/.bash_profile

# 配置adb環(huán)境
export PATH=${SDK_HOME}/platform-tools:$PATH 

source ~/.bash_profile 重新加載配置文件后生效

image.png

至此,androidSdk即安裝完成!

gradle下載

gradle 我們可以選一個目錄存儲,這里是/home/gradle/

https://services.gradle.org/distributions/

image.png

wget https://services.gradle.org/distributions/gradle-7.4-all.zip
unzip gradle-7.4-all.zip

vi ~/.bash_profile

export GRADLE_HOME=/home/gradle/gradle-7.4
# 配置gradle環(huán)境
export PATH=${GRADLE_HOME}/bin:$PATH 

執(zhí)行 source ~/.bash_profile 重新加載配置文件后生效

image.png
image.png

創(chuàng)建項(xiàng)目(Job)

在Jenkins中,構(gòu)建項(xiàng)目以Job的形式存在,因此需要針對每個項(xiàng)目創(chuàng)建一個Job。有時候,一個項(xiàng)目中可能有多個分支同時在進(jìn)行開發(fā),為了分別進(jìn)行構(gòu)建,也可以針對每個分支創(chuàng)建一個Job。

創(chuàng)建Job的方式有多種,本次只需要創(chuàng)建Freestyle project類型的即可。

Main page -> New Item -> Freestyle project

對于一個持續(xù)集成打包平臺,每次打包都由4步組成:觸發(fā)構(gòu)建、拉取代碼、執(zhí)行構(gòu)建、構(gòu)建后處理。對應(yīng)的,在每個Job中也對應(yīng)了這幾項(xiàng)的配置。

源碼管理

選擇Git管理填入git地址
添加項(xiàng)目的用戶憑證
指定分支為:$branch,這里是引用的其他變量,用于分支的選擇


image.png

要對項(xiàng)目進(jìn)行構(gòu)建,配置項(xiàng)目的代碼倉庫是必不可少的。由于當(dāng)前我們的項(xiàng)目托管在GitHub私有倉庫中,因此在此需要對Git進(jìn)行配置。

【Source Code Management】配置欄目下,如果之前GIT plugin安裝成功,則會出現(xiàn)Git選項(xiàng)。

配置Git代碼倉庫時,有三項(xiàng)是必須配置的:倉庫URL地址(Repository URL)、倉庫權(quán)限校驗(yàn)方式(Credentials),以及當(dāng)前Job需要構(gòu)建的代碼分支(Branches to build)。

在配置Repository URL時,選擇HTTPS URLSSH URL均可。不過需要注意的是,Credentials要和Repository URL對應(yīng),也就是說:

  • 如果Repository URLHTTPS URL形式的,那么Credentials就要采用GitHub用戶名密碼的校驗(yàn)方式;而且,如果在GitHub中開啟了2FA(two-factor authentication),那么還需要在GitHub中創(chuàng)建一個Personal access token,輸入密碼時將這個Personal access token作為密碼進(jìn)行輸入。
  • 如果Repository URLSSH URL形式的,那么就需要先在Jenkins所在的服務(wù)器上創(chuàng)建一個SSH秘鑰對,并將公鑰添加到GitHub的SSH keys中,然后在填寫Credentials時,選擇SSH Username with private key的校驗(yàn)方式,填入GitHub Username、SSH私鑰、以及創(chuàng)建SSH秘鑰對時設(shè)置的Passphrase。

如果對Git權(quán)限校驗(yàn)的概念還比較模糊,可以參考《深入淺出Git權(quán)限校驗(yàn)》。

在配置Branches to build時,可以采用多種形式,包括分支名稱(branchName)、tagName、commitId等。其中分支名稱的形式用的最多,例如,若是構(gòu)建master分支,則填寫refs/heads/master,若是構(gòu)建develop分支,則填寫refs/heads/develop

除了以上關(guān)于Git的必填配置項(xiàng),有時根據(jù)項(xiàng)目的實(shí)際情況,可能還需要對Jenkins的默認(rèn)配置項(xiàng)進(jìn)行修改。

比較常見的一種情況就是對clone的配置進(jìn)行修改。

在Jenkins的默認(rèn)配置中,clone代碼時會拉取所有歷史版本的代碼,而且默認(rèn)的超時時限只有10分鐘。這就造成在某些項(xiàng)目中,由于代碼量本身就比較大,歷史版本也比較多,再加上網(wǎng)絡(luò)環(huán)境不是特別好,Jenkins根本沒法在10分鐘之內(nèi)拉取完所有代碼,超時后任務(wù)就會被自動終止了(錯誤狀態(tài)碼143)。

這種問題的解決方式也很簡單,無非就是兩種思路,要么少拉取點(diǎn)代碼(不獲取歷史版本),要么提高超時時限。對應(yīng)的配置在Advanced clone behaviours中:

  • Shallow clone:勾選后不獲取歷史版本;
  • Timeout (in minutes) for clone and fetch operation:配置后覆蓋默認(rèn)的超時時限。

對 Job 進(jìn)行配置

在 General 配置中,選擇 參數(shù)化構(gòu)建過程 中的 Git Parameter 選項(xiàng),然后按下面進(jìn)行配置。

使用 Git Parameter 插件


image.png

配置完 Git Parameter 參數(shù)后,這里在源碼管理選項(xiàng)中配置 Git 選項(xiàng),輸入 Git 項(xiàng)目 URL 地址,如果是私有 Git 項(xiàng)目的話還要配置憑據(jù)。最后配置分支選項(xiàng),里面引用上面設(shè)置 Git Parameter 參數(shù)中設(shè)置的參數(shù)名,通過 ${參數(shù)名} 引用。

image
image.png

構(gòu)建
在Execute shell中添加項(xiàng)目構(gòu)建命令:

配置構(gòu)建觸發(fā)器

代碼倉庫配置好了,意味著Jenkins具有了訪問GitHub代碼倉庫的權(quán)限,可以成功地拉取代碼。

那Jenkins什么時候執(zhí)行構(gòu)建呢?

這就需要配置構(gòu)建觸發(fā)策略,即構(gòu)建觸發(fā)器,配置項(xiàng)位于【Build Triggers】欄目。

觸發(fā)器支持多種類型,常用的有:

  • 定期進(jìn)行構(gòu)建(Build periodically)
  • 根據(jù)提交進(jìn)行構(gòu)建(Build when a change is pushed to GitHub)
  • 定期檢測代碼更新,如有更新則進(jìn)行構(gòu)建(Poll SCM)

構(gòu)建觸發(fā)器的選擇為復(fù)合選項(xiàng),若選擇多種類型,則任一類型滿足構(gòu)建條件時就會執(zhí)行構(gòu)建工作。如果所有類型都不選擇,則該Jenkins Job不執(zhí)行自動構(gòu)建,但可通過手動點(diǎn)擊【Build Now】觸發(fā)構(gòu)建。

關(guān)于定時器(Schedule)的格式,簡述如下:

MINUTE HOUR DOM MONTH DOW

  • MINUTE: Minutes within the hour (0-59)
  • HOUR: The hour of the day (0-23)
  • DOM: The day of the month (1-31)
  • MONTH: The month (1-12)
  • DOW: The day of the week (0-7) where 0 and 7 are Sunday.

通常情況下需要指定多個值,這時可以采用如下operator(優(yōu)先級從上到下):

  • *適配所有有效的值,若不指定某一項(xiàng),則以*占位;
  • M-N適配值域范圍,例如7-9代表7/8/9均滿足;
  • M-N/X*/X:以X作為間隔;
  • A,B,C:枚舉多個值。

另外,為了避免多個任務(wù)在同一時刻同時觸發(fā)構(gòu)建,在指定時間段時可以配合使用H字符。添加H字符后,Jenkins會在指定時間段內(nèi)隨機(jī)選擇一個時間點(diǎn)作為起始時刻,然后加上設(shè)定的時間間隔,計(jì)算得到后續(xù)的時間點(diǎn)。直到下一個周期時,Jenkins又會重新隨機(jī)選擇一個時間點(diǎn)作為起始時刻,依次類推。

為了便于理解,列舉幾個示例:

  • H/15 * * * *:代表每隔15分鐘,并且開始時間不確定,這個小時可能是:07,:22,:37,:52,下一個小時就可能是:03,:18,:33,:48;
  • H(0-29)/10 * * * *:代表前半小時內(nèi)每隔10分鐘,并且開始時間不確定,這個小時可能是:04,:14,:24,下一個小時就可能是:09,:19,:29
  • H 23 * * 1-5:工作日每晚23:00至23:59之間的某一時刻;

配置構(gòu)建方式

觸發(fā)策略配置好之后,Jenkins就會按照設(shè)定的策略自動執(zhí)行構(gòu)建。但如何執(zhí)行構(gòu)建操作,這還需要我們通過配置構(gòu)建方式來進(jìn)行設(shè)定。

常用的構(gòu)建方式是根據(jù)構(gòu)建對象的具體類型,安裝對應(yīng)的插件,然后采用相應(yīng)的構(gòu)建方式。例如,若是構(gòu)建Android應(yīng)用,安裝Gradle plugin之后,就可以選擇Invoke Gradle script,然后采用Gradle進(jìn)行構(gòu)建;若是構(gòu)建iOS應(yīng)用,安裝Xcode integration插件之后,就可以選擇Xcode,然后選擇Xcode進(jìn)行構(gòu)建。

該種方式的優(yōu)勢是操作簡單,UI可視化,在場景不復(fù)雜的情況下可以快速滿足需求。不過缺點(diǎn)就是依賴于插件已有的功能,如果場景較復(fù)雜時可能單個插件還無法滿足需求,需要再安裝其它插件。而且,有些插件可能還存在一些問題,例如對某些操作系統(tǒng)版本或XCode版本兼容不佳,出現(xiàn)問題時我們就會比較被動。

我個人更傾向于另外一種方式,就是自己編寫打包腳本,在腳本中自定義實(shí)現(xiàn)所有的構(gòu)建功能,然后在Execute Shell中執(zhí)行。這種方式的靈活度更高,各種場景的構(gòu)建需求都能滿足,出現(xiàn)問題后也能自行快速修復(fù)。

另外,對于iOS應(yīng)用的構(gòu)建,還有一個需要額外關(guān)注的點(diǎn),就是開發(fā)者證書的配置。

如果是采用Xcode integration插件進(jìn)行構(gòu)建,配置會比較復(fù)雜,需要在Jenkins中導(dǎo)入開發(fā)證書,并填寫多個配置項(xiàng)。不過,如果是采用打包腳本進(jìn)行構(gòu)建的話,情況就會簡單許多。只要在Jenkins所運(yùn)行的計(jì)算機(jī)中安裝好開發(fā)者證書,打包命令在Shell中能正常工作,那么在Jenkins中執(zhí)行打包腳本也不會有什么問題。

構(gòu)建后處理

完成構(gòu)建后,生成的編譯成果物(ipa/apk)會位于指定的目錄中。但是,如果要直接在手機(jī)中安裝ipa/apk文件還比較麻煩,不僅在分發(fā)測試包時需要將好幾十兆的安裝包進(jìn)行傳送,體驗(yàn)用戶在安裝時也還需要通過數(shù)據(jù)線將手機(jī)與計(jì)算機(jī)進(jìn)行連接,然后再使用PP助手或豌豆莢等工具進(jìn)行安裝。

當(dāng)前比較優(yōu)雅的一種方式是借助蒲公英(pgyer)fir.im等平臺,將ipa/apk文件上傳至平臺后由平臺生成二維碼,然后只需要對二維碼鏈接進(jìn)行分發(fā),體驗(yàn)用戶通過手機(jī)掃描二維碼后即可實(shí)現(xiàn)快速安裝,效率得到了極大的提升。

上傳安裝包文件,生成二維碼

不管是蒲公英還是fir.im,都有對應(yīng)的Jenkins插件,安裝插件后可以在Post-build中實(shí)現(xiàn)對安裝包的上傳。

除了使用Jenkins插件,fir.im還支持命令上傳的方式,蒲公英還支持HTTP Post接口上傳的方式。

我個人推薦采用命令或接口上傳的方法,并在構(gòu)建腳本中進(jìn)行調(diào)用。靈活是一方面,更大的好處是如果上傳失敗后還能進(jìn)行重試,這在網(wǎng)絡(luò)環(huán)境不是很穩(wěn)定的情況下極其必要。

Jenkins成功完成安裝包上傳后,pgyer/fir.im平臺會生成一個二維碼圖片,并在響應(yīng)中將圖片的URL鏈接地址進(jìn)行返回。

展示二維碼圖片

二維碼圖片的URL鏈接有了,那要怎樣才能將二維碼圖片展示在Jenkins項(xiàng)目的歷史構(gòu)建列表中呢?

這里需要用到另外一個插件,description setter plugin。安裝該插件后,在【Post-build Actions】欄目中會多出description setter功能,可以實(shí)現(xiàn)構(gòu)建完成后設(shè)置當(dāng)次build的描述信息。這個描述信息不僅會顯示在build頁面中,同時也會顯示在歷史構(gòu)建列表中。

有了這個前提,要將二維碼圖片展示在歷史構(gòu)建列表中貌似就可以實(shí)現(xiàn)了,能直觀想到的方式就是采用HTMLimg標(biāo)簽,將<img src='qr_code_url'>寫入到build描述信息中。

這個方法的思路是正確的,不過這么做以后并不會實(shí)現(xiàn)我們預(yù)期的效果。

這是因?yàn)镴enkins出于安全的考慮,所有描述信息的Markup Formatter默認(rèn)都是采用Plain text模式,在這種模式下是不會對build描述信息中的HTML編碼進(jìn)行解析的。

要改變也很容易,Manage Jenkins -> Configure Global Security,將Markup Formatter的設(shè)置更改為Safe HTML即可。

更改配置后,我們就可以在build描述信息中采用HTMLimg標(biāo)簽插入圖片了。

另外還需要補(bǔ)充一個點(diǎn)。如果是使用蒲公英(pyger)平臺,會發(fā)現(xiàn)每次上傳安裝包后返回的二維碼圖片是一個短鏈接,神奇的是這個短連接居然是固定的(對同一個賬號而言)。這個短連接總是指向最近生成的二維碼圖片,但是對于二維碼圖片的唯一URL地址,平臺并沒有在響應(yīng)中進(jìn)行返回。在這種情況下,我們每次構(gòu)建完成后保存二維碼圖片的URL鏈接就沒有意義了。

應(yīng)對的做法是,每次上傳完安裝包后,通過返回的二維碼圖片短鏈接將二維碼圖片下載并保存到本地,然后在build描述信息中引用該圖片在Jenkins中的地址即可。

收集編譯成果物(Artifacts)

每次完成構(gòu)建后,編譯生成的文件較多,但是并不是所有的文件都是我們需要的。

通常情況下,我們可能只需要其中的部分文件,例如.ipa/.app/.plist/.apk等,這時我們可以將這部分文件單獨(dú)收集起來,并在構(gòu)建頁面中展示出來,以便在需要時進(jìn)行下載。

要實(shí)現(xiàn)這樣一個功能,需要在【Post-build Actions】欄目中新增Archive the artifacts,然后在Files to archive中通過正則表達(dá)式指定成果物文件的路徑。

設(shè)置完畢后,每次構(gòu)建完成后,Jenkins會在Console Output中采用設(shè)定的正則表達(dá)式進(jìn)行搜索匹配,如果能成功匹配到文件,則會將文件收集起來。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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