手把手教你利用Jenkins持续集成iOS项目

作者: 一缕殇流化隐半边冰霜 | 来源:发表于2016-07-31 15:04 被阅读71086次

前言

众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段。用户们都是很挑剔的。如果一个公司的推广团队好不容易砸了重金推广了一个APP,好不容易有了一些用户,由于一次线上的bug导致一批的用户在使用中纷纷出现闪退bug,轻则,很可能前期推广砸的钱都白费了,重则,口碑不好,未来也提升不起用户量来了。静下心来分析一下问题的原因,无外乎就是质量没有过关就上线了。除去主观的一些因素,很大部分的客观因素我觉得可以被我们防范的。根据大神们提出的一套开发规范建议,CI + FDD,就可以帮助我们极大程度的解决客观因素。本文接下来主要讨论 Continuous Integration 持续集成(简称CI)

目录

  • 1.为什么我们需要持续集成
  • 2.持续化集成工具——Jenkins
  • 3.iOS自动化打包命令——xcodebuild + xcrun 和 fastlane - gym 命令
  • 4.打包完成自动化上传 fir / 蒲公英 第三方平台
  • 5.完整的持续集成流程
  • 6.Jenkins + Docker

一. 为什么我们需要持续集成

谈到为什么需要的问题,我们就需要从什么是来说起。那什么是持续集成呢。

持续集成是一种软件开发实践:许多团队频繁地集成他们的工作,每位成员通常进行日常集成,进而每天会有多种集成。每个集成会由自动的构建(包括测试)来尽可能快地检测错误。许多团队发现这种方法可以显著的减少集成问题并且可以使团队开发更加快捷。

CI是一种开发实践。实践应该包含3个基本模块,一个可以自动构建的过程,自动编译代码,可以自动分发,部署和测试。一个代码仓库,SVN或者Git。最后一个是一个持续集成的服务器。通过持续集成,可以让我们通过自动化等手段高频率地去获取产品反馈并响应反馈的过程。

那么持续集成能给我们带来些什么好处呢?这里推荐一篇文章,文章中把Continuous integration (CI) and test-driven development (TDD)分成了12个步骤。然而带来的好处成倍增加,有24点好处。

我来说说用了CI以后带来的一些深有体会的优点。

1. 缩减开发周期,快速迭代版本

每个版本开始都会估算好开发周期,但是总会因为各种事情而延期。这其中包括了一些客观因素。由于产品线增多,迭代速度越来越快,给测试带来的压力也越来越大。如果测试都在开发完全开发完成之后再来测试,那就会影响很长一段时间。这时候由于集成晚就会严重拖慢项目节奏。如果能尽早的持续集成,尽快进入上图的12步骤的迭代环中,就可以尽早的暴露出问题,提早解决,尽量在规定时间内完成任务。

2. 自动化流水线操作带来的高效

其实打包对于开发人员来说是一件很耗时,而且没有很大技术含量的工作。如果开发人员一多,相互改的代码冲突的几率就越大,加上没有产线管理机制,代码仓库的代码质量很难保证。团队里面会花一些时间来解决冲突,解决完了冲突还需要自己手动打包。这个时候如果证书又不对,又要耽误好长时间。这些时间其实可以用持续集成来节约起来的。一天两天看着不多,但是按照年的单位来计算,可以节约很多时间!

3. 随时可部署

有了持续集成以后,我们可以以天为单位来打包,这种高频率的集成带来的最大的优点就是可以随时部署上线。这样就不会导致快要上线,到处是漏洞,到处是bug,手忙脚乱弄完以后还不能部署,严重影响上线时间。

4. 极大程度避免低级错误

我们可以犯错误,但是犯低级错误就很不应该。这里指的低级错误包括以下几点:编译错误,安装问题,接口问题,性能问题。
以天为单位的持续集成,可以很快发现编译问题,自动打包直接无法通过。打完包以后,测试扫码无法安装,这种问题也会立即被暴露出来。接口问题和性能问题就有自动化测试脚本来发现。这些低级问题由持续集成来暴露展现出来,提醒我们避免低级错误。

二. 持续化集成工具——Jenkins

Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。

根据官方定义,Jenkins有以下的用途:

  1. 构建项目
  2. 跑测试用例检测bug
  3. 静态代码检测
  4. 部署

关于这4点,实际使用中还是比较方便的:
1.构建项目自动化打包可以省去开发人员好多时间,重要的是,Jenkins为我们维护了一套高质量可用的代码,而且保证了一个纯净的环境。我们经常会出现由于本地配置出错而导致打包失败的情况。现在Jenkins就是一个公平的评判者,它无法正确的编译出ipa,那就是有编译错误或者配置问题。开发人员没必要去争论本地是可以运行的,拉取了谁谁谁的代码以后就不能运行了。共同维护Jenkins的正常编译,因为Jenkins的编译环境比我们本地简单的多,它是最纯净无污染的编译环境。开发者就只用专注于编码。这是给开发者带来的便利。

2.这个可以用来自动化测试。在本地生成大批的测试用例。每天利用服务器不断的跑这些用例。每天每个接口都跑一遍。看上去没必要,但是实际上今天运行正常的系统,很可能由于今天的代码改动,明天就出现问题了。有了Jenkins可以以天为单位的进行回归测试,代码只要有改动,Jenkins就把所有的回归测试的用例全部都跑一遍。在项目工期紧张的情况下,很多情况测试都不是很重视回归测试,毕竟很可能测一遍之后是徒劳的“无用功”。然而由于回归测试不及时,就导致到最后发版的时候系统不可用了,这时候回头查找原因是比较耗时的,查看提交记录,看到上百条提交记录,排查起来也是头疼的事情。以天为单位的回归测试能立即发现问题。测试人员每天可以专注按单元测试,一周手动一次回归测试。这是给测试者带来的便利。

3.这个是静态代码分析,可以检测出很多代码的问题,比如潜在的内存泄露的问题。由于Jenkins所在环境的纯净,还是可以发现一些我们本地复杂环境无法发现的问题,进一步的提高代码质量。这是给质检带来的便利。

4.随时部署。Jenkins在打包完成之后可以设定之后的操作,这个时候往往就是提交app到跑测试用例的系统,或者部署到内测平台生成二维码。部署中不能安装等一些低级问题随之立即暴露。测试人员也只需要扫一下二维码即可安装,很方便。这也算是给测试带来的便利。

以下的例子以2016-07-24 22:35的Weekly Release 2.15的版本为例。

我们来开始安装Jenkins。从官网https://jenkins.io/ 上下载最新的pkg安装包。

也可以下载jenkins.war, 然后运行Java -jar jenkins.war,进行安装。

安装完成之后,Safari可能会自动打开,如果没有自动打开,打开浏览器,输入http://localhost:8080

这个时候可能会报一个错误。如果出现了这面的问题。出现这个问题的原因就是Java环境有问题,重新Java环境即可。

这个时候如果你重启电脑会发现Jenkins给你新增了一个用户,名字就叫Jenkins,不过这个时候你不知道密码。你可能会去试密码,肯定是是不对的,因为初始密码很复杂。这个时候正确做法是打开http://localhost:8080 会出现下图的重设初始密码的界面。

按照提示,找到/Users/Shared/Jenkins/Home/ 这个目录下,这个目录虽然是共享目录,但是有权限的,非Jenkins用户/secrets/目录是没有读写权限的。


打开initialAdminPassword文件,复制出密码,就可以填到网页上去重置密码了。如下图

一路安装过来,输入用户名,密码,邮件这些,就算安装完成了。

还是继续登录localhost:8080 ,选择“系统管理”——“管理插件”,我们要先安装一些辅助插件。

安装GitLab插件
因为我们用的是GitLab来管理源代码,Jenkins本身并没有自带GitLab插件,所以我们需要依次选择 系统管理->管理插件,在“可选插件”中选中“GitLab Plugin”和“Gitlab Hook Plugin”这两项,然后安装。

安装Xcode插件
同安装GitLab插件的步骤一样,我们依次选择系统管理->管理插件,在“可选插件”中选中“Xcode integration”安装。

安装完了这个,我们就可以配置一个构建项目了。

点击新建好的项目,进来配置一下General参数。

这里可以设置包的保留天数还有天数。

接着设置源码管理

由于现在我用到的是GitLab,先配置SSH Key,在Jenkins的证书管理中添加SSH。在Jenkins管理页面,选择“Credentials”,然后选择“Global credentials (unrestricted)”,点击“Add Credentials”,如下图所示,我们填写自己的SSH信息,然后点击“Save”,这样就把SSH添加到Jenkins的全局域中去了。

