最新iOS+Jenkins记录

2,534 阅读10分钟

安装

Homebrew

如果已安装,需要更新一次:

 brew upgrade

耗时操作

Java

下载地址 www.oracle.com/technetwork…

需要先注册oracle账号

Jenkins

普通版本:

brew install jenkins

长期支持版本(装的这个):

brew install jenkins-lts

使用

启动 Jenkins

两种启动方式:

单次启动:

/usr/local/opt/openjdk@11/bin/java -Dmail.smtp.starttls.enable=true -jar /usr/local/opt/jenkins-lts/libexec/jenkins.war --httpListenAddress=127.0.0.1 --httpPort=8080

启动后台服务:

brew services start jenkins-lts

解锁Jenkins

输入管理员密码。会看到终端有个日志,一串字符串,就是密码;没看到也可以在网页上的路径里面去复制。

创建管理员账号

自行创建

自定义Jenkins

直接选择安装推荐插件

进入新手入门页面,自动安装推荐的插件,耗时操作

安装可选插件

  • Credentials
  • DingTalk
  • Git
  • Git Parameter
  • GitLab
  • GitLab Authentication
  • Keychains and Provisioning Profiles Management
  • Xcode integration

因为公司用的是gitlab,所以需要装gitlab的插件

配置 Keychains and Provisioning Profiles Management

遇到问题,使用其他方案

首页- 系统管理 - 未分类一栏,找到Keychains and Provisioning Profiles Management,点击进入

892f348e9eaf105656e4a9ef5895050c.png

keychain文件:

根据路径~/Library/Keychains/,找到login.keychain-db

复制一份到桌面,并改名为login.keychain

