Jenkins+Fastlane+自動化打包+蒲公英二維碼展示+郵件通知+飛書機(jī)器人

前期準(zhǔn)備

1.ruby環(huán)境

fastlane的安裝需要Ruby2.0版本以上,雖然mac自帶ruby,但是版本可能較低,并且權(quán)限較少,所以推薦使用RVM管理ruby版本。
按照這篇文章安裝就可以了Mac安裝Ruby版本管理控制器

2.Xcode命令行工具

xcode-select --install 

如果已經(jīng)安裝會提示如下信息

xcode-select: error: command line tools are already installed, use "Software Update" to install updates

未安裝提示如圖所示


xcode安裝.png

直接點(diǎn)擊安裝就可以了,安裝完成后再次執(zhí)行 xcode-select --install 之后出現(xiàn)已經(jīng)安裝的提示了。

3.Java JDK(jenkins安裝會使用)

可以先查看當(dāng)前安裝的Java版本

 java -version

如果未安裝請先前往JDK下載鏈接下載
因為jenkins是用java語言編寫的,所以需要java環(huán)境支持

WechatIMG47.jpeg

下載完直接安裝就可以了

4.Python (Python調(diào)用Jenkins API獲取構(gòu)建結(jié)果發(fā)通知需要)
直接上python官網(wǎng)下載
或者通過Homebrew安裝python3
brew install python3

查看python3版本號

python3 --version

查看python3安裝的路徑

which python3

根據(jù)pyhon3安裝的路徑配置 bashrc 或者zprofile(我安裝了iTerm及oh-my-zsh插件)文件

 #fastlane
  export LC_ALL=en_US.UTF-8
  export LANG=en_US.UTF-8

# Setting PATH for HOMEBREW
  export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles #ckbrew
  eval $(/usr/local/Homebrew/bin/brew shellenv) #ckbrew

# Setting PATH for JAVA
  export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.0.4.1.jdk/Contents/Home
  export PATH=$JAVA_HOME/bin:$PATH:.
  export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.


# Setting PATH for Python 3.10.8  (brew install python3)
#  export PATH=${PATH}:/usr/local/Frameworks/Python.framework/Versions/3.10/bin/python3.10
#  alias python="/usr/local/Frameworks/Python.framework/Versions/3.10/bin/python3.10"


# Setting PATH for Python 3.11 (手動下載python3.11的包安裝自動生成的路徑)
# The original version is saved in .zprofile.pysave
  PATH="/Library/Frameworks/Python.framework/Versions/3.11/bin:${PATH}"
  export PATH
  alias python=PATH

終端截圖如下:


WechatIMG49.jpeg

fastlane

fastlane是為iOS和Android應(yīng)用程序自動化beta部署和發(fā)布最簡單的方法。??可以處理各種繁瑣任務(wù),例如生成屏幕截圖,處理代碼簽名和發(fā)布應(yīng)用該程序等.fastlane整合了一系列移動端開發(fā)中簽名,編譯,發(fā)布等工具,堪稱打包神器.
fastlane可以單獨(dú)在項目中使用,也可以配合jenkins搭配使用

fastlane安裝的三種方式
1.Homebrew
brew cask install fastlane
2.RubyGems
gem install fastlane -NV

初始化

cd  /到自己的項目目錄下
#初始化
fastlane init
#添加fastlane蒲公英插件(初始化完成之后再執(zhí)行下面命令)
#Fastlane 安裝成功之后 執(zhí)行安裝蒲公英的插件
#jenkins上傳蒲公英為了獲取下載二維碼,而采用了jenkins的插件(Upload to pgyer),如果fastlane不單獨(dú)使用,可以忽略fastlane蒲公英插件
fastlane add_plugin pgyer
fastlane init.png