如果正常的配置正确的话,是不会出现下图中的那段红色的警告。如果有下图的提示,就说明Jenkins还没有连通GitLab或者SVN,那就请再检查SSH Key是否配置正确。

构建触发器设置这里是设置自动化测试的地方。这里涉及的内容很多,暂时我也没有深入研究,这里暂时先不设置。有自动化测试需求的可以好好研究研究这里的设置。

不过这里有两个配置还是需要是配置的

Poll SCM (poll source code management) 轮询源码管理
需要设置源码的路径才能起到轮询的效果。一般设置为类似结果: 0/5 * * * * 每5分钟轮询一次
Build periodically (定时build)
一般设置为类似: 00 20 * * * 每天 20点执行定时build 。当然两者的设置都是一样可以通用的。

格式是这样的

分钟(0-59) 小时(0-23) 日期(1-31) 月(1-12) 周几(0-7,0和7都是周日) 更加详细的设置看这里

构建环境设置
iOS打包需要签名文件和证书,所以这部分我们勾选“Keychains and Code Signing Identities”和“Mobile Provisioning Profiles”。
这里我们又需要用到Jenkins的插件,在系统管理页面,选择“Keychains and Provisioning Profiles Management”。

进入Keychains and Provisioning Profiles Management页面,点击“浏览”按钮,分别上传自己的keychain和证书。上传成功后,我们再为keychain指明签名文件的名称。点击“Add Code Signing Identity”,最后添加成功后如下图所示:


注意:我第一次导入证书和Provisioning Profiles文件,就遇到了一点小“坑”,我当时以为是需要证书,但是这里需要的Keychain,并不是cer证书文件。这个Keychain其实在/Users/管理员用户名/Library/keychains/login.keychain,当把这个Keychain设置好了之后,Jenkins会把这个Keychain拷贝到/Users/Shared/Jenkins/Library/keychains这里,(Library是隐藏文件)。Provisioning Profiles文件也直接拷贝到/Users/Shared/Jenkins/Library/MobileDevice文件目录下。

这样Adhoc证书和签名文件就在Jenkins中配置好了,接下来我们只需要在item设置中指定相关文件即可。
回到我们新建的item,找到构建环境,按下图选好自己的相关证书和签名文件。

接下来在进行构建的设置

我们这里选择执行一段打包脚本。脚本在下一章节详细的讲解。

构建后操作

这里我们选择Execute a set of scripts,这里也是一个脚本,这个脚本用来上传自动打包好的ipa文件。脚本在第四章节有详细的讲解。

至此,我们的Jenkins设置就全部完成了。点击构建,就会开始构建项目了。

构建一次,各个颜色代表的意义如下:


天气的晴雨表代表了项目的质量,这也是Jenkins的一个特色。


如果构建失败了,可以去查看Console Output可以查看log日志。

三. iOS自动化打包命令——xcodebuild + xcrun 和 fastlane - gym 命令

在日常开发中,打包是最后上线不可缺少的环节,如果需要把工程打包成 ipa 文件,通常的做法就是在 Xcode 里点击 「Product -> Archive」,当整个工程 archive 后,然后在自动弹出的 「Organizer」 中进行选择,根据需要导出 ad hoc,enterprise 类型的 ipa 包。虽然Xcode已经可以很完美的做到打包的事情,但是还是需要我们手动点击5,6下。加上我们现在需要持续集成,用打包命令自动化执行就顺其自然的需要了。

1. xcodebuild + xcrun命令

Xcode为我们开发者提供了一套构建打包的命令,就是xcodebuild
和xcrun命令。xcodebuild把我们指定的项目打包成.app文件,xcrun将指定的.app文件转换为对应的.ipa文件。

具体的文档如下, xcodebuild官方文档xcrun官方文档

NAME
xcodebuild – build Xcode projects and workspaces

SYNOPSIS
1. xcodebuild [-project name.xcodeproj] [[-target targetname] … | -alltargets] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

2. xcodebuild [-project name.xcodeproj] -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

3. xcodebuild -workspace name.xcworkspace -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

4. xcodebuild -version [-sdk [sdkfullpath | sdkname]] [infoitem]

5. xcodebuild -showsdks

6. xcodebuild -showBuildSettings [-project name.xcodeproj | [-workspace name.xcworkspace -scheme schemename]]

7. xcodebuild -list [-project name.xcodeproj | -workspace name.xcworkspace]

8. xcodebuild -exportArchive -archivePath xcarchivepath -exportPath destinationpath -exportOptionsPlist path

9. xcodebuild -exportLocalizations -project name.xcodeproj -localizationPath path [[-exportLanguage language] …]

10. xcodebuild -importLocalizations -project name.xcodeproj -localizationPath path

上面10个命令最主要的还是前3个。

接下来来说明一下参数:
-project -workspace:这两个对应的就是项目的名字。如果有多个工程,这里又没有指定,则默认为第一个工程。
-target:打包对应的targets,如果没有指定这默认第一个。
-configuration:如果没有修改这个配置,默认就是Debug和Release这两个版本,没有指定默认为Release版本。
-buildsetting=value ...:使用此命令去修改工程的配置。
-scheme:指定打包的scheme。

上面这些是最最基本的命令。

上面10个命令的第一个和第二个里面的参数,其中 -target
和 -configuration 参数可以使用 xcodebuild -list
获得,-sdk 参数可由 xcodebuild -showsdks
获得,[buildsetting=value ...] 用来覆盖工程中已有的配置。可覆盖的参数参考官方文档 Xcode Build Setting Reference

build
Build the target in the build root (SYMROOT). This is the default action, and is used if no action is given.

analyze
Build and analyze a target or scheme from the build root (SYMROOT). This requires specifying a scheme.

archive
Archive a scheme from the build root (SYMROOT). This requires specifying a scheme.

test
Test a scheme from the build root (SYMROOT). This requires specifying a scheme and optionally a destination.

installsrc
Copy the source of the project to the source root (SRCROOT).

install
Build the target and install it into the target’s installation directory in the distribution root (DSTROOT).

clean
Remove build products and intermediate files from the build root (SYMROOT).

上面第3个命令就是专门用来打带有Cocopods的项目,因为这个时候项目工程文件不再是xcodeproj了,而是变成了xcworkspace了。

再来说说xcrun命令。

Usage:
PackageApplication [-s signature] application [-o output_directory] [-verbose] [-plugin plugin] || -man || -help

Options:

[-s signature]: certificate name to resign application before packaging
[-o output_directory]: specify output filename
[-plugin plugin]: specify an optional plugin
-help: brief help message
-man: full documentation
-v[erbose]: provide details during operation

参数不多,使用方法也很简单,xcrun -sdk iphoneos -v PackageApplication + 上述一些参数。

参数都了解之后,我们就来看看该如何用了。下面这个是使用了xcodebuild + xcrun命令写的自动化打包脚本

# 工程名
APP_NAME="YourProjectName"
# 证书
CODE_SIGN_DISTRIBUTION="iPhone Distribution: Shanghai ******* Co., Ltd."
# info.plist路径
project_infoplist_path="./${APP_NAME}/Info.plist"

#取版本号
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")

#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")

DATE="$(date +%Y%m%d)"
IPANAME="${APP_NAME}_V${bundleShortVersion}_${DATE}.ipa"

#要上传的ipa文件路径
IPA_PATH="$HOME/${IPANAME}"
echo ${IPA_PATH}
echo "${IPA_PATH}">> text.txt

//下面2行是没有Cocopods的用法
echo "=================clean================="
xcodebuild -target "${APP_NAME}"  -configuration 'Release' clean

echo "+++++++++++++++++build+++++++++++++++++"
xcodebuild -target "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'

//下面2行是集成有Cocopods的用法
echo "=================clean================="
xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}"  -configuration 'Release' clean

echo "+++++++++++++++++build+++++++++++++++++"
xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'

xcrun -sdk iphoneos PackageApplication "./Release-iphoneos/${APP_NAME}.app" -o ~/"${IPANAME}"
2. gym 命令

说到gym,就要先说一下fastlane。
fastlane是一套自动化打包的工具集,用 Ruby 写的,用于 iOS 和 Android 的自动化打包和发布等工作。gym是其中的打包命令。

fastlane 的官网看这里, fastlane 的 github 看这里

