搭建CI環境

Jenkins
Jenkins

原文地址:LoveDev

Jenkins 是一款領先的開源自動化服務器,提供了數百個插件來支持任何項目的構建,部署和自動化

前往官網下載最新的 war 包,war 包使用起來比起安裝到系統中方便一些,這篇文章中用到的是 2.46.2 版本的 war 包

啟動命令:

# --httpPort 參數可以指定啟動的端口,避免端口沖突
$ java -jar jenkins.war --httpPort=1111

初次進入 Jenkins 時需要初始密碼,密碼會在啟動日志中打印出來:

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

f1bfd39676da4339afbb93dd3e07606b

This may also be found at: /home/.jenkins/secrets/initialAdminPassword

進入以后會有兩個選項,建議選擇左邊的一個,會安裝一些常用的插件,然后就是創建賬號,創建賬號的時候命令行可能會報 403 錯誤碼,此時需要進入 系統管理 -> Configure Global Security,關閉 防止跨站點請求偽造 選項

進入首頁之后,需要在 Global Tool Configuration 中配置 JDKGradle 信息

Global Tool Configuration
Global Tool Configuration

JDKGradle的配置最好跟項目中使用的相同,我的配置如下:

JDK Gradle
JDK Gradle

編譯 Android 項目怎么能少得了 SDK,SDK 的配置需要到 系統設置 中配置:

系統設置
系統設置

全局屬性 中增加鍵值對,我的配置如下:

ANDROID_HOME
ANDROID_HOME

隨便配置一下插件 Extended E-mail Notification

郵件通知
郵件通知

到此,編譯環境配置完成,接下來需要創建項目并配置項目,首先點擊新建創建一個自由風格的軟件項目:

創建項目
創建項目

創建完成后會自動跳轉到項目的配置界面,里面有很多的配置項,該文章只介紹一些必須的配置項,日后會陸續更新補充

配置源碼管理

源碼管理
源碼管理

點擊 Add 按鈕可以添加密鑰:

添加密鑰
添加密鑰

配置構建觸發器

配置 Gradle

點擊 增加構建步驟,選擇圖中選項:

增加構建步驟
增加構建步驟

具體配置:

Invoke Gradle script
Invoke Gradle script

Tasks 選項里面的內容可以根據自己的需求填寫

郵箱通知插件

全局的郵件插件已經配置過了,現在需要在項目中進行具體的配置,配置步驟很簡單:

郵箱通知配置
郵箱通知配置
郵箱通知配置
郵箱通知配置

郵件通知內容模板:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日志</title>
</head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
    offset="0">
    <table width="95%" cellpadding="0" cellspacing="0"
        style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
        <tr>
            <td>(本郵件是程序自動下發的,請勿回復!)</td>
        </tr>
        <tr>
            <td><h2>
                    <font color="#0000FF">構建結果 - ${BUILD_STATUS}</font>
                </h2></td>
        </tr>
        <tr>
            <td><br />
            <b><font color="#0B610B">構建信息</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>項目名稱 : ${PROJECT_NAME}</li>
                    <li>項目描述 : ${JOB_DESCRIPTION}</li>
                    <li>構建編號 : 第${BUILD_NUMBER}次構建</li>
                    <li>觸發原因: ${CAUSE}</li>
                    <li>下載地址: http://fir.im/t6k7</li>
                    <li>構建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                    <li>構建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
                    <li>項目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
                </ul>
            </td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">Changes Since Last
                        Successful Build:</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>歷史變更記錄 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
                </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="    %p"}
            </td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">構建日志 (最后 100行):</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <!-- <tr>
            <td>Test Logs (if test has ran): <a
                href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
                <br />
            <br />
            </td>
        </tr> -->
        <tr>
            <td><textarea cols="80" rows="30" readonly="readonly"
                    style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea>
            </td>
        </tr>
    </table>
</body>
</html>

上傳APK到fir

官方文檔在這里

這里具體介紹一下怎么上傳 git 中的 commit 信息到fir,需要用到 Environment Injector Plugin 插件,具體步驟如下:

  • 輸出 commit 文件內容,增加構建步驟 -> Execute shell ->在Command輸入以下內容(注意替換Jenkins的username,password,IP,端口)
CHANGELOG=$(curl -u username:password "http://localhost:8080/job/$JOB_NAME/$BUILD_NUMBER/api/xml?wrapper=changes&xpath=//changeSet//comment" | sed -e "s/<\/comment>//g; s/<comment>//g; s/<\/*changes>//g" | sed '/^$/d;G')
echo CHANGELOG=$CHANGELOG > change_log_vars
  • 設置 commit 文件參數:增加構建步驟->Inject environment variables->在Properties File Path輸入change_log_vars
  • 輸出 commit 作者文件內容:增加構建步驟->Execute shell->在Command輸入以下內容:
CHANGEAUTHOR=$(curl -u username:password "http://localhost:8080/job/$JOB_NAME/$BUILD_NUMBER/api/xml?wrapper=changes&xpath=//changeSet//fullName" | sed -e "s/<\/fullName>//g; s/<fullName>//g; s/<\/*changes>//g" | sed '/^$/d;G')
echo CHANGEAUTHOR=$CHANGEAUTHOR > change_author_vars
  • 設置 commit 作者文件參數:增加構建步驟->Inject environment variables->在Properties File Path輸入change_author_vars
  • 最后設置到 fir 插件中:增加構建后操作步驟->Upload to fir.im,然后在Build Notes中輸入:
$CHANGELOG
by $CHANGEAUTHOR

最后上一張 fir 插件的配置圖:

commit 信息提取
commit 信息提取
fir 插件配置
fir 插件配置

常見問題

構建失敗

  Fix the issues identified by lint, or add the following to your build script to proceed with errors:
  ...
  android {
      lintOptions {
          abortOnError false
      }
  }
  ...

已經提示了怎么處理該錯誤,在 Gradle 文件中加入提示的代碼即可

測試郵件發送失敗

Failed to send out e-mail

javax.mail.AuthenticationFailedException: 535 Error: authentication failed

    at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:809)
    at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:752)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:669)
    at javax.mail.Service.connect(Service.java:317)
    at javax.mail.Service.connect(Service.java:176)
    at javax.mail.Service.connect(Service.java:125)
    at javax.mail.Transport.send0(Transport.java:194)
    at javax.mail.Transport.send(Transport.java:124)
    at hudson.tasks.Mailer$DescriptorImpl.doSendTestMail(Mailer.java:581)
    at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:343)

認證失敗,注意配置郵箱的密碼并不是登錄密碼,而是授權碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容