1.Automate screenshots: 自動截屏
2.Automate beta distribution to TestFlight: 自動發(fā)布beta版本到testFlight
3.Automate App Store distribution: 自動發(fā)布到App Store
4.Manual setup: 手動設(shè)置
這里我們選擇第4個
成功之后,打開我們的項目目錄發(fā)現(xiàn)多了這個文件


fast file.png

配置Fastlane

文件名 描述
Appfile 從 Apple Developer Portal 獲取和項目相關(guān)的信息 詳情
Fastfile 核心文件,存放lane任務(wù)
Deliverfile deliver的配置文件,從 iTunes Connect 獲取和項目相關(guān)的信息詳細(xì)
metadata 同步iTC中的元數(shù)據(jù)
screenshots 同步iTC中的截圖

這里給打家推薦一篇配置的文章Fastfile參考配置
下面是我的配置僅供參考,沒有用fastlane上傳蒲公英,因為想要在jenkins里面獲取二維碼暫時的解決辦法使用jenkins上傳蒲公英 如果需要fastlane上傳直接打開的注釋進(jìn)行了

# 導(dǎo)出路徑
$ipa_output_directory = "/Users/xx/xx/fastlaneBuild"
# 上傳蒲公英的包 路徑
$ipa_output_upload_directory = "/Users/xx/.jenkins/workspace/xx/ipa"
# jenkins匹配的包名
$jenkins_name = "項目名"

default_platform(:iOS)
   # 應(yīng)用名詞
   scheme_name = "項目名字"
    # 獲取version
   version = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleShortVersionString")
   # 獲取build版本號
   build = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleVersion")
   # 指定xcode打包 這里可選擇不要,我們的項目需要用10.1版本xcode
   xcode_select("/Applications/Xcode_10.1.app")
   # 默認(rèn)內(nèi)測打包方式,目前支持app-store, package, ad-hoc, enterprise, development
   ipa_exportMethod = "ad-hoc"
   ipa_exportMethod_appStore = "app-store"

# 計算buildNumber
def updateProjectBuildNumber
   currentTime = Time.new.strftime("%Y%m%d")
   scheme_name = "項目名字"
       build = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleVersion").to_s
   if build.include?"#{currentTime}."
   # 為當(dāng)天版本 計算迭代版本號
       lastStr = build[build.length-2..build.length-1]
       lastNum = lastStr.to_i
       lastNum = lastNum + 1
       lastStr = lastNum.to_s
       if lastNum < 10
           lastStr = lastStr.insert(0,"0")
       end
       build = "#{currentTime}.#{lastStr}"
   else
       # 非當(dāng)天版本 build 號重置
       build = "#{currentTime}.01"
   end
   puts("*************| 更新build #{build} |*************")
   # 更改項目 build 號
   increment_build_number(
       build_number: "#{build}"
   )
end
# 打包成功 jenkins 開始提示上傳log
# 使用fastlane上傳蒲公英拿不到二維碼展示, 所以使用jenkins上傳蒲公英
def archiveSuccessLog(outputName,buildConfig)
   # 打好的包 移動到 jenkins的 workspace的目錄下,用于jenkins上傳蒲公英匹配包內(nèi)容。永遠(yuǎn)只保留一份
#   FileUtils.cp_r("#{$ipa_output_directory}" + "/#{outputName}", "#{$ipa_output_upload_directory}" +  "/#{$jenkins_name}.ipa")
   puts" --------------------------------------------------------------------------"
   puts"|                                                                          |"
   puts"|                                                                          |"
   puts"|   ?????? --------->>>>>      #{buildConfig}版本_打包成功     <<<<<-----------??????  |"
   puts"|                                                                          |"
   puts"|   ?????? --------->>>>>  Jenkins 可以開始上傳蒲公英了  <<<<<-----------??????  |"
   puts"|                                                                          |"
   puts"|                                                                          |"
   puts" --------------------------------------------------------------------------"
end