要想使用gym,先要安装fastlane。

sudo gem install fastlane --verbose

fastlane包含了我们日常编码之后要上线时候进行操作的所有命令。

deliver:上传屏幕截图、二进制程序数据和应用程序到AppStore
snapshot:自动截取你的程序在每个设备上的图片
frameit:应用截屏外添加设备框架
pem:可以自动化地生成和更新应用推送通知描述文件
sigh:生成下载开发商店的配置文件
produce:利用命令行在iTunes Connect创建一个新的iOS app
cert:自动创建iOS证书
pilot:最好的在终端管理测试和建立的文件
boarding:很容易的方式邀请beta测试
gym:建立新的发布的版本,打包
match:使用git同步你成员间的开发者证书和文件配置
scan:在iOS和Mac app上执行测试用例

整个发布过程可以用fastlane描述成下面这样

lane :appstore do
  increment_build_number
  cocoapods
  xctool
  snapshot
  sigh
  deliver
  frameit
  sh "./customScript.sh"

  slack
end

Ps:这里可能大家还会听过一个命令叫 xctool
xctool是官方xcodebuild命令的一个增强实现,输出的内容比xcodebuild直观可读得多。通过brew即可安装。

brew install xctool

使用gym自动化打包,脚本如下

#计时

SECONDS=0

#假设脚本放置在与项目相同的路径下

project_path=$(pwd)

#取当前时间字符串添加到文件结尾

now=$(date +"%Y_%m_%d_%H_%M_%S")

#指定项目的scheme名称

scheme="DemoScheme"

#指定要打包的配置名

configuration="Adhoc"

#指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development, 和developer-id,即xcodebuild的method参数

export_method='ad-hoc'

#指定项目地址

workspace_path="$project_path/Demo.xcworkspace"

#指定输出路径

output_path="/Users/your_username/Documents/"

#指定输出归档文件地址

archive_path="$output_path/Demo_${now}.xcarchive"

#指定输出ipa地址

ipa_path="$output_path/Demo_${now}.ipa"

#指定输出ipa名称

ipa_name="Demo_${now}.ipa"

#获取执行命令时的commit message

commit_msg="$1"

#输出设定的变量值

echo "===workspace path: ${workspace_path}==="

echo "===archive path: ${archive_path}==="

echo "===ipa path: ${ipa_path}==="

echo "===export method: ${export_method}==="

echo "===commit msg: $1==="

#先清空前一次build

gym --workspace ${workspace_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}

#输出总用时

echo "===Finished. Total time: ${SECONDS}s==="

四. 打包完成自动化上传 fir / 蒲公英 第三方平台

要上传到 fir / 蒲公英 第三方平台,都需要注册一个账号,获得token,之后才能进行脚本化操作。

1. 自动化上传fir

安装fir-clifir的命令行工具
需要先装好ruby再执行

gem install fir-cli
#上传到fir
fir publish ${ipa_path} -T fir_token -c "${commit_msg}"
2.自动化上传蒲公英
#蒲公英上的User Key
uKey="7381f97070*****c01fae439fb8b24e"
#蒲公英上的API Key
apiKey="0b27b5c145*****718508f2ad0409ef4"
#要上传的ipa文件路径
IPA_PATH=$(cat text.txt)

rm -rf text.txt

#执行上传至蒲公英的命令
echo "++++++++++++++upload+++++++++++++"
curl -F "file=@${IPA_PATH}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" http://www.pgyer.com/apiv1/app/upload

五. 完整的持续集成流程

经过上面的持续化集成,现在我们就拥有了如下完整持续集成的流程

六. Jenkins + Docker

关于Jenkins的部署,其实是分以下两种:
单节点(Master)部署
这种部署适用于大多数项目,其构建任务较轻,数量较少,单个节点就足以满足日常开发所需。
多节点(Master-Slave)部署
通常规模较大,代码提交频繁(意味着构建频繁),自动化测试压力较大的项目都会采取这种部署结构。在这种部署结构下,Master通常只充当管理者的角色,负责任务的调度,slave节点的管理,任务状态的收集等工作,而具体的构建任务则会分配给slave节点。一个Master节点理论上可以管理的slave节点数是没有上限的,但通常随着数量的增加,其性能以及稳定性就会有不同程度的下降,具体的影响则因Master硬件性能的高低而不同。

但是多节点部署又会有一些缺陷,当测试用例变得海量以后,会造成一些问题,于是有人设计出了下面这种部署结构,Jenkins + Docker

由于笔者现在的项目还处于单节点(Master)部署,关于多节点(Master-Slave)部署也没有实践经验,改进版本的Docker更是没有接触过,但是如果有这种海量测试用例,高压力的大量复杂的回归测试的需求的,那推荐大家看这篇文章

最后

以上就是我关于Jenkins持续集成的一次实践经验。分享给大家,如果里面有什么错误,欢迎大家多多指教。

相关文章

