jenkins 配置。
为了避免在jenkins操作过程中的权限问题。 将安装在/Users/Shared/jenkins目录下的卸载。 sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist 之后安装在/Users/LoginName/Jenkins 目录下 java -jar /Applicaitons/Jenkins/jenkins.war --httpPort:8080
一个小问题。在设置Editable Email Notificaiton 时。
Triggers 中的Send To 不能是Developers应该用Recipient list
1. http://www.cocoachina.com/ios/20160804/17281.html
2. http://www.jianshu.com/p/ed0edb93e234
3. 安装Jenkins
a 从官网下载Jenkins(https://jenkins.io/)Mac OS X 对应的jenkins。之后傻瓜式安装。
b 安装完成之后,Safari可能会自动打开,如果没有自动打开,打开浏览器,输入http://localhost:8080
c 如果链接服务器失败,很可能是缺少JDK环境,在应用程序中找到Jenkens -> jenkins.rar 点击jenkins.rar会提示缺少JDK环境,点击更多信息。会进入JDK环境下载页面,接受协议,下载Mac os x环境下的JDK。
d 按照教程进行配置。
f 输入http://localhost:8080会提示Unlock jenkins 按照提示打开initialAdminPassword文件。由于jenkins下的secrets文件夹和initialAdminPassword被设置了权限。因此要右键 -> 显示简介 -> 共享与权限中更改权限。
g 获取密码进行 初始化。
h 配置SSH证书。注意此时的ssh应该是切换到jenkins模式下的ssh。生成ssh要把公钥添加到git上,私钥放在jenkins上,jenkins添加证书流程 主页 -> Credentials -> System -> Global credentials(Unrestricted) -> Add Credentials 设置SSH的私钥,同时用cat的形式获取完整的私钥。包括begin 和 end
缺少的步骤:
sudo dscl . passwd /Users/jenkins "YourPassword" 为jenkins这个用户设置一个密码
su jenkins 切换到jenkins用户
ssh-keygen -t rsa -C "你的邮箱标识" -f ~/.ssh/jenkins 生成使用的SSH
之后将jen.pub的公钥加入进git。将jen私钥放入jenkins中。其中获取公钥和私钥时使用 cat jen 即显示"jen"整个文件的数据。
i jenkins之触发器配置
http://blog.sina.com.cn/s/blog_71bc9d680102x0n1.html
二:
1 设置SSH。添加私钥到 jenkins。添加公钥到git。要完整。(添加证书)
2 在系统管理插件管理中添加插件:
安装GitLab插件: 在“可选插件”中选中“GitLab Plugin”和“Gitlab Hook Plugin”这两项,然后安装。
安装Xcode插件: 在“可选插件”中选中“Xcode integration”安装。
安装签名证书管理插件: 在“可选插件”中选中“Credentials Plugin”和“Keychains and Provisioning Profiles Management”安装
安装FTP插件: 在系统管理->管理插件,在“可选插件”中选中“Publish over FTP”安装。
安装脚本插件: 在系统管理->管理插件,在“可选插件”中选中“Post-Build Script Plug-in”安装。
3 邮件通知
jenkins location中的系统管理员邮件地址。要设置的和Extended E-mail Notification中的使用SMTP授权的邮箱地址一样(包括E-mail Notification)。同事邮箱的密码不是常用的密码而是SMTP/POP3的授权码。由于E-mail Notification功能有限。故实际使用时使用Extended E-mail Notification来进行邮件的发送。使用E-mail Notification的“通过发送测试邮件测试配置”来进行邮件发送的测试。同时在Extended E-mail Notification中可以设置属性“Default Triggers”为Success,Failure-Any来接受jenkins构建成功和失败时的通知邮件。
4 Keychains and Provisioning Profiles Management插件
上传的login.keychanin而不是证书以及相应的PP文件。其中login.keychain的路径是/Users/电脑名(jisa)/Library/keychains/login.keychain.上传点击Upload。
进入jenkins目录。/Users/Shared/Jenkins/Library.里面是不是有keychains和MobileDevice文件夹。如果没有则拷贝过去。同时要更改权限为读和写。注意keychians里只需要login.keychian和login.keychian-db文件同时要解锁权限。
五 新建一个自由风格的项目
源码管理-设置git
2 构建触发器。 只设置了poll SCM(检查代码更新。什么时候下拉代码。) Build periodically(构建周期。什么时候构建一次,没使用)
3 构建环境。设置keychain和pp文件
构建之XCode设置。
构建Archive和ipa的脚本。
if [ -d "${WORKSPACE}/builds" ]; then
rm -rf ${WORKSPACE}/builds;
fi;
mkdir ${WORKSPACE}/builds;
if [ -d "${WORKSPACE}/builds/${BUILD_NUMBER}" ]; then
rm -rf ${WORKSPACE}/builds/${BUILD_NUMBER};
fi;
mkdir ${WORKSPACE}/builds/${BUILD_NUMBER};
/usr/bin/security unlock-keychain -p pwd ~/Library/Keychains/login.keychain
/usr/bin/security unlock-keychain -p pwd ~/Library/Keychains/login.keychain-db
#注意${WORKSPACE}代表的路径。可以在jenkins的工作区看出来。
xcodebuild -workspace ${WORKSPACE}/source/ios/O2oApp/O2oApp.xcworkspace -scheme "O2oApp" -configuration Release clean build -sdk iphoneos archive -archivePath ${WORKSPACE}/builds/${BUILD_NUMBER}/archive CODE_SIGN_IDENTITY="iPhone Distribution: Vision Credit Financial Technology Company Limited (YWEH5GVC2C)"
xcodebuild -exportArchive -archivePath ${WORKSPACE}/builds/${BUILD_NUMBER}/archive.xcarchive -exportPath ${WORKSPACE}/builds/${JOB_NAME} -exportOptionsPlist ${WORKSPACE}/source/ios/O2oApp/doc/O2oAppDebuge.plist
非cocoapods类型的工程执行的shell脚本
if [ -d "${WORKSPACE}/builds" ]; then
rm -rf ${WORKSPACE}/builds;
fi;
mkdir ${WORKSPACE}/builds;
if [ -d "${WORKSPACE}/builds/${BUILD_NUMBER}" ]; then
rm -rf ${WORKSPACE}/builds/${BUILD_NUMBER};
fi;
mkdir ${WORKSPACE}/builds/${BUILD_NUMBER};
xcodebuild -project ${WORKSPACE}/jenkinsTest.xcodeproj -scheme "jenkinsTest" -sdk iphoneos archive -archivePath ${WORKSPACE}/builds/${BUILD_NUMBER}/archive CODE_SIGN_IDENTITY="iPhone Developer: sa ji (96722ADU5M)"
xcodebuild -exportArchive -archivePath ${WORKSPACE}/builds/${BUILD_NUMBER}/archive.xcarchive -exportPath ${WORKSPACE}/builds/test/${JOB_NAME}.ipa -exportOptionsPlist ${WORKSPACE}/dev.plist
exportOptionsPlist的类型如下。是一个plist文件。可以通过xcodebuild -help来执行终端命令。
使用SHELL脚本打包,不通过jenkins 直接执行脚本。
#!/bin/sh export LC_ALL=zh_CN.GB2312;export LANG=zh_CN.GB2312 cd .. base_path="`dirname $0`" base_path="`(cd \"$base_path\"; pwd)`" echo "路径$base_path" path_arr=$(echo $base_path|tr "/" "\n") echo "分割路径 $path_arr" for s in ${path_arr[@]} do if [ "${s}"x = "ios"x ]; then app_path=`printf "$app_path/%s" $s` break else app_path=`printf "$app_path/%s" $s` fi done echo "app基本路径=$app_path" #############制定的Archive路径 archivePath="/Users/vcredit_hzxh/Desktop/O2oApp" ###############进入项目目录 projectName="O2oApp" #项目所在目录的名称 isWorkSpace="$2" #判断是用的workspace还是直接project,workspace设置为true,否则设置为false projectDir="${app_path}/O2oApp/" #项目所在目录的绝对路径 ###############配置下载的文件名称和路径等相关参数 ########################################################################################## ##############################以下部分为自动生产部分,不需要手动修改############################ ########################################################################################## ####################### FUCTION START ####################### replaceString(){ local inputString="$1" result="${inputString//(/}" result="${result//)/}" echo "$result" } rm -rf ./build ###############获取版本号,bundleID infoPlist="${projectDir}${projectName}/Info.plist" bundleDisplayName=`/usr/libexec/PlistBuddy -c "Print CFBundleDisplayName" $infoPlist` bundleVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $infoPlist` bundleIdentifier=`/usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" $infoPlist` bundleBuildVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $infoPlist` ###############在网页上显示的名字和bundleDisplayName一致 #修改编译环境 #VV_BUILD_FOR_RELEASE 生产发布 #VV_BUILD_FOR_TEST 公测 #VV_BUILD_FOR_DEVELOP 内测 #VV_BUILD_FOR_RELEASE_HOUSE 企业 ###### PREPROCESSOR_DEFINITIONS="VV_BUILD_FOR_RELEASE_HOUSE" ##### if [ "${PREPROCESSOR_DEFINITIONS}"x = "VV_BUILD_FOR_RELEASE"x ]; then buildConfig="Release" #编译的方式,默认为Release,还有Debug等 Develop TEST bundleDisplayName="Appstore" # 发布appstore用******** CODE_SIGN="iPhone Distribution: Vision Credit Financial Technology Company Limited (YWEH5GVC2C)" ProvisioningProfile="o2o_appstore_pro" elif [ "${PREPROCESSOR_DEFINITIONS}"x = "VV_BUILD_FOR_RELEASE_HOUSE"x ]; then buildConfig="Release_House" bundleDisplayName="企业生产" CODE_SIGN="iPhone Distribution: Vision Credit Ltd" ProvisioningProfile="O2O_house_Profiles" elif [ "${PREPROCESSOR_DEFINITIONS}"x = "VV_BUILD_FOR_TEST"x ]; then buildConfig="TEST" bundleDisplayName="公测" CODE_SIGN="iPhone Distribution: Vision Credit Ltd" ProvisioningProfile="O2O_house_Profiles" else buildConfig="Debuge" bundleDisplayName="内测" CODE_SIGN="iPhone Distribution: Vision Credit Financial Technology Company Limited (YWEH5GVC2C)" ProvisioningProfile="o2oapp_develop_Profiles" fi appName=$bundleDisplayName echo "$bundleDisplayName" echo "v_$bundleVersion b_$bundleBuildVersion" ##############开始编译app if $isWorkSpace ; then #判断编译方式 echo "开始编译workspace111...." echo "$projectDir$projectName.xcworkspace" #xcodebuild -workspace ${projectDir}$projectName.xcworkspace -scheme $projectName GCC_PREPROCESSOR_DEFINITIONS="${PREPROCESSOR_DEFINITIONS}" -configuration $buildConfig CODE_SIGN_IDENTITY="${CODE_SIGN}" clean build SYMROOT=$app_path xcodebuild -workspace ${projectDir}$projectName.xcworkspace -scheme $projectName -configuration $buildConfig clean build -sdk iphoneos archive -archivePath /Users/vcredit_hzxh/Desktop/jff/O2oApp CODE_SIGN_IDENTITY="${CODE_SIGN}" else echo "开始编译target12222...." cd ${projectDir} xcodebuild -target $projectName -configuration $buildConfig clean build SYMROOT=$app_path fi #判断编译结果 if test $? -eq 0 then echo "编译成功" else echo "编译失败" echo "\n" exit 1 fi ###############开始打包成.ipa #appDir="${app_path}/Release-iphoneos" #app所在路径 ipaDir="/Users/vcredit_hzxh/Document/IPA" #ipa所在路径 time=`date +%Y%m%d%H%M` echo $time #echo "------$appDir" #echo "开始打包$projectName.xcarchive成$projectName.ipa....." #ipaPath="$ipaDir/${time}_${bundleDisplayName}" #if [ ! -d $ipaPath} ];then #mkdir -p $ipaPath} #cd ipaPath} #fi #--------jff------ if [ "${PREPROCESSOR_DEFINITIONS}"x = "VV_BUILD_FOR_RELEASE"x ]; then echo "AppStore" elif [ "${PREPROCESSOR_DEFINITIONS}"x = "VV_BUILD_FOR_RELEASE_HOUSE"x ]; then xcodebuild -exportArchive -archivePath /Users/vcredit_hzxh/Desktop/jff/O2oApp.xcarchive -exportPath /Users/vcredit_hzxh/Documents/IPA -exportOptionsPlist ${projectDir}doc/O2oAppEnterprise.plist elif [ "${PREPROCESSOR_DEFINITIONS}"x = "VV_BUILD_FOR_TEST"x ]; then echo "内侧" else echo "开发时" xcodebuild -exportArchive -archivePath $/Users/vcredit_hzxh/Desktop/jff/O2oApp.xcarchive -exportPath /Users/vcredit_hzxh/DeskTop/jff -exportOptionsPlist ${projectDir}doc/O2oAppDebuge.plist fi #xcodebuild -exportArchive -archivePath ${app_path}/O2oApp.xcarchive -exportPath /Users/vcredit_hzxh/DeskTop/jff -exportOptionsPlist ${projectDir}doc/O2oAppDebuge.plist #废弃的 #xcrun -sdk iphoneos PackageApplication -v "$appDir/$projectName.app" -o "$ipaPath/${projectName}_${bundleDisplayName}_V${bundleVersion}(${bundleBuildVersion})_${time}.ipa" --embed "$ProvisioningProfile" #将app打包成ipa #cp -rp "$appDir/$projectName.app.dSYM" "$directory" #echo "ipa 路径=$ipaPath" rm -rf $appDir