#
# 所有任務(wù)腳本
#
platform :iOS do

 # 
 # *************| 上傳到測試版本到蒲公英_測試包 |*************
 #
 desc "上傳到測試版本到蒲公英_測試包"
 lane :topgyer_debug do|option|
   puts "*************| 開始打包.ipa文件... |*************"
   # 自動增加build
   updateProjectBuildNumber
   # 自動生成證書
   cert
   # 導(dǎo)出名稱
   output_name = "#{scheme_name}_#{version}_#{build}_#{option[:desc]}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"
   gym(
     # 指定輸出的ipa名稱
       output_name: "#{output_name}",
       # 指定項目的scheme
       scheme: "xxx", 
       # 是否清空以前的編譯信息 true:是
       clean: true,
       export_method: "#{ipa_exportMethod}",
       export_options: {iCloudContainerEnvironment: 'Development'},
       # 指定打包方式,Release 或者 Debug 按需修改
       configuration:"Debug",
# 包導(dǎo)出的位置
       output_directory: "#{$ipa_output_directory}",
    )

   # 使用fastlane上傳蒲公英拿不到二維碼展示, 所以使用jenkins上傳蒲公英
   archiveSuccessLog(output_name," Debug ")

       # 這里是 fastlane 直接上傳蒲公英
   # 如果需要請打開一下注釋,并注釋掉archiveSuccessLog(output_name," Debug ")
   # puts "*************| 開始上傳__測試版__本到蒲公英... |*************"
   # 配置蒲公英 api_key 和 user_key
   # pgyer(api_key: "你的api_key", user_key: "你的user_key", update_description: "#{option[:desc]}")
   # puts "*************| 上傳__測試版__到蒲公英??????成功?????? |*************"
 end


  #
  # *************| 上傳App Store |*************
  #
  lane :toappstore do
   project_identifier = ""
   puts "*************| 開始上傳AppStore... |*************"
   # 自動增加build
   updateProjectBuildNumber
   # 自動生成證書
   # cert
   # 導(dǎo)出名稱
   codesigning_identity = "證書名字"
   output_name = "#{scheme_name}_#{version}_#{build}_#{ipa_exportMethod_appStore}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"
   gym(
       # 指定輸出的ipa名稱
       output_name:output_name,
       # 指定項目的scheme
       scheme:"xxx",
       # 是否清空以前的編譯信息 true:是
       clean:true,
       # 指定打包方式,Release 或者 Debug
       configuration:"Release",
       # 指定打包方式,目前支持app-store, package, ad-hoc, enterprise, development
       export_method:"app-store",
       # 上傳的環(huán)境
       export_options: {iCloudContainerEnvironment: 'Production'},
       # 指定輸出文件夾
       output_directory:"#{$ipa_output_directory}",
    )

  deliver(
            # 選擇跳過圖片和元數(shù)據(jù)上傳,自己去配置
            skip_screenshots:true,
            skip_metadata:true,
            # 上傳完成后提交新版本進(jìn)行審查
            submit_for_review: false,
            force:true,
           )
   puts "*************| 上傳AppStore成功?? |*************"


   puts "*************| 開始上傳__測試版__本到蒲公英... |*************"
   # 配置蒲公英 api_key 和 user_key
   pgyer(api_key: "你的api_key", user_key: "你的user_key", update_description: "#{option[:desc]}")
   puts "*************| 上傳__測試版__到蒲公英??????成功?????? |*************"
   # 發(fā)布testflight測試
   # pilot
  end
end

在自己的項目目錄中執(zhí)行

fastlane topgyer_debug desc:測試

這句話根據(jù)自己的lane :topgyer_debug do|option| 修改
成功之后可以看見 , 如果有上傳蒲公英給的操作 則會告知蒲公英上傳成功,前往蒲公英查看就有新版本了。