网友评论

  • 首席科学家:我自己写的自动化部署企业jenkins实战集成部署视频教程,小白可以看看https://blog.csdn.net/u012201811/article/details/81266370
    wg689:连接打不开 大哥
    '
  • SevenJustin:可以说写的非常完整了
  • FengxinLi:jenkins xcode构建里面的有个 Clean before build? YES NO 请问有没有和这个选项一样的功能的xcodebuild命令呢?
  • FengxinLi:请问一下楼主 我项目里面有二个schema jenkins打包出来是二个包?我用参数每次打包我选择的那个schema,但是项目里面没有清除上次打包出来的包,虽然选了一个 但是二个包都展示出来了?请问下怎么用xcodebuild命令清除上次打包包。
  • macfai:你好,大神,请教个问题,如果你的git仓库用的不是gitlab,那你上上面那个插件中,gitlab相关插件就不用安装了 吧?请指教
  • macfai:楼主,你好,请教下,有遇到在unlock页面将密码贴进去之后,出现404的情况吗?
  • 92fb1c18dce6:想请教一下霜神,我们公司由于复杂的权限管理,导致我只够打包出xarchive,不能到ipa。所以gym那条命令可以实现吗?谢谢!
  • me_shane:请问工程中配有多个target该怎么配置呢?
  • 领头羊的幸福生活:Failed to copy /Users/Shared/Jenkins/Home/kpp_upload/YTEnterpriseDist2018.mobileprovision to /Users/yaoligang/Desktop/ea7ea0e7-a833-40d3-93ee-c47e1cad4a04.mobileprovision
    楼主您好 ,请问这个报错是什么意思啊
  • 领头羊的幸福生活:楼主您好 Failed to copy /Users/Shared/Jenkins/Home/kpp_upload/YTEnterpriseDist2018.mobileprovision to /Users/yaoligang/Desktop/ea7ea0e7-a833-40d3-93ee-c47e1cad4a04.mobileprovision
    这个报错是什么意思啊
  • 领头羊的幸福生活:楼主,可以加一下qq吗,1536831937 有些问题想请教一下 :pray:
  • 空山fine:结合这篇看一下效果更好,哈哈,最新版的 jenkins。 https://mp.weixin.qq.com/s/4I9lHEf5TvwwGtVPTjKFUw
  • 7f809f844dbb:大神你好,请问Adhoc证书的操作和企业证书的操作一样吗
  • 改个Id:http://localhost:8080打不开,(这个时候可能会报一个错误。如果出现了这面的问题。出现这个问题的原因就是Java环境有问题,重新Java环境即可。 )重新Java环境即可是什么意思,我java版本为1.6.0_65的,mac系统为10.12.6的。
  • 747071ac3c1d:楼主您好,我按照教程操作,现在遇到Print: Entry, "CFBundleVersion", Does Not Exist,这个你知道是怎么回事吗
  • 只有前进:大神,能加一下QQ么? 有些问题请教一下 。 QQ:1948049031
  • MichalWilson:你好,我是用xcodebuild + xcrun打包的 然后报错CarServiceCoach has conflicting provisioning settings. CarServiceCoach is automatically signed, but code signing identity iPhone Distribution: xxxxxxxxxxx has been manually specified. Set the code signing identity value to "iPhone Developer" in the build settings editor, or switch to manual signing in the project editor. 请问一下如何解决啊????
  • MichalWilson:你好,请问一下执行shell显示成功了 但是为什么没有生成ipa文件啊
  • 听风轻咛:请教一个问题,构建过程勾选了pack application,build and sign .ipa选项,结果如下:

    17:18:31 error: exportArchive: The data couldn’t be read because it isn’t in the correct format.
    17:18:31
    17:18:31 Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/nr/p5w9w9pn4qd4zc7jm7lmw6rr0000gp/T/ipatool-json-filepath-nl8XlB}
    17:18:31
    17:18:31 ** EXPORT FAILED **
    17:18:31

    我看了一下,Archive过程是成功的,且用该.xcachivexc用xcode导出ipa是成功的;
    所以,我想请教怎么在勾选的情况下让打ipa过程完成;
    听风轻咛:17:18:25 ** ARCHIVE SUCCEEDED **
    17:18:25
    17:18:25 Cleaning up previously generated .ipa files
    17:18:25 Cleaning up previously generated .dSYM.zip files
    17:18:25 Packaging IPA
    17:18:25 [LeWaiJiaoEnterprise] $ /usr/libexec/PlistBuddy -c "Print :ApplicationProperties:CFBundleVersion" /Users/user/build/LeWaiJiao.xcarchive/Info.plist
    17:18:25 [LeWaiJiaoEnterprise] $ /usr/libexec/PlistBuddy -c "Print :ApplicationProperties:CFBundleShortVersionString" /Users/user/build/LeWaiJiao.xcarchive/Info.plist
    17:18:25 Packaging LeWaiJiao.xcarchive => /Users/user/.jenkins/workspace/LeWaiJiaoEnterprise/build/Debug-iphoneos/build22_2017.12.07.ipa
    17:18:25 [LeWaiJiaoEnterprise] $ /usr/bin/xcodebuild -exportArchive -archivePath /Users/user/build/LeWaiJiao.xcarchive -exportPath /Users/user/.jenkins/workspace/LeWaiJiaoEnterprise/build/Debug-iphoneos -exportOptionsPlist /Users/user/.jenkins/workspace/LeWaiJiaoEnterprise/build/Debug-iphoneos/enterpriseY6HAL6UA2VExport.plist
    17:18:26 2017-12-07 17:18:26.798 xcodebuild[17437:7118066] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path '/var/folders/nr/p5w9w9pn4qd4zc7jm7lmw6rr0000gp/T/LeWaiJiao_2017-12-07_17-18-26.796.xcdistributionlogs'.
    17:18:31 2017-12-07 17:18:31.720 xcodebuild[17437:7118066] [MT] IDEDistribution: Step failed: <IDEDistributionPackagingStep: 0x7fb6c3312a00>: Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/nr/p5w9w9pn4qd4zc7jm7lmw6rr0000gp/T/ipatool-json-filepath-nl8XlB}
  • 一号线:team难道一定要选择吗?
    FATAL: No global development team or local team ID was configured.
    Build step 'Xcode' marked build as failure
    Finished: FAILURE
  • 草原烈鹰:大神,问一下,上传钥匙串和证书的时候,你文章里面也有解释,但是还有一点问题:由于资源库是隐藏的文件夹,选的时候,选不了login的钥匙串,于是我就利用终端把它设为了显示,这样可以选择钥匙串了,配置好了开发和发布的证书,也选择了资源库文件夹中的MobileDevice中的Provisioning Profiles文件夹路径,但是,在具体项目中,配置的时候,选择不了Code Signing Identity,该怎么办?;整个过程有一点和你的不一样,就是jenkins并没有自动把login的钥匙串和MobileDevice放到jenkins的文件夹下面;而且你文章中也说道library也是隐藏的,那么,你是怎么操作,让login钥匙串和MobileDevice放到jenkins的文件夹下面的??
    草原烈鹰:@一缕殇流化隐半边冰霜 大神,恕我冒昧,没看到有关jenkins证书配置的脚本,能加个Q吗?我的Q号:824899976
    一缕殇流化隐半边冰霜:@草原烈鹰 确实有人在评论里面提到了你说的问题。Jenkins 应该是更新了。和文章里面的有点不同了。你可以考虑用我下面脚本的方法去做。用脚本设置好这些以后,以后就算 Jenkins 变化了,你脚本不变也不用慌。
  • cbb9e3ec600d:修正版本号: 889820
    没有变更。

    构建版本总是提示没有变更,有遇到这种情况么?
    一缕殇流化隐半边冰霜:@Addict_dong 那之后的构建都是成功的么?
    cbb9e3ec600d:我刚构建版本的时候,提示有个冲突文件夹。然后把冲突解决了,之后就一直提示没有变更。
    一缕殇流化隐半边冰霜:@Addict_dong 这个变更指的是什么变更??按道理来说构建版本是 Jenkins 自己处理的。每次构建完都会变。就算构建成功或者失败都会变的。
  • Alger_梁:大神,可以加一下我 QQ 吗?929245885 弄了两天都没有弄好,这边总是检查依赖关系失败
    一缕殇流化隐半边冰霜:@青青是老大要听青青话 加你了。。你看看
  • f868d65047e5:我进入钥匙串和配置文件插件点击上传怎么是个png格式的图片呢
    一缕殇流化隐半边冰霜:@我们都是天使 那里可以选择文件的吧。不是默认只能选png吧??
  • f868d65047e5:楼主您好,我没有找到您文章中说的构建环境设置,请问在哪呢
    一缕殇流化隐半边冰霜:@我们都是天使 在刚刚进入Jenkins的页面里面选,别点到里面的页面去了。
  • f868d65047e5:我怎么没找到你说的那个构建环境的设置呢,可以麻烦您详细说下嘛
    一缕殇流化隐半边冰霜:@我们都是天使 在刚刚进入Jenkins的页面里面选,别点到里面的页面去了。
  • 小码嘟嘟:楼主你好,遇到疑难了,请加下我Q请教一下,269487052,谢谢了
    一缕殇流化隐半边冰霜:@一米丘山 加你了。。你看看。。。
  • 草原烈鹰:请问楼主:其中有一步骤是上传keychain和证书,但是login.keychain在隐藏文件夹(资源库)里面,选取的时候,选取不到这个login.keychain,该怎么办??
    一缕殇流化隐半边冰霜:@睿画智清 你看我文章下面有脚本;你用脚本配置也可以的。fastlane就是调用这个脚本打包就好。
    草原烈鹰:@一缕殇流化隐半边冰霜 是存储login.ch……文件的“资源库”文件夹是隐藏的,如果实在不能选择,可不可以在fastlane里面配置?有例子没,大神
    一缕殇流化隐半边冰霜:@睿画智清 纳尼😱现在变成隐藏文件了?那你更改一下文件属性,改成不隐藏的再选择,试试。
  • 32c0a3e504c2:楼主有没有遇到过这样的问题:有时候编译成功了,但是到控制台看会发现打包报错了,错误没有抛出来。反而把上次打包成功(./Release-iphoneos/${APP_NAME}.app 路径下)的.app文件打包成了ipa文件。楼主遇到过吗?请指教啊。。。
    一缕殇流化隐半边冰霜:@林华谢春红 没有遇到啊。。。还有这么奇怪的??是不是打包脚本写的有问题啊。。
  • ec64094e72d7:你好 为啥我的Jenkins与git仓库一直接连失败 是不是有什么细节啊
    error fetching remote repo "origin"
    一缕殇流化隐半边冰霜:@鱼七秒 我建议你登录到Jenkins的用户上去本地用git调试一下。。这样看到的错误信息会比这更加有效一点。
    ec64094e72d7:@一缕殇流化隐半边冰霜 http和ssh 都试了
    一缕殇流化隐半边冰霜:@鱼七秒 你是用http连接的还是ssh连接的???
  • 梦想编织者灬小楠:Unlock Jenkins
    To ensure Jenkins is securely set up by the administrator, a password has been written to the log (not sure where to find it?) and this file on the server:

    /Users/Shared/Jenkins/Home/secrets/initialAdminPassword

    Please copy the password from either location and paste it below.

    我卡到Copy密码这了,作者也说了,非Jenkins用户/secrets/目录是没有读写权限的,我自己的用户拿不到这个密码,但是要登录新的Jenkins账户又不知道登陆密码...求教下,怎么才能拿到Coy密码?:disappointed_relieved:
    一缕殇流化隐半边冰霜:@梦想编织者灬小楠 你用管理员账户登录进去,把这个文件的权限都改了,改成可以对所有人可读可写。然后其他账号都可以去读取了。如果想更加安全,那记得copy到密码以后再把文件夹的读写属性再改回去就好了~
  • 8f64fc6e6524:大神您好,请教两个问题哈,1.文中“iOS打包需要签名文件和证书,所以这部分我们勾选“Keychains and Code Signing Identities”和“Mobile Provisioning Profiles””我在jenkins中“构造环境”中找不到这个选项,这是什么原因呀?2.在mac 终端执行ssh-genkey生成ssh密钥对。拷贝id_rsa.pub的文本内容,分别添加到github账号->settings->ssh and gpgKeys->add ssh,粘贴保存,然后在jenkins主页->credentials->add credentials,在“kind”这一栏中选择“ssh username with private key”,在private key这一栏中,选择enter directly,将原来复制的id_rsa.pub文本保存在这里,然后点ok确定,然后选择项目设置,在“源码管理”这一行中选择“git”,respository这一行中填入git代码库的ssh拷贝连接,格式如“ git@github.com:kotercy9527/kotercy.git”,credentials这一行中选择我刚才添加的credentials,然后报错,内容如下:Failed to connect to repository : Command "git ls-remote -h git@github.com:kotercy9527/kotercy.git HEAD" returned status code 128:
    stdout:
    stderr: Warning: Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts.
    Permission denied (publickey).
    不知道是哪里错了,大神有空的话帮我分析一下,感激不尽!
    一缕殇流化隐半边冰霜:@kotercy 关于问题二,教你一个方便你找问题的方法。你现在本地有一个Jenkins,你开机的时候登录这个用户进去,然后在这个用户下去git clone,你试试你能不能成功。当然你是不能成功的,如果这边能成功,你在Jenkins设置里面也可以成功。你在Jenkins用户下直接用git命令,有很详细的错误信息。你就知道你那边为什么错了。
    一缕殇流化隐半边冰霜:@kotercy 关于问题一,是因为你用的最新版本吧。。我的这个版本应该比你老很多了。所以页面位置变化了。我看也有网友在这里评论提到这个事情了。
    8f64fc6e6524:对问题二,如果我在responsitory url这一行中写的不是ssh拷贝连接,而是https拷贝连接,格式如:“https://github.com/kotercy9527/kotercy.git”,就不会出现报错的问题。:
  • ad6850e88ae6:你好,楼主,我Keychains and Provisioning Profiles Management 选择了自己的login.kychain,也添加了相应的证书列表 和profile目录,
    但是具体构建的item中
    1.[构建环境] [Keychains and Code Signing Identities] 的Code Signing Identities选择框是不可选的,也就是没有 Code Signing Identities列表
    2.[构建环境] [Mobile Provisioning Profiles] 的 Provisioning Profiles 选择框是不可选的,也没有的 Provisioning Profiles列表
    这是什么原因呢???
    一缕殇流化隐半边冰霜:你可以直接在脚本里面设置这些证书什么的啊。。你的版本也许和我之前的版本有区别了。
  • Doliant_H:悲剧~在keychains文件夹中并没有找到login.keychain文件
    一缕殇流化隐半边冰霜:@梅川酷库 不行的话用我给的脚本吧
    Doliant_H:@一缕殇流化隐半边冰霜 目前还没有囧
    一缕殇流化隐半边冰霜:@梅川酷库 现在找到了么?
  • brilliance_Liu:大哥 Keychains and Provisioning Profiles Management 里面选择login.keychain只能手动选择文件,但是library死活不显示,我怎么选啊?我把login.keychain给copy 出来也没用?求指教啊
    ad6850e88ae6:@brilliance_Liu 我也是卡在这里了,导致 jenkins 中运行脚本不能正常运行,这个脚本在本地执行是可以的,放在jenkins 执行就不可以可,我估计跟keychian 证书,还有profile有关
    brilliance_Liu:@无心禅师 不好意思,我还没解决。由于是我自己有空探究Jenkins,这块阻塞后,正好也忙了,就暂时放下了,你可以私信作者
    ad6850e88ae6:同求 ,看173楼,我和你的问题是一样的,也将login的keychain 拷贝到桌面,然后添加,就出现了

    我Keychains and Provisioning Profiles Management 选择了自己的login.kychain,也添加了相应的证书列表 和profile目录,
    但是具体构建的item中
    1.[构建环境] [Keychains and Code Signing Identities] 的Code Signing Identities选择框是不可选的,也就是没有 Code Signing Identities列表
    2.[构建环境] [Mobile Provisioning Profiles] 的 Provisioning Profiles 选择框是不可选的,也没有的 Provisioning Profiles列表

    你现在解决了这个问题了吗
  • 黄鱼儿啦啦啦:那个证书是怎么传上去的啊,keychains文件夹里面只有login.keychain 那个发布证书跟开发证书怎么传的呀
    一缕殇流化隐半边冰霜:@黄鱼儿啦啦啦 新版换了地方了。你可以直接去开发者网站上面下载也可以。
  • de3d157044ef:环境构建那一步我没找到你说的那个选项,你能截图让我看一下选哪个吗?这是我的选项,不知道出了什么问题
    Delete workspace before build starts
    Abort the build if it's stuck
    Add timestamps to the Console Output
    Restore OS X keychains after build process as defined in global configuration
    Use secret text(s) or file(s) Help for feature: Use secret text(s) or file(s)
    With Ant
    一缕殇流化隐半边冰霜:@困的睡不着 :+1: :+1: 行。。解决了就好。。
    de3d157044ef:@一缕殇流化隐半边冰霜 已经解决了,谢谢
    一缕殇流化隐半边冰霜:@困的睡不着 我现在不负责Jenkins了,没法给你截图了。。你这个错误是构建以后的错误么?我好像没有找到error的具体信息。。
  • MichalWilson:我们的代码是用阿里code管理的,不知道为什么git远程仓库就是连接不上,我确定我的SSH秘钥是对的啊,链接 也没错,我现在用的sourceTree管理代码,随时可以拉取,为什么就Jenkins连接不到git远程仓库呢
    一缕殇流化隐半边冰霜:@MichalWilson 那你在本地弄的,Jenkins用户下的SSH用的是你自己机器上的这个么??
    MichalWilson:@一缕殇流化隐半边冰霜 不是啊 领导让我在本地配置一下试试,然后再在领完一台电脑上完成上传阿里code的配置. 关键是我的SSH用sourceTree从git上拉取代码的时候没问题啊
    一缕殇流化隐半边冰霜:@MichalWilson 这说明Jenkins用的SSH不对。。你的Jenkins就配置在你本地??
  • brance:请问 用的cocoapods 集成的项目支持打包吗
  • 从此你不再颠沛流离:Xcode integration 提示安装失败,一直报
    失败 -

    java.net.SocketTimeoutException: connect timed out
    一缕殇流化隐半边冰霜:@从此你不再颠沛流离 翻墙试试??
  • 惜壤:遇到个问题:
    1.本地搭建的Jenkins Execute shell 添加了fastlane gym --export_method ad-hoc --scheme x x x x --clean 是可以走的。
    2.Linux搭建Jenkins ,创建macOS节点, Execute shell 添加了fastlane gym --export_method ad-hoc --scheme x x x x --clean,运行就会报fastlane: command not found
    这是因为没有在masOS节点上运行吗?怎么操作才能在正确的运行?需要调试什么东西?
    惜壤:@一缕殇流化隐半边冰霜 嗯 问过了。。已经解决了的。
    一缕殇流化隐半边冰霜:@惜壤 你QQ上问过我了??
  • floralovesIOS:很奇怪,为啥我配git的时候一直都是128,私钥是gitlab上配的那个,地址也正确,总说我权限不对,你知道为什么吗?楼主能帮帮我吗?
    一缕殇流化隐半边冰霜:@floralovesIOS 不用重新生成,就用你本地的就可以了
    floralovesIOS:文中图片上的样子,配SSH key那一步,我的key是gitlab上copy来的,这里是要重新生成吗?还是怎么子?
    一缕殇流化隐半边冰霜:@floralovesIOS 具体错误描述是??
  • 黑夜漫步:FATAL: Cannot find xcodebuild with the configured path /usr/bin/xcodebuild. 楼主有遇到过吗,服务器不是mac的原因?
    一缕殇流化隐半边冰霜:@黑夜漫步 :+1::+1::+1:赞赞赞,以后遇到相似的问题,可以有参考了!!遇到相同问题的同学可以参考你这个链接了。
    黑夜漫步:@一缕殇流化隐半边冰霜 嗯,找到原因了,我们公司的jenkins的服务器是建在Linux系统上的,貌似找不到xcodebuild的命令,我在我mac建了个子节点就不报错了,建立子节点方法参考的这个文章http://blog.csdn.net/syg90178aw/article/details/52221765
    一缕殇流化隐半边冰霜:@黑夜漫步 不是mac也可以呀。。这个报错好像是配置的原因。
  • 湘科院晴子:最近在用Jenkins进行自动化测试和打包上传到蒲公英,遇到一些问题,大神能加一下qq吗?1270948921
    一缕殇流化隐半边冰霜:@湘科院晴子 你加我,707176544,注明是Jenkins
  • 湘科院晴子:我在Keychains and Provisioning Profiles Management中上传了keychain和Provisioning Profile 但是在构建环境中的Keychains and Code Signing Identities下面只有Keychains有值 Code Signing Identity后面没有我上传的证书
    一缕殇流化隐半边冰霜:@湘科院晴子 感觉是插件的问题??
  • 知县有点小心事儿:其实我想问下 最后面这个粉笔画的流程图是用什么软件做的:flushed:
    一缕殇流化隐半边冰霜:@知县有点小心事儿 是呀。。就是keynote,你选一个主题就可以了
    知县有点小心事儿:@一缕殇流化隐半边冰霜 :flushed: 就只是keynote啊 我试试去
    一缕殇流化隐半边冰霜:@知县有点小心事儿 keynote
  • DSperson:您好 我吧 密码复制下来了 点击继续后 还是刚才的界面 请问怎么回事呢
    一缕殇流化隐半边冰霜:@DSperson 是不是什么插件拦截了???
    DSperson:safair 不行 谷歌浏览器进去了...
  • qBryant:很详细~~~!
    一缕殇流化隐半边冰霜:@qBryant :kissing_heart: 一起学习
  • zhou某某:在系统管理里面添加了证书后 在构建环境的时候选择不到配置文件 楼主这个是什么的原因啊
    一缕殇流化隐半边冰霜:@zhou某某 你是直接在Jenkins里面配置的??
  • zhou某某: 配置 ssh key的时候 这个key是要先在gitlab上配置好然后填在jenkins上的吗 第一次弄 有点懵 希望做过的小伙伴能帮我下 不胜感激
    一缕殇流化隐半边冰霜:@zhou某某 是的。。这个key你要先在gitlab上配置好才行。。配置好了以后你可以先在你自己机器上试试,如果通了,就再去Jenkins上面去设置。
  • zhou某某:小伙伴们 我这边安装gitlab pluigin总是失败 你们有遇见过吗 跪求解决方法
    一缕殇流化隐半边冰霜:@zhou某某 要翻墙
  • zhou某某:那个网页打不开,怎么重新java环境呀 在哪里重新设置啊 刚弄这个有点懵 大神指导下呗
    一缕殇流化隐半边冰霜:@zhou某某 重装Java环境是指的是你要重新安装Java JDK
  • 米斯特卢:楼主你好,请教您一个问题,这个超时是怎么回事啊?用户名密码都设置了!一直报这个错误!
    ERROR: Timeout after 10 minutes
    ERROR: Error cloning remote repo 'origin'
    hudson.plugins.git.GitException: Command "git fetch --tags --progress http://**********.git +refs/heads/*:refs/remotes/origin/*" returned status code 143:
    stdout:
    stderr:
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1903)
    at
    一缕殇流化隐半边冰霜:@米斯特卢 你翻墙了么???
  • 黑黝黝的搬砖王:Process working directory '/Users/wangkelei/Work/jenkins/workspace/dev/Test_qingshu_IOS/ELearningQSXT' doesn't exist!
    这个找不到怎么解决啊楼主?
    一缕殇流化隐半边冰霜:@MeSimon 你的路径是不是不对???
    一缕殇流化隐半边冰霜:@MeSimon 加你了。。你看看。。
    黑黝黝的搬砖王:楼主可以加一下QQ(348400564)嘛?后面配置Jenkins的时候各种问题
  • 84a013fc045a:大神一直卡在getting started 界面,安装进度条只走了40%左右,一个下午 都这样了,有些插件进度就一直在转圈圈,求破。
    84a013fc045a: @84a013fc045a 是吗 我已经翻墙了。。现在打算单独安装插件了
    一缕殇流化隐半边冰霜:@84a013fc045a 嗯,要翻墙才行,之前我不知道也在这里卡了很久。翻墙以后网速要稍微快一点,网速慢还会出现超时的错误
  • 415242e789ca:楼主

    > git checkout -f b9805ffd6a31c920ff4f0444c5657eecfe857088
    > git rev-list b9805ffd6a31c920ff4f0444c5657eecfe857088 # timeout=10
    FATAL: String index out of range: 15
    java.lang.StringIndexOutOfBoundsException: String index out of range: 15
    at java.lang.String.substring(String.java:1963)
    at com.sic.plugins.kpp.provider.KPPBaseProvisioningProfilesProvider.removeUUIDFromFileName(KPPBaseProvisioningProfilesProvider.java:171)
    at com.sic.plugins.kpp.model.KPPProvisioningProfile.getProvisioningProfileFilePath(KPPProvisioningProfile.java:76)
    at com.sic.plugins.kpp.KPPProvisioningProfilesBuildWrapper.copyProvisioningProfiles(KPPProvisioningProfilesBuildWrapper.java:157)
    at com.sic.plugins.kpp.KPPProvisioningProfilesBuildWrapper.setUp(KPPProvisioningProfilesBuildWrapper.java:99)
    at hudson.model.Build$BuildExecution.doRun(Build.java:157)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:490)
    at hudson.model.Run.execute(Run.java:1735)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
    at hudson.model.ResourceController.execute(ResourceController.java:97)
    at hudson.model.Executor.run(Executor.java:415)
    Finished: FAILURE

    这个是什么原因啊
    一缕殇流化隐半边冰霜:@leleha 刚刚加你了。。你看看
    415242e789ca:@一缕殇流化隐半边冰霜 哦哦,大神,有些问题需要请教,方便加个qq吗,1071872574
    一缕殇流化隐半边冰霜:@leleha 这里好像说timeout了。你检查一下权限方面的问题
  • 码农甲:xcodebuild + xcrun 和 fastlane - gym 命令 任选其中一个就可以打包对吧?? 他们俩 是不是必须关 而是可选关系,二选一这种 对吧
    一缕殇流化隐半边冰霜:@一只名叫心蓝的猫 是的,二选一
  • 西叶lv:使用SourceTree管理代码还用jenkins持续集成么??我看这篇文章,好像SourceTree和jenkins差不多,不太懂。https://stackshare.io/stackups/jenkins-vs-sourcetree
    一缕殇流化隐半边冰霜:@郝嘉律 Jenkins里面可能没有,我没用过,不知道现在有没有。Jenkins他不负责代码版本管理这些,他只专心管理持续集成
    西叶lv:@一缕殇流化隐半边冰霜 我们用的SourceTree管理代码,没有用Gitlab,Jenkins中没有SourceTree的插件啊??
    一缕殇流化隐半边冰霜:@郝嘉律 SourceTree只是用来管理代码的。。jenkins是用来持续集成的,两者作用还是不同的。。当然两者是都要使用的啦。
  • 西叶lv:开发这么久,还没有用过持续集成,out了,持续集成用的普遍么??
    西叶lv:@一缕殇流化隐半边冰霜 嗯嗯,这样啊,没有用过持续集成
    一缕殇流化隐半边冰霜:@郝嘉律 一般大公司都会用持续集成。。这种自动化流水线的操作比较多
  • 351c4e68e15b:楼主,现在jenkins上说: "The PostBuildScript plugin currently is up for adoption" 这个脚本插件有安全问题,现在不能用了,你有解决方案么?
    351c4e68e15b:并且我重新安装jenkins的老版本,在老版本中这个插件好像也无法下载了.:joy:
    351c4e68e15b:@一缕殇流化隐半边冰霜 网上搜了半天,都没搜到,看到一个帖子上说用groovy,但是不会写:joy: 帖子在这: http://jenkins-ci.361315.n4.nabble.com/PostBuildScript-plugin-and-security-td4897635.html
    一缕殇流化隐半边冰霜:@帅到没天理 我去。。现在这个都不能用了???我之前还可以用的。。那你网上搜一下这个插件的等价的插件
  • PisPMPL:Check dependencies
    No profiles for 'com.163.dongshangtong.YCPublicDemo' were found: Xcode couldn't find a provisioning profile matching 'com.163.dongshangtong.YCPublicDemo'.


    Warning: Multiple build commands for output file /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/YCPublicDemo-bgouseeojavvjvhclrlvmzscsdap/Build/Intermediates/ArchiveIntermediates/YCPublicDemo/InstallationBuildProductsLocation/Applications/YCPublicDemo.app/LICENSE
    Code signing is required for product type 'Application' in SDK 'iOS 10.3'

    这是pp文件的问题么, 老铁,,?
    一缕殇流化隐半边冰霜:@perfectisshittt 从描述上看,是的。。提示说pp文件没有对应上。
  • CveniEs:如果jenkins以前用的是老版本的xcode, 怎么升级到最新版本的xcode
    一缕殇流化隐半边冰霜:@CveniEs 那个就是用的本地的,你把Jenkins机器的Xcode升级一下就可以了
    CveniEs:对啊,现在jenkins用的是xcode 7.3,想升级到8.2,不知道咋弄
    一缕殇流化隐半边冰霜:@CveniEs 升级最新的Xcode??
  • 码农甲:我在 /Users/管理员用户名/Library/keychains/ 并没有找到 login.keychain ,只有login.keychain-db ?
  • c6977e200fae:你好,请教你一个问题好吗 = =!,“这个时候可能会报一个错误。如果出现了这面的问题。出现这个问题的原因就是Java环境有问题,重新Java环境即可”。这个是什么意思,这个java环境是什么意思???
    一缕殇流化隐半边冰霜:@tangyb JDK,你要把这个重新装一下
  • 我感觉我这脸是越来越大了:有人抄走还求打赏...
    http://www.jianshu.com/p/24546e2258d0
    一缕殇流化隐半边冰霜:@我感觉我这脸是越来越大了 谢谢你,我举报了。。。他还标了原创,也没有贴我的原文链接。。。可耻。。。
  • 满脸胡渣的年轻大叔:很历害。。。成能搞定了ios.
    一缕殇流化隐半边冰霜:@满脸胡渣的年轻大叔 成能??
  • manajay:我使用的pkg创建jekins在 电脑的share目录下面, 发现在那儿构建的项目, 执行pod install 或者pod update命令,结果就是
    ### Command

    ```
    /Users//.rvm/gems/ruby-2.4.0/bin/pod update
    ```

    ### Report

    * What did you do?

    * What did you expect to happen?

    * What happened instead?

    ### Stack

    请问 是不是和 rvm 有关系,
    pod的指令我在 管理员帐号下面执行是没有问题的
    一缕殇流化隐半边冰霜:@manajay 那应该是 rvm有问题。。你直接google搜这个,应该可以找到解决办法
  • GRIM:我来冒下泡 你公司用这个么:stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:
    一缕殇流化隐半边冰霜:@GRIM 用呀,前一家和现在公司都用这个
  • bdf4691f9ee3:请问xcodebuild命令可以打出ad-hoc包吗?不是只有debug和release选项么
    一缕殇流化隐半边冰霜:@swallowguo2 可以呀,debug和release和ad-hoc无关呀。。你上架App Store,包是release的,appstore的
  • 2cec8239f004:很好,挺详细
    一缕殇流化隐半边冰霜:@nt3333 :kissing_heart::kissing_heart:一起学习
  • iSuAbner:这个http://localhost:8080 是空白页 JAVA环境具体是哪里没弄好啊 求解
    iSuAbner:@一缕殇流化隐半边冰霜 :+1:
    一缕殇流化隐半边冰霜:@iSuAbner 最简单的办法就是重装一下java环境,覆盖安装很快的
  • e1d0a2f67f15:大神有没有遇到过Jenkins 打包失败,手动打包没问题的情况。
    一缕殇流化隐半边冰霜:@Glary 手动打包是什么意思??就是手动执行脚本??
    一缕殇流化隐半边冰霜:@Glary 你直接进入Jenkins用户下,执行打包步骤。。可以打出来不???
    e1d0a2f67f15:The following build commands failed:
    CompileC /Users/candy/Library/Developer/Xcode/DerivedData/Packet-arrilqlmejhnlzdembtgzmufldxm/Build/Intermediates/Packet.build/Release-iphoneos/Packet.build/Objects-normal/armv7/HTMLParsingViewController.o Packet/Classes/Vender/FriendZone/Others/HTMLParsingViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler
    (1 failure)
    Build step 'Xcode' marked build as failure
    Finished: FAILURE
  • Clee:楼主,找不到你说的Login.keychain呢
    一缕殇流化隐半边冰霜:@cleexiang 换脚本的方法。。。有人也提到了这个问题。。新版本这里变了
  • 76267db444a8:请问作者,把GitLab换成Github,需要安装哪些插件啊?
    一缕殇流化隐半边冰霜:@Albert123kbhnvg 在插件列表那里搜github,相关的选择安装
  • 轻拂丶肩上雪:请问/Users/Shared/Jenkins/Library/MobileDevice 这个目录是手动建还是jenkins 自动创建????
    轻拂丶肩上雪:@一缕殇流化隐半边冰霜 是我的问题没说清楚 不好意思:flushed:
    轻拂丶肩上雪:@一缕殇流化隐半边冰霜 /Users/Shared/Jenkins/Library 这个目录下只有一个Preference 文件 是构建后才会生成MobileDevice 还是需要我手动创建一个???
    一缕殇流化隐半边冰霜:@熟练NSLog 这个是Jenkins的文件夹啊。。
  • season_zz:问一下/Users/管理员用户名/Library/keychains/这个目录下没有login.keychain文件 是要怎么生成呢
    一缕殇流化隐半边冰霜:@seasonZuo 这个文件在安装完Jenkins之后就有呀。。
  • 824483e91475:学习
    一缕殇流化隐半边冰霜:@一句破话想 一起学习
  • 崔可一:想问个问题 如果工程中添加Notification Service Extension,我使用xcode打包时候 导出api包的时候,xxx.app下边会有一个yyyy.appex, 这样导出来的包 推送是好使的, 但是我使用xcodebuild脚本进行打包的时候 ,导出来的包 ,就收不到推送, 我怀疑我的脚本打包时候 没有把那个.appex打进去。 这个问题你遇见过吗,Google好久了都没找到答案
    一缕殇流化隐半边冰霜:@崔可一 我没有用它打过extension的包,之前一直有网友说,extension的坑多,有些问题网上都找不到解决办法:sweat::sweat:
    崔可一:不会呢 但是我用fastlane去打包就可以了
    一缕殇流化隐半边冰霜:@崔可一 那你用脚本打包的时候,那个.appex会生成出来不??
  • 32c0a3e504c2:您好,xcodebuild打的是adhoc的包,如果我要打企业版的发布包怎么设置呢
    一缕殇流化隐半边冰霜:@林华谢春红 是换一个名字就好了不??
    32c0a3e504c2:@一缕殇流化隐半边冰霜 解决了。谢谢你啦:smile:
    一缕殇流化隐半边冰霜:@林华谢春红 是需要企业版的adhoc??
  • 李大戮:[workspace] $ /usr/bin/security list-keychains -s login.keychain
    [workspace] $ /usr/bin/security default-keychain -d user -s login.keychain
    Will not set default: file /Users/Shared/Jenkins/Library/Keychains/login.keychain-db does not exist
    security: SecKeychainSetDomainDefault user: write permissions error
    [workspace] $ /usr/bin/security unlock-keychain -p ******** login.keychain
    security: SecKeychainUnlock login.keychain: The specified keychain could not be found.
    FATAL: Unable to unlock the keychain. 楼主有没有遇到这个问题,钥匙串已经打开访问权限,keychain密码也正确
    李大戮:@一缕殇流化隐半边冰霜 是权限问题,google半天没找到适合我的方法:joy:
    一缕殇流化隐半边冰霜:@李大戮 这个我没有遇到过:sweat::sweat:感觉是权限的问题。
  • Lewis海:请问在window环境可以打包iOS包不
    一缕殇流化隐半边冰霜:@Lewis海 嗯。。还是乖乖的用Mac吧
    Lewis海:谢谢!我也搭建了个只能在Mac系统自动打包的,无奈公司不给我买Mac:sweat:
    一缕殇流化隐半边冰霜:@Lewis海 没试过,可能不行,因为没有xcbuild命令
  • 小小小小雄:6666,很详细,谢谢分享
    一缕殇流化隐半边冰霜:@小小小小雄 一起学习:kissing_heart::kissing_heart:
  • 大志_lxl:这个如果公司没有搞jenkins服务器,我们ios端自己用这个能鼓捣点什么呢?
    一缕殇流化隐半边冰霜:@大志_lxl 那可以自己鼓捣点CI呀。。
  • e8aca1b2664c:前端时间集成进 Jenkins ,然后用了半个多月坏了,localhost 打开直接是空白啥东西没有:joy:
    ,不知道怎么整了,只能重新配置。最近也一直在了解 Jenkins + Docker 的方式,不知道楼主是否有研究这个?
  • yuandiLiao:楼主你好,我构建是+ xcodebuild -workspace HFFYEntertainment.xcworkspace -scheme HFFYEntertainment -configuration Release clean
    xcodebuild: error: 'HFFYEntertainment.xcworkspace' does not exist. 这里说我的文件不存在,如果我把"${APP_NAME}.xcworkspace"改成xcworkspace的绝对路径是构建时,就卡死+ xcodebuild -workspace /Users/Shared/Jenkins/Home/workspace/fandom_ios_use/fandom-ios/fandom-ios_use/fandom-ios/HFFYEntertainment/HFFYEntertainment.xcworkspace -scheme HFFYEntertainment -configuration Release clean
    在这一步了,也不报错,楼主知道怎么解决吗?我的QQ1510948525,如果可以的话希望楼主加一下我的QQ,指导指导,谢谢啦
  • 夜者无念:我在mac 部署jenkins2.32.3pkg,配置 git 上拉取代码,但是一直都死在 timeout 10 这上面,理论上10分钟内绝对下载成功才对,后面我改成30还是如此,是我哪里配置有问题?
    usr/bin/git fetch --tags --progress https://***.git +refs/heads/*:refs/remotes/origin/* # timeout=30 超时挂掉
    ERROR: Timeout after 30 minutes ERROR: Error fetching remote repo 'origin' hudson.plugins.git.GitException: Failed to fetch from

    我qq是574490169 博主指教下
    一缕殇流化隐半边冰霜:@夜者无念 到Jenkins用户下,试试能不能拉代码,那个用户通过是有root权限的
    夜者无念:@一缕殇流化隐半边冰霜 是权限问题,现在卡在cocoapod not run root上啦,我使用tomcat方式运行jenkin,默认安装在root上..........,在看怎么把它调整装到管理员用户下面:joy:
    一缕殇流化隐半边冰霜:@夜者无念 看一下是不是你的Jenkins没有拉取代码权限
  • fir_im官方:赞楼主,实践很详细啊!
    推荐博主 试试 flow.ci (不只是持续集成 & 持续交付服务)https://flow.ci , 配置相对简单很多, iOS/Android 的持续集成很成熟了。
    同时支持 Gitlab,Github,Bitbucket 代码仓库,支持 docker 自定义镜像,也马上支持持续部署了。
    (强行广告><)
    一缕殇流化隐半边冰霜:@一只名叫心蓝的猫 我以为是回复我的,原来是fir的bug,你直接私信他问问。他们态度很好的
    码农甲:感觉不错啊
    但是你先给我解决一下 fir 插件的bug [build] $ ditto -c -k --keepParent -rsrc /Users/Shared/Jenkins/Home/workspace/jingrinongshanghang_ios/RCB/build/RCB.app.dSYM /Users/XHQA/Desktop/Build/RCB/RCB-1.0-1-dSYM.zip
    Root directory to find files to upload : /Users/XHQA/Desktop/Build/RCB
    found remote files : [RCB-1.0-1.ipa]
    Deploying archive RCB-1.0-1.ipa to fir.im (description="bd8dd99a7f2cc1b918de00c2d1a49848", groups="")
    Deployment failed : Impossible to upload file /Users/Shared/Jenkins/tmp/ios.png: {"error":"expired token"}
    Build step 'Upload to fir.im' marked build as failure
    [description-setter] Description set: 这是咋回事啊
    一缕殇流化隐半边冰霜:@fir_im官方 好的!!可以的。。我试试哈!!谢谢你的推荐啊!!!
  • voidxin:你好,jenkins跑pod install --verbose --no-repo-update 的时候停留在
    Cloning spec repo `master` from `https://github.com/CocoaPods/Specs.git` (branch `master`)
    $ /usr/bin/git clone https://github.com/CocoaPods/Specs.git master
    Cloning into 'master'...
    一直菊花转圈圈,有遇到吗?请问怎么解决,谢谢。
    一缕殇流化隐半边冰霜:@voidxin 你登录一下Jenkins用户。。在Jenkins本地去拉取一下代码试试看。看看行不行
    voidxin:@一缕殇流化隐半边冰霜 CocoaPods在终端是可以的,请问这个Jenkins怎么配置权限呢?
    一缕殇流化隐半边冰霜:@voidxin 你是没有权限拉取代码仓库吧。。。
  • Niuszeng:不错
  • f501fdffe9c9:2.3的jenkis怎么配置部署 一脸懵逼 求拯救:sob: :sob:
    f501fdffe9c9:@一缕殇流化隐半边冰霜 13857276
    f501fdffe9c9:@一缕殇流化隐半边冰霜 恩啊 好多不会赔 不知道可不可以加个qq 指导一下小弟
    一缕殇流化隐半边冰霜:@f501fdffe9c9 你是最新的???
  • 9b56f7e74d2f:请教下楼主,jenkins在构建执行脚本的时候,就一直卡在shell第一条命令上不动了,xcodebuild的clean执行了两个小时都不动,换成直接编译的命令还是卡主,这个写命令在本地跑没问题,不知道楼主有没有遇到过,求知道
  • 晓蜻蜓:楼主你好,可以加个qq:2510094452,问你一些问题吗?我卡在了ssh配置上
  • 这个汤圆没有馅:源码管理那块,选择git输入url后一直报错。SSH key也重新弄了好几次了,就是不行:sob:
  • senlan:楼主,你好,问个简单的问题,这个环境的搭建是要另外买一个Mac系统的服务器的?能直接配置在本机上的吗,这对当前的开发会有影响吗?还有这个自动打包能直接自动上传到App Store的吗?
    senlan:@一缕殇流化隐半边冰霜 好的,谢谢,还在了解中,集成时有问题再请教,谢谢:grin:
    一缕殇流化隐半边冰霜:@senlan 可以搭建在服务器上,也可以搭建在自己本机上。搭建在自己机器上的话,打包的时候就是会机器热一点,机器性能好的话,对你完全没有影响。配置正确是可以自动上传到App Store的
  • 星兴:后面脚本的,要在哪里设置?
    一缕殇流化隐半边冰霜:@星兴 你配置的时候,构建选择那个debug脚本。构建结束选择upload脚本
    星兴:我把xcodebuild的脚本内容放在debug.sh,把上传蒲公英的放在upload.sh这样对吗,我这样之后构建失败,提示do not execute script
  • Chipmuck:找不到 login.keychain,只有 login.keychain-db :sob:
  • 思想的零度:文章很赞,但是我现在卡在了配置keychains和证书这个步骤了,我不太明白这里到底要怎么操作
    一缕殇流化隐半边冰霜:@思想的零度 嗯,直接用脚本,证书是配在脚本里面的
    思想的零度:@一缕殇流化隐半边冰霜 那如果直接用脚本打包的话是不是这一步就可以省略了,我的是最新版的Jenkins
    一缕殇流化隐半边冰霜:@思想的零度 你是啥版本的Jenkins?其实还有一个简单的办法,你可以直接用我下面提供的脚本去打包
  • Lion_Liu:求救啊~半路出现问题:
    1. 插件Keychains and Provisioning Profiles Management,只能添加 mobileprovision(dev 和 ad),login.keychain是在隐藏文件下的,没法上传
    2. Code Signing Identity 名字要手动输入的吗?
    3. Provisioning Profiles Directory Path 这个地址填将要存放的地址(/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles)还是之前存在的地址(/Users/FOODING/Library/MobileDevice/Provisioning Profiles)
    问题好多啊 :sob: :sob:
    Lion_Liu:@一缕殇流化隐半边冰霜 3Q:pray:
    一缕殇流化隐半边冰霜:@Lion_Liu 第一个问题你可以手动把login拷贝到文件夹,第二个问题,不是手动输入的。第三个问题拷贝到shared下

本文标题:手把手教你利用Jenkins持续集成iOS项目

本文链接:https://www.haomeiwen.com/subject/gukojttx.html