点击选择文件按钮,选则login.keychain,点击`upload;

137efbaf7870f40ab2335e5ce01f59ba.png

Profiles

路径~/Library/MobileDevice/Provisioning\ Profiles,复制需要的mobileprovision文件到桌面;

点击选择文件,选择桌面的文件,点击upload

b95b1e13352ac242c3232e93a25b8bb7.png


遇到问题:点击upload没有任何反应

方案一:将Jenkins降级到2.263.4版本
git clone https://github.com/Homebrew/homebrew-core.git

# 3a3803f22e24bdcd0b01831fc074a9f28773594d is 2.263.4
git checkout 3a3803f22e24bdcd0b01831fc074a9f28773594d

brew install /Users/xxx/homebrew-core/homebrew-core/Formulajenkins-lts.rb

或者手动下载安装包。


方案二:手动导入文件

打开kpp_upload文件夹

open ~/.jenkins/kpp_upload

mobileprovisionlogin.keychain手动拖入,再刷新网页。

实测,save按钮无反应,找不到其它解决方法

方案三:使用脚本查找keychain

方案来自:

简书作者:钓小鱼的猫 链接:www.jianshu.com/p/046628732…

# 存储路径
cd /Users/wahaha/.jenkins/workspace/wahahaIos_ipa/ios
#pwd

 
rm -rf *.Adhoc.ipa


 
LOGIN_KEYCHAIN=~/Library/Keychains/login.keychain-db
# 用户密码
LOGIN_PASSWORD=wahaha123456

PackageName=we_learn${BUILD_TIMESTAMP}.ipa 

pod setup
 
pod install


 
security unlock-keychain -p ${LOGIN_PASSWORD} ${LOGIN_KEYCHAIN}
 
xcodebuild clean -workspace Runner.xcworkspace  -scheme Runner
 
xcodebuild -archivePath Runner.xcarchive   -workspace Runner.xcworkspace -sdk iphoneos -scheme Runner -configuration ${BUILD_TYPE} archive 
 
xcodebuild -exportArchive -exportOptionsPlist /Users/wahaha/.jenkins/workspace/ExportOptions.plist   -archivePath Runner.xcarchive -exportPath  Runner_Test${BUILD_TIMESTAMP}.Adhoc.ipa

方案四:使用Xcode integration插件

在创建项目时,添加Xcode构建步骤,方案来自:

简书作者:yuyangkk 链接:www.jianshu.com/p/bf6e52af7…


新建任务

点击新建任务

54f02120210a028c0dc10a627e40c08c.png

输入自己的项目名,选择构建一个自由风格的软件项目,点击确定,进入配置页面,按顶部标签来详细说明:

General

186b9efa3c84748827daa489dacff1c4.png

Throttle builds

构建频率限制

13dbe33d76b636fae513089ca31dd9c5.png

丢弃旧的构建

相当于构建的缓存策略

4aed702928252e3b8beab7411295933d.png

参数化构建过程

这里可以配置各个类型的参数,作为环境变量传递给构建。

Git参数

3f6033685027b400ed44ba1df6cd04f0.png

使用时,应使用${git_branch}

源码管理

0688b29ee3c5f0cdb6d665b13352b761.png

Repository URL

仓库地址,如果使用GitLab仓库,需要安装对应的GitLab插件,图中填的是ssh的GitLab地址

Credentials

check outgit 分支代码时的凭证,如果已经添加过对应的凭证,可以直接选择;如果没有添加过,点击添加按钮添加:

134aaf7205997b68627c664ea5c325c6.png

凭证类型会有很多种,如图:

06fbc2cd5beafb10f5feb46c359f905d.png

根据Git来说,常使用的凭证是Username with passwordSSH Username with private key,GitLab也可以添加GitLab API token

添加凭证的凭证会出现在credentials插件里面。可以通过首页的系统管理Manage Credentials去更新凭证

Username with password
  1. 范围:通用选项,一般就选全局。
  2. 用户名:Git账号的用户名
  3. 密码:Git账号的密码
  4. ID:通用选项,不填的话会自动生成,也可以填
  5. 描述:通用选项,凭据的描述
SSH Username with private key
  1. Username:用户名
  2. Private Key:电脑上的SSH私钥,ssh相关公私钥一般在~/.ssh文件夹里面,终端执行命令cat ~/.ssh/id_rsa,然后复制全部内容(包含-----BEGIN OPENSSH PRIVATE KEY----------END OPENSSH PRIVATE KEY-----)。勾选Enter directly,然后点击Add,粘贴上面的私钥进去。
  3. Passphrase:密码,没有详细说明用途,一般有私钥就够了。
GitLab API token

需要去GitLab网站上申请一个API token

f65594880556fc5a50912f3445aa8aa6.png

填好相关信息后,下面的Create personal access token按钮会亮起,点击生成API token

cb1dc87c8101b16509e14b7b9c7d4e00.png

添加好凭证之后,可以在左边直接选择凭证

edca2d26387571a74b5b704ef12462b2.png


Branches to build

指定分支(为空时代表any)

默认是*/master,可以改成参数化构建过程里面配置的Git分支参数*/${git_branch}

构建触发器

选择触发构建的方式,因为目前是手动触发,这里暂时不配置

构建环境

b6197a9acf277e7e1df6fd2970b64a9b.png

Delete workspace before build starts

构建开始前删除工作空间

Use secret text(s) or file(s)

使用秘钥文本或者文件,允许您获取各种类型的凭据,并在shell构建步骤中使用它们。每个绑定都将定义一个环境变量。

Abort the build if it's stuck

构建超时时自动中断


构建*

这一步比较重要,添加构建步骤Xcode,然后配置好参数

General build settings

配置说明
Development Team开发团队,需要在jenkins全局配置中创建一个开发团队来配置
Development Team ID开发团队ID,上面没配置就填这里
Use Legacy Build System?是否使用旧的构建系统;Xcode10以后都是默认使用新构建系统了,不用勾选
Target指定Target名称,后面配置Schema name,此处不需要配置

填写好Development Team IDTarget,点击setting展开更多配置信息。

配置说明
Clean before build?编译前先clean一次,避免垃圾缓存导致报错。
Allow failing build results?是否允许编译失败的结果,如果xcodebuild以非零返回码退出,选中此选项将防止构建步骤失败。 这对于运行单元测试的构建步骤和发布单元测试结果的构建后任务可能很有用:测试步骤不会因为失败的单元测试而让整个构建失败,而是会在“发布测试”阶段将构建标记为不稳定。
No Console Log不打印xcode build日志
Logfile Output directory指定xcodebuild日志的输出目录。 如果您将其留空,它将与其他日志一起输出到“project directory/builds/${BUILD_NUMBER}/log”。 如果指定了输出路径,则输出为“构建输出目录”下的相对目录中的xcodebuild.log文件。
ResultBundlePath指定要输出测试结果的目录。 如果您将其留空,它将不会输出测试结果,也不会分析测试结果。 如果指定了输出路径,它将作为测试结果输出到“ResultBundlePath”下的相对目录中。 插件在这里分析测试结果,并在${WORKSPACE}/test-reports下输出一个JUnit兼容的XML文件。
Clean ResultBundlePath调用构建之前先删除ResultBundlePath。
Configuration这是Xcode项目中定义的配置名称。 默认情况下有DebugRelease配置。
Xcode Schema Filexcode项目的Scheme名称,如果想要生成Archive或者IPA文件,需要填写指定的Scheme。它优先于“Xcode Configuration”和“Target”参数。如果同时填写了Target和Schema,将会报错: Scheme and target can not be specified at the same time.
Generate Archive选中此选项将在构建目录中创建一个.xcarchive .app。 您必须指定一个Scheme来执行存档。勾选
Pack application, build and sign .ipa设置打包应用时的编译和签名参数;勾选
Export method导出方式,就是xcode选择app-storead-hocenterprisedevelopment
.ipa filename patternipa文件名模板。填一个指定名称,不用环境变量,方便后面脚本上传IPA文件
Output directory输出路径,${WORKSPACE}/build
Upload BitcodeApp Store模式下导出的包是否需要BitCode; 取消勾选
Upload Symbols是否上传符号表,取消勾选
Compile Bitcode是否重新编译Bitcode并导出非App Store的IPA包,取消勾选

ipa文件名模板:


${BASE_NAME}	archive的名称
${VERSION}	Info.plist 里面 CFBundleVersion 版本号
${SHORT_VERSION}	Info.plist 里面 CFBundleShortVersionString 版本号
${BUILD_DATE}	构建日期 (yyyy.MM.dd)

Code signing & OS X keychain options

这里设置打包证书相关

配置名说明
Automatic Signing自动配置证书,相当于xcode里面勾选Automatically manage signing勾选
Read from Xcode Project从Xcode的project文件里面读取BundleIDProvisioning profile UUID,此选项需要设置General build settings里面的ConfigurationExport method
Manual signing手动配置签名。需要自己配置Bundle IDProvisioning profile UUID
Change bundle ID修改项目的BundleID,需要填入New bundle IDInfo.plist path,类似于${WORKSPACE}/ProjectName/Project-Info.plist
Unlock Keychain?自动解锁Keychain;需要设置Keychain pathKeychain password;就是Keychain文件的路径(默认:${HOME}/Library/Keychains/login.keychain-db)和开机密码勾选

Advanced Xcode build options

配置说明
SDK只有当您想要指定要构建的SDK时,才需要提供这个值。如果为空,则SDK将由Xcode确定。如果你想运行OCUnit测试,你将需要使用iPhone模拟器的SDK,例如:/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.1.sdk/不填
SYMROOT只有当你想指定要使用的SYMROOT路径时,你才需要提供这个值。 如果为空,将使用默认的SYMROOT路径(它可能会因你的Xcode版本不同而不同)。不填
Custom xcodebuild arguments自定义xcodebuild参数,添加在jenkins根据配置的其余部分生成的命令之后。不填
Xcode Workspace Fileworkspace文件名,如果使用了CocoaPods,需要填写。${WORKSPACE}/Ymh
Xcode Project Directory这是从工作区到包含Xcode项目文件的目录的相对路径。只有当你想要构建的Xcode项目不在工作区的根目录下时,你才需要提供这个值。
Xcode Project File如果在项目路径中有多个Xcode项目文件,你需要指定你想要构建的项目的文件名。 如果你需要构建所有的项目,你需要为每个项目手动创建一个Xcode构建步骤。
Build output directorybuild产物输出路径,如${WORKSPACE}/build${WORKSPACE}/build

Versioning

指定版本号,如果使用此配置修改版本号,需要注意最后的包是否成功修改了版本号。

配置说明
Marketing version对应CFBundleShortVersionString
Technical version对应CFBundleVersion

构建任务

7509b079a919e000c64f0841f80365f2.png

点击构建按钮,开始构建任务,构建执行状态会出现在网页左边:

975e4d887eb3e5d2498a809dd79e33ef.png

可以在首页任务列表里面查看到构建结果

63143e449c71eac81209100f6a71e616.png

点击#4进入构建详情页面(不一定是4,第n次构建就是#n),点击控制台输出查看具体日志。

ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.

19e3f67ca31af7ef806072429382920a.png

可能是配置Git分支的时候填了环境变量${git_branch},改为main或者其它,具体以实际分支为准。

修改后重新构建,又报错:

xcodebuild: error: '/Users/yoctech/.jenkins/workspace/Ymh/Ymh.xcworkspace.xcworkspace' does not exist.

xcodebuild: error: '/Users/yoctech/.jenkins/workspace/Ymh/Ymh.xcworkspace.xcworkspace' does not exist.

应该是配置Xcode Workspace File时,文件名不应该加后缀,修改后重试:

xcodebuild: error: '/Users/yoctech/.jenkins/workspace/Ymh/Ymh.xcworkspace' does not exist.

xcodebuild: error: '/Users/yoctech/.jenkins/workspace/Ymh/Ymh.xcworkspace' does not exist.

去文件路径下看了一眼,确实没有xcworkspace文件。原因很明显,Git上忽略了CocoaPods相关的代码,要么把整个项目连带xcworkspace文件Pod文件夹上传到Git上,要么构建时先执行一次pod install:

进入构建增加构建步骤执行 shell,增加shell命令:

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
pod install --verbose --no-repo-update

shell步骤拖到xcode步骤前面,保存,重新构建,报错如下:

pod: command not found

+ pod install --verbose --no-repo-update
/var/folders/my/lfzt3rzd17j8p9dxq23dp_t00000gn/T/jenkins4473868841716980834.sh: line 5: pod: command not found
Build step 'Execute shell' marked build as failure
Finished: FAILURE

找不到pod命令。

终端执行echo $PATH,输出所有的环境变量,复制内容。

/usr/local/opt/sqlite/bin:/usr/local/opt/gnu-getopt/bin:/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home/bin:/Users/yoctech/development/flutter/bin:/Users/yoctech/.rbenv/shims:/Users/yoctech/.rbenv/bin:/Users/yoctech/.rbenv/shims:/usr/local/opt/openssl@1.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:.

进入首页系统管理系统配置。在全局属性下勾选环境变量,新增键值对,键为Path,值为刚刚复制的内容,点击保存。重新构建

执行pod install时 很容易443报错,需要重复构建直到pod install 完成。又报错:

DVTPortalServiceErrorDomain Code=1100 "Your session has expired. Please log in."

报错日志可以看到:

2022-01-21 16:55:22.736 xcodebuild[2188:7840551]  DVTPortal: Error:
Error Domain=DVTPortalServiceErrorDomain Code=1100 "Your session has expired. Please log in." UserInfo={payload={
    creationTimestamp = "2022-01-21T08:55:22Z";
    httpCode = 200;
    protocolVersion = QH65B2;
    requestUrl = "https://developerservices2.apple.com/services/QH65B2/viewDeveloper.action";
    responseId = "d9cd7504-5792-4a89-9737-f030a34dc7fa";
    resultCode = 1100;
    resultString = "Your session has expired. Please log in.";
    userLocale = "en_US";
    userString = "Your session has expired. Please log in.";
}, NSLocalizedDescription=Your session has expired. Please log in.}
...
error: The operation couldn’t be completed. Unable to log in with account '开发者账号'. The login details for account '开发者账号' were rejected. (in target 'Ymh' from project 'Ymh')
...
Build step 'Xcode' marked build as failure
Finished: FAILURE

打开xcode,进入PreferencesAccounts,重新登录或者移除失效的开发者账号。重新编译

DTDKRemoteDeviceConnection: Failed to start remote service "com.apple.mobile.notification_proxy"

打印日志如下:

2022-01-21 17:07:38.154 xcodebuild[7807:7860754]  DTDKRemoteDeviceConnection: Failed to start remote service "com.apple.mobile.notification_proxy" on device. Error: Error Domain=com.apple.dtdevicekit Code=811 "Failed to start remote service "com.apple.mobile.notification_proxy" on device." UserInfo={NSUnderlyingError=0x7fa481995490 {Error Domain=com.apple.dt.MobileDeviceErrorDomain Code=-402653158 "The device is passcode protected." UserInfo={MobileDeviceErrorCode=(0xE800001A), com.apple.dtdevicekit.stacktrace=(
	0   DTDeviceKitBase                     0x0000000127bfe316 DTDKCreateNSErrorFromAMDErrorCode + 220
	1   DTDeviceKitBase                     0x0000000127c0dea4 __63-[DTDKRemoteDeviceConnection startFirstServiceOf:unlockKeybag:]_block_invoke + 625
	2   DTDeviceKitBase                     0x0000000127c0d59a __48-[DTDKRemoteDeviceConnection futureWithSession:]_block_invoke_3 + 22
	3   DTDeviceKitBase                     0x0000000127c00634 __DTDKExecuteInSession_block_invoke_2 + 35
	4   DTDeviceKitBase                     0x0000000127bffcd9 __DTDKExecuteWithConnection_block_invoke_2 + 218
	5   DTDeviceKitBase                     0x0000000127bffbd6 __DTDKExecuteWithConnection_block_invoke + 106
	6   libdispatch.dylib                   0x00007fff20266806 _dispatch_client_callout + 8
	7   libdispatch.dylib                   0x00007fff202735ce _dispatch_lane_barrier_sync_invoke_and_complete + 60
	8   DVTFoundation                       0x0000000106a8ddc2 DVTDispatchBarrierSync + 208
	9   DVTFoundation                       0x0000000106a622a6 -[DVTDispatchLock performLockedBlock:] + 60
	10  DTDeviceKitBase                     0x0000000127bffad9 DTDKExecuteWithConnection + 226
	11  DTDeviceKitBase                     0x0000000127c004da DTDKExecuteInSession + 239
	12  DTDeviceKitBase                     0x0000000127c0d3ec __48-[DTDKRemoteDeviceConnection futureWithSession:]_block_invoke_2 + 131
	13  DVTFoundation                       0x0000000106a8bc07 __DVT_CALLING_CLIENT_BLOCK__ + 7
	14  DVTFoundation                       0x0000000106a8d373 __DVTDispatchAsync_block_invoke + 931
	15  libdispatch.dylib                   0x00007fff20265623 _dispatch_call_block_and_release + 12
	16  libdispatch.dylib                   0x00007fff20266806 _dispatch_client_callout + 8
	17  libdispatch.dylib                   0x00007fff2026c5ea _dispatch_lane_serial_drain + 606
	18  libdispatch.dylib                   0x00007fff2026d0e0 _dispatch_lane_invoke + 417
	19  libdispatch.dylib                   0x00007fff20276c0d _dispatch_workloop_worker_thread + 811
	20  libsystem_pthread.dylib             0x00007fff2040d45d _pthread_wqthread + 314
	21  libsystem_pthread.dylib             0x00007fff2040c42f start_wqthread + 15
), DVTRadarComponentKey=261622, NSLocalizedDescription=The device is passcode protected.}}, NSLocalizedRecoverySuggestion=Please check your connection to your device., DVTRadarComponentKey=261622, NSLocalizedDescription=Failed to start remote service "com.apple.mobile.notification_proxy" on device.}
Build description signature: d7a0a76b968eacac2535edd8c54247ce
Build description path: /Users/用户名/Library/Developer/Xcode/DerivedData/Ymh-dfjnhagseflofqaggafszzpypbrh/Build/Intermediates.noindex/ArchiveIntermediates/Ymh/IntermediateBuildFilesPath/XCBuildData/d7a0a76b968eacac2535edd8c54247ce-desc.xcbuild

note: Build preparation complete
note: Building targets in parallel
/Users/用户名/.jenkins/workspace/Ymh/Pods/Pods.xcodeproj: warning: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.0.99. (in target 'TagListView' from project 'Pods')
error: No account for team "********". Add a new account in the Accounts preference pane or verify that your accounts have valid credentials. (in target 'Ymh' from project 'Ymh')
error: No profiles for '********' were found: Xcode couldn't find any iOS App Development provisioning profiles matching '********'. (in target 'Ymh' from project 'Ymh')
...
Build step 'Xcode' marked build as failure
Finished: FAILURE

通过No account for team ...可以发现,应该是配置里面的TeamID填写错误,通过开发者网站或者XcodeBuild Setting 里面查看DEVELOPMENT_TEAM,拿到正确的TeamID,修改任务的配置。重新构建:

CompileSwift normal arm64 & CompileSwiftSources normal arm64

The following build commands failed:
    CompileSwift normal arm64 (in target 'Ymh' from project 'Ymh')
    CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler (in target 'Ymh' from project 'Ymh')
(2 failures)
Build step 'Xcode' marked build as failure
Finished: FAILURE

直接去文件夹/Users/用户名/.jenkins/workspace/Ymh手动用Xcode编译项目,发现确实会报错;因为执行pod install 时,Git上没有podfile.lock文件,更新了第三方库的版本,导致编译失败。

如果使用的是Source Tree,它的Git模板里面,默认忽略掉了podfile.lock,需要删除这一行。

bc8a8440012959c588bd4e61ce19dde3.png

在项目主文件夹里手动修复报错,顺便把podfile.lock文件添加到Git里面,提交代码到远端。重新构建:

构建成功!

上传到fir.im

安装 fir-cli

gem install fir-cli

增加构建后操作

安装完fir-cli之后,进入任务配置构建后操作执行 shell,(没找到构建后操作里面有执行shell,换到构建操作里面增加此步骤)

fir p ${WORKSPACE}/build/ymh.ipa -T #API Token#

API Token在fir网页上获取,然后替换到#API Token#(包括#号)。

c6a02a7e0d9e7c17ce0ed08986d17e38.png

重新构建,构建成功:

+ fir p /Users/yoctech/.jenkins/workspace/Ymh/build/ymh.ipa -T ******
I, [2022-01-24T10:52:47.695613 #56169]  INFO -- : Fetching com.youmihua.Ymh@fir.im uploading info......
I, [2022-01-24T10:52:47.695679 #56169]  INFO -- : Uploading app: Ymh-1.0.0(Build 1)
I, [2022-01-24T10:52:48.057452 #56169]  INFO -- : Publishing app via ***<***@163.com>.......
I, [2022-01-24T10:52:48.057484 #56169]  INFO -- : ✈ -------------------------------------------- ✈
I, [2022-01-24T10:52:48.057492 #56169]  INFO -- : begin to upload ...
I, [2022-01-24T10:52:48.057502 #56169]  INFO -- : fir-cli version 2.0.14 (2.7.3 @ x86_64-darwin20)
D, [2022-01-24T10:52:48.057521 #56169] DEBUG -- : begin to upload icon
D, [2022-01-24T10:52:48.057609 #56169] DEBUG -- : icon_url = https://fir-app-icon.oss-cn-beijing.aliyuncs.com/***, icon_info = #<File:0x00007f92b3268a70>
D, [2022-01-24T10:52:48.633916 #56169] DEBUG -- : begin to callback api
D, [2022-01-24T10:52:48.864792 #56169] DEBUG -- : callback api finished
D, [2022-01-24T10:52:48.864820 #56169] DEBUG -- : upload icon finished
D, [2022-01-24T10:52:48.864833 #56169] DEBUG -- : begin to upload binary ...
D, [2022-01-24T10:52:48.864930 #56169] DEBUG -- : binary_url = https://fir-app-binary.oss-cn-beijing.aliyuncs.com/**, binary_info = #<File:0x00007f92b6290d88>
D, [2022-01-24T10:52:48.864944 #56169] DEBUG -- : {"CONTENT-DISPOSITION"=>"attachment; filename* = UTF-8''ymh.ipa", "Content-Type"=>"application/octet-stream", "date"=>"Mon, 24 Jan 2022 02:52:48 GMT", "x-oss-date"=>"Mon, 24 Jan 2022 02:52:48 GMT", "authorization"=>"OSS LTAIH45wjMAbqQjW:9ZhCMhEkrbzC8k0K2/IJNJgS3yw="}
D, [2022-01-24T10:53:15.396066 #56169] DEBUG -- : begin to callback api
D, [2022-01-24T10:53:16.288589 #56169] DEBUG -- : callback api finished
D, [2022-01-24T10:53:16.288627 #56169] DEBUG -- : upload binary ... finished
I, [2022-01-24T10:53:16.288699 #56169]  INFO -- : File uploaded. During: 28 seconds, Upload Speed: 898 KB/s 
I, [2022-01-24T10:53:16.288761 #56169]  INFO -- : App id is **
I, [2022-01-24T10:53:16.288768 #56169]  INFO -- : Release id is **
I, [2022-01-24T10:53:16.288776 #56169]  INFO -- : Updating devices info......
I, [2022-01-24T10:53:16.526006 #56169]  INFO -- : Fetch app info from fir.im
I, [2022-01-24T10:53:16.763588 #56169]  INFO -- : end upload
I, [2022-01-24T10:53:16.763615 #56169]  INFO -- : ✈ -------------------------------------------- ✈
I, [2022-01-24T10:53:16.763628 #56169]  INFO -- : Published succeed: http://d.maps9.com/**
I, [2022-01-24T10:53:17.544613 #56169]  INFO -- : 
Finished: SUCCESS

打开网页,可以看到生成的二维码,同时也有一个二维码图片保存在build目录,不过二维码界面app的icon显示的是默认的icon,没有显示app的icon。

fir-cli相关命令

参考链接 github.com/FIRHQ/fir-c…

Usage:
  fir publish APP_FILE_PATH

Options:
  -s, [--short=SHORT]                                                        # 设置short
  -c, [--changelog=CHANGELOG]                                                # 设置更新内容, 可是文件地址也可直接是内容
  -Q, [--qrcode], [--no-qrcode]                                              # 生成二维码图片在当前目录
      [--need-ansi-qrcode], [--no-need-ansi-qrcode]                          # 
  -R, [--need-release-id], [--no-need-release-id]                            # 在下载地址中包含具体版本(警告, 每个app 最多保留30个版本, 超过后会失效最老的版本)
  -H, [--force-pin-history], [--no-force-pin-history]                        # 将版本留在下载页(即在新版本上传后, 下面仍然有旧版本的二维码可以引导)
  -S, [--skip-update-icon], [--no-skip-update-icon]                          # 跳过更新图标
      [--specify-icon-file=SPECIFY_ICON_FILE]                                # 指定更新图标
      [--skip-fir-cli-feedback], [--no-skip-fir-cli-feedback]                # 跳过 用来做统计fir-cli的反馈(用于改进fir-cli)
      [--specify-app-display-name=SPECIFY_APP_DISPLAY_NAME]                  # 指定app 名称
  -N, [--switch-to-qiniu], [--no-switch-to-qiniu]                            # 切换到七牛线路上传(当上传较慢时, 可试试这个)
      [--oversea-turbo], [--no-oversea-turbo]                                # 海外加速(需联系微信 atpking 开通)
  -m, [--mappingfile=MAPPINGFILE]                                            # mappingfile
  -D, [--dingtalk-access-token=DINGTALK_ACCESS_TOKEN]                        # 上传完毕后 若发送至钉钉, 则填写钉钉的webhook 的access_token
      [--dingtalk-custom-message=DINGTALK_CUSTOM_MESSAGE]                    # 自定义钉钉消息 (针对钉钉新版webhook 需要校验的时候, 可以做关键字)
      [--dingtalk-at-phones=DINGTALK_AT_PHONES]                              # 钉钉  at 某人手机号
      [--dingtalk-at-all], [--no-dingtalk-at-all]
      [--feishu-access-token=FEISHU_ACCESS_TOKEN]                            # 飞书的webhook 的access_token
      [--feishu-custom-title=FEISHU_CUSTOM_TITLE]                            # 自定义飞书消息标题
      [--feishu-custom-message=FEISHU_CUSTOM_MESSAGE]                        # 自定义飞书消息内容
      [--wxwork-webhook=WXWORK_WEBHOOK]                                      # 企业微信的 webhook 地址 (注意这里与 access_token 只需要填写一个参数即可)
      [--wxwork-access-token=WXWORK_ACCESS_TOKEN]                            # 企业微信的 webhook access_token (注意这里与 access_token 只需要填写一个参数即可)
      [--wxwork-custom-message=WXWORK_CUSTOM_MESSAGE]                        # 企业微信 的自定义消息
      [--wxwork-pic-url=WXWORK_PIC_URL]                                      # 企业微信的图片链接, best size is 1068x455
      [--open], [--no-open]                                                  # 是否下载可见, 默认open
      [--password=PASSWORD]                                                  # 下载页面密码, 默认为空
      [--bundletool-jar-path=BUNDLETOOL_JAR_PATH]                            # (beta) 上传AAB 文件的特殊指令: upload aab file command:  to specify bundletool.jar if command bundletool can not run directly
      [--auto-download-bundletool-jar], [--no-auto-download-bundletool-jar]  # (beta) 上传AAB 文件的特殊指令: upload aab file command: would download bundletool when invoke bundletool failure
  -T, [--token=TOKEN]                                                        # betaqr.com(fir.im) 账户的 API_TOKEN
  -L, [--logfile=LOGFILE]                                                    # Path to writable logfile
  -V, [--verbose], [--no-verbose]                                            # Show verbose
                                                                             # Default: true
  -q, [--quiet], [--no-quiet]                                                # Silence commands
  -h, [--help], [--no-help]                                                  # Show this help message and quit

Description:
  `publish` command will publish your app file to fir.im, also the command support to publish app's short & changelog.

  Example:

  $ fir p <app file path> [-c <changelog> -s <custom short link> -Q -T <your api token>]

  $ fir p <app file path> [-c <changelog> -s <custom short link> --password=123456 --open=false -Q -T <your api token>]

  $ fir p <app file path> [-c <changelog> -s <custom short link> -m <mapping file path> -P <bughd project id> -Q -T <your
  api token>]

`

卸载

sudo rm -rf /Users/Shared/Jenkins
sudo dscl . -delete /Users/jenkins
sudo dscl . -delete /Groups/jenkins
sudo rm -f /etc/newsyslog.d/jenkins.conf
pkgutil --pkgs | grep 'org\.jenkins-ci\.' | xargs -n 1 sudo pkgutil —forget