17:58:59:  --------------------------------------------------------------------------
17:58:59: |                                                                          |
17:58:59: |                                                                          |
17:58:59: |   ?????? --------->>>>>       Debug 版本_打包成功     <<<<<-----------??????  |
17:58:59: |                                                                          |
17:58:59: |   ?????? --------->>>>>  Jenkins 可以開始上傳蒲公英了  <<<<<-----------??????  |
17:58:59: |                                                                          |
17:58:59: |                                                                          |
17:58:59:  --------------------------------------------------------------------------

接下來思考的問題是:
不能還是由我們開發(fā)人員執(zhí)行 腳本任務(wù)來打包上傳蒲公英。
有沒有辦法能夠讓測試人員自己去打包呢? 所以接下來我們要做的就是讓jenkins執(zhí)行我們的fastlane腳本,并且自動生成二維碼展示。測試人員需要測試包的時候開發(fā)人員只需要把代碼上傳到對應(yīng)的分支就好了。
我選擇了一臺專門的機(jī)器作為服務(wù)器 來做這件事情, 畢竟在自己電腦上多少會有點(diǎn)影響的。

Jenkins

image

Jenkins是一個獨(dú)立的開源軟件項目,是基于Java開發(fā)的一種持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作,旨在提供一個開放易用的軟件平臺,使軟件的持續(xù)集成變成可能。前身是Hudson是一個可擴(kuò)展的持續(xù)集成引擎。可用于自動化各種任務(wù),如構(gòu)建,測試和部署軟件。Jenkins可以通過本機(jī)系統(tǒng)包Docker安裝,甚至可以通過安裝Java Runtime Environment的任何機(jī)器獨(dú)立運(yùn)行。

主要用于

持續(xù)、自動地構(gòu)建/測試軟件項目,如CruiseControl與DamageControl。
監(jiān)控一些定時執(zhí)行的任務(wù)。

JAVA JDK

前面我們已經(jīng)安裝了 java JDK 若未安裝請前往上方查看安裝步驟

Jenkins安裝

1.Jenkins官網(wǎng)地址:jenkins-ci.org/ 下載最新的war包雙擊安裝
2.使用brew安裝

// 使用brew安裝
brew install jenkins‐lts
// 安裝完成后啟動,直接運(yùn)行jenkins即可啟動服務(wù)
//啟動jenkins:
brew services start jenkins‐lts

//-------以下命令是可能會使用到的相關(guān)命令-----
//重啟jekins
brew services restart jenkins‐lts
//更新jekins版本
brew upgrade jenkins‐lts
//停止jenkins
brew stop jenkins‐lts

初始化jenkins
默認(rèn)訪問http://localhost:8080/, 可進(jìn)入jenkins配置頁面。 不要關(guān)閉終端否則jenkins會停掉
第一次運(yùn)行的時候會出現(xiàn)以下界面

jenkins login.png

根據(jù)提示的路徑去 將密碼輸入進(jìn)去 然后點(diǎn)擊 Continue
jenkins customize.png

等待推薦的插件安裝完成,自己設(shè)置賬號密碼

jenkins配置

在主頁(Dashboard)選擇 系統(tǒng)管理(manage Jenkins) -->插件管理( Manage Plugins) 去下載插件,本文涉及以下插件

#git參數(shù)配置
Git Parameter Plug-In

#構(gòu)建超時
Build Timeout

#上傳蒲公英
Pgyer App Uploda Plugin
//(https://github.com/jenkinsci/pgyer-app-upload-plugin)

#上傳蒲公英后 生成二維碼展示在jenkins構(gòu)建列表上
description setter plugin
//(https://plugins.jenkins.io/description-setter)

#構(gòu)建結(jié)果發(fā)送郵件通知
Email Extension Plugin
//(https://plugins.jenkins.io/email-ext)

#構(gòu)建后將構(gòu)建狀態(tài)(失敗/成功)發(fā)送到飛書群
Post build task 
//(https://plugins.jenkins.io/postbuild-task)

#設(shè)置打包的名字(好像沒有用到)
Build Name and Description Setter
//(https://plugins.jenkins.io/build-name-setter)

創(chuàng)建項目

新建.png

選擇: 自由風(fēng)格的項目
選擇項目類型.png

General --> Discard old builds(丟棄舊的構(gòu)建) 構(gòu)建的天數(shù)的保持最大的個數(shù)。
構(gòu)建天數(shù).png
General --> This project is parameterized(參數(shù)化構(gòu)建過程) --> 添加參數(shù) --> Choice Parameter(添加參數(shù))

這個就是 你在構(gòu)建的時候可以先擇 構(gòu)建環(huán)境和分支,(按需添加?。?/p>

參數(shù)構(gòu)建.png
git參數(shù)設(shè)置
git參數(shù)設(shè)置.jpeg
名稱: BUILD_TYPE
選項: debug
      release
描述: 打包環(huán)境
----------------------------------------------
名稱: GIT_BRANCH
選項: develop
      master        
描述: 拉取代碼的 git分支
源碼管理 --> Git

使用Git管理源碼 我這里用的是gitlab 的SSH方式管理


git.png
#branch Specifier(指定分支)不要忘記修改為上面設(shè)置的選擇參數(shù),拉取代碼的分支;
*/${GIT_BRANCH}

git管理就是為了讓jenkins知道我們的源碼在哪里;在第一次構(gòu)建的時候他會去拉取代碼放到.jenkins的workspace中進(jìn)行管理。

如果你的項目很大,需要的clone時間較長的話,需要設(shè)置一下超時時間.
jenkins默認(rèn)的超時時間是10分鐘,根據(jù)自己項目設(shè)置時間,git clone 太慢解決方案

Additional Behaviours-->高級的克隆行為-->設(shè)置超時時間
gitCloneTimeOut.png
構(gòu)建環(huán)境 --> Set build Name 設(shè)置打出來的包的展示名字 ,如果沒有添加插件 是沒有這個選項的
buildName.png
構(gòu)建 --> 增加構(gòu)建步驟 --> Execute shell
buildShell.png

shell.png
#腳本命令如下
cd /Users/你的項目目錄
fastlane topgyer_debug desc:測試版_Debug

添加完shell命令,保存就可以了

回到首頁 --> build with paramters --> 選擇環(huán)境和分支,開始構(gòu)建
buildParam.png

startBuild.png

第一次構(gòu)建需要從Git拉去代碼,如果超時了,更改一下,超時時間,上面有介紹;
打包成功了之后發(fā)現(xiàn) 每次還是要點(diǎn)擊去蒲公英的鏈接然后才能下載;

經(jīng)研究了一下怎么直接把蒲公英的鏈接放在構(gòu)建完成之后,如下圖所示
buildRrcode.png
生成蒲公英二維碼

最開始我使用的是 fastlane 上傳蒲公英的操作,但是想要拿到二維碼不是很容易;
最后想到了直接讓 jenkins哪去fastlane打的包然后上傳蒲公英就好了,然后成功了!
下面介紹一下操作步驟

1.上傳蒲公英

還是進(jìn)入到我們當(dāng)前項目的配置里面去 --> 到最后的構(gòu)建后操作 --> 增加構(gòu)建后操作步驟


uploadPgy.png

pgyKey.png
pgyer api_key : 你的蒲公英api_key

// 這個位置自己決定就好了,和fastfile文件中的ipa_output_upload_directory地址    是一樣就行
Scandir: 打的api包的地址    

file wildcard:  包名字.ipa
注意你需要 吧 fastlane中的fastfile文件中
    ######  這句話的注釋打開   #####
    FileUtils.cp_r("#{$ipa_output_directory}" + "/#{outputName}",     "#{$ipa_output_upload_directory}" +  "/#{$jenkins_name}.ipa")
    這個是講打出來的包拷貝一份到     workspace中,保證ipa文件夾的包只有一個最新的。這個包用于上傳蒲公英
2.獲取二維碼
構(gòu)建后操作 --> 增加構(gòu)建后操作步驟 -->Set build description
buildDesc.png
#從上傳蒲公英的信息中獲取圖片
<a href="${appBuildURL}"><img src="${appQRCodeURL}" width="118" height="118"/></a>
3.最后一步

回到首頁 --> manager Jenkins(系統(tǒng)管理) --> Configure Globle Security(全局安全配置)


safeHtml.jpeg

標(biāo)記格式器設(shè)置為 Safe HTML

構(gòu)建結(jié)果通知

1.使用python3調(diào)用jenkins API查詢構(gòu)建結(jié)果發(fā)送通知給飛書

添加構(gòu)建后操作步驟-->Post build Task,然后在Script里面填寫命令

#!/bin/bash -il

##python3 發(fā)送構(gòu)建報告到飛書群
echo "py執(zhí)行前======"

python3 /Users/XXX/.jenkins/自定義py腳本目錄/buildResult.py $JOB_URL $JOB_NAME $BUILD_NUMBER

echo "py執(zhí)行后======"
postbuildTask.jpeg
buildResult.py
#!/usr/bin/env python
#!/usr/bin/python
import sys
import json
import requests
import time


job_url = sys.argv[1]
job_name = sys.argv[2]
BUILD_NUMBER = sys.argv[3]
currenttime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#job_status = "成功"


url = '自定義飛書機(jī)器人webhook地址'
method = 'post'
headers = {
    'Content-Type': 'application/json'
}

print("======================")
print(sys.argv)



def getJson(job_status):
    return {
            "msg_type": "interactive",
            "card": {
                "config": {
                    "wide_screen_mode": True,
                    "enable_forward": True
                },
                "elements": [{
                    "tag": "div",
                    "text": {
                        "content": "項目名稱:" + job_name + "\n構(gòu)建編號:第" + BUILD_NUMBER + "次構(gòu)建\n" + "構(gòu)建狀態(tài):" + job_status +"\n運(yùn)行時間:" + currenttime,
                        "tag": "lark_md"
                    }
                }, {
                    "actions": [{
                        "tag": "button",
                        "text": {
                            "content": "查看報告",
                            "tag": "lark_md"
                        },
                        "url": job_url,
                        "type": "default",
                        "value": {}
                    }],
                    "tag": "action"
                }],
                "header": {
                    "title": {
                        "content": job_name + " 構(gòu)建報告",
                        "tag": "plain_text"
                    }
                }
            }
        }


def jenkins_job_status(job_name):
        try:
                url  ="%slastBuild/api/json" %(job_url)
                print("----------url----------")
                print(url)
                 #Replace 'your_jenkins_endpoint' with your Jenkins URL
#                while True:
                data = requests.get(url).json()
                print(data)
#                if data['building']:
#                        print("----------building----------")
#                        print(url)
#                        #time.sleep(60)
#                else:
                if data['result'] == "FAILURE":
                    print("Job status failed")
                    return  False
                else:
                    print("Job status success ")
                    return True

        except Exception as e:
                print("Job status Exception")
                print(str(e))
                return False




if __name__ =="__main__":

  if jenkins_job_status(job_name):
      print("Put your autmation here for 'job is success' condition")
      print(sys.argv)
      job_status = getJson("成功")
      requests.request(method=method, url=url, headers=headers,json=job_status)

  else:
    print("Put your autmation here for 'job is failed' condition")
    job_status = getJson("失敗")
    requests.request(method=method, url=url, headers=headers,json=job_status)



自定義飛書機(jī)器人

飛書群-->點(diǎn)擊群名稱--->群機(jī)器人--->添加機(jī)器人-->自定義機(jī)器人--->填寫機(jī)器人名稱+描述-->添加
不清楚的也可以查看飛書自定義機(jī)器人指南,可以參考以上python代碼

feishuRobit.jpeg

蒲公英添加飛書webhook地址

具體添加方式可參考蒲公英Webhook設(shè)置指南

pgySettingWebhook.jpeg

pgywebhook.jpeg

發(fā)送郵件通知

1.構(gòu)建后操作--->添加構(gòu)建后的操作步驟--->Editable Email Notification


addEmailBuildNotification.jpeg

2.設(shè)置接收人對象為:默認(rèn)收件人+自定義收件人(構(gòu)建參數(shù)時傳入)


WechatIMG129.jpeg

emailSetting.jpeg

3.Advanced Settings ---> Triggers ---> Success / Failure 分別設(shè)置對應(yīng)收件人
successOr.jpeg

4.系統(tǒng)設(shè)置-->系統(tǒng)配置-->郵件通知-->參數(shù)設(shè)置
SMTP服務(wù)器/SMTP認(rèn)證/SMTP端口號 等參數(shù)咨詢一下公司運(yùn)維
emailSystemConfig.jpeg

具體可參考jenkins郵件配置和郵件發(fā)送

局域網(wǎng)設(shè)置

1.修改路徑下的plist文件
/usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist
將上面plist中的httpListenAddress后的ip地址,修改為本機(jī)IP或者0.0.0.0即可
2..配置文件修改完后,重啟Jenkins服務(wù)

 brew services restart jenkins‐lts
jenkinsIP.jpeg

結(jié)束語

介紹了一下 fastlane 和 Jenkins 的結(jié)合使用的過程。比較流水線,如果哪里不對 還望各位指出,然后我們拿到自己電腦的ip http://電腦ip:8080/ 交給測試就好了 要包自己去點(diǎn)構(gòu)建吧,建議使用網(wǎng)線,這樣ip不容易變。
之前也研究過 全部使用Jenkins實現(xiàn)打包上傳等過程, 但是jenkins需要配置的東西真的很多,證書、xcode、一系列操作,配置錯誤就會失敗 而且還不容易找出問題,所以選擇了fastlane*進(jìn)行打包上傳蒲公英,之后為了獲取到二維碼直接使用選擇了 jenkins上傳蒲公英。

常見問題

1.jenkins執(zhí)行shell腳本時候出現(xiàn) fastlane Command not found

在安裝完fastkane之后執(zhí)行 fastlane xxx desc:xxx 可以成功打包執(zhí)行 在jenkins中的shell腳本無法執(zhí)行出現(xiàn)以下錯誤

16:20:30 xxx/xxx/xxx/xxx.sh: line 4: fastlane: command not found
16:20:30 Build step 'Execute shell' marked build as failure
16:20:30 New run name is 'iOS_xxx_develop_debug_build(17)'
16:20:30 [UPLOAD TO PGYER] - The build FAILURE, so the file was not uploaded.
16:20:30 [description-setter] Description set: 
16:20:30 Finished: FAILURE

在jenkins的shell腳本命令前添加 #!/bin/bash -ilex 命令eg:

#!/bin/bash -ilex

cd /Users/xxxx/xxxx       # 你的項目地址
fastlane topgyer_debug desc:測試版_Debug

2.使用Python報錯

import requests
ModuleNotFoundError: No module named 'requests'

mac下會自動默認(rèn)使用python2.7,但它沒有requests模塊,所以會報錯,即使你已經(jīng)安裝了python3。
終端輸入:

python3 -m pip install requests

3.git 克隆超時(上面有講到)
Additional Behaviours-->高級的克隆行為-->設(shè)置超時時間

4.python3 : command not found
添加環(huán)境變量


環(huán)境變量.jpeg

整理比較倉促,如有不明白的地方,歡迎賜教!

參考鏈接:
http://www.itdecent.cn/p/4824bf37f9aa/
https://jenkins.io/zh/
https://fastlane.tools/

最后編輯于
?著作權(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)容