Jenkins 配置

1 安装Jenkins

Jenkins是基于Java开发的一种持续集成工具。所以呢,要使用Jenkins必须使用先安装JDK。

JDK安装:Java Development Kit


Jenkins安装

注意: 1、Jenkins 安装成功后,会创建一个Jenkins用户,而Jenkins的工作区间默认是在【/用户/共享/Jenkins/Home/jobs】目录下,可以用Finder-->前往,进入。
2、Jenkins目录下的文件夹的读写权限只对Jenkins用户开放,所以后面apple证书等必须在Jenkins用户下安装,项目的ipa导出也得在Jenkins用户下操作。(或者用管理员权限修改该目录针对用户的权限)
3、Jenkins的使用是每一个用户都可以使用,所以有可能导致构建版本的时候报错,还是老老实实在Jenkins用户下操作吧。

测试Jenkins安装成功 会自动打开浏览器

如果出现下面情况,则JDK有问题重新安装


下图表明安装成功

打开浏览器,输入http://localhost:8080,如果能够正常打开Jenkins,则Jenkins安装成功。

设置Jenkins用户

2.1 进入 系统偏好设置->用户与群组
2.2 点击左下角的解锁,输入当前用户的密码
2.3 此时Jenkins用户还是一个空的无名用户,可以在用户列表中选择Jenkins用户,右击并选择“高级选项”,输入全名并确定。

2.4 **点击“更改密码”重设Jenkins用户的密码。为了后期方便,可勾选“运行用户管理这台电脑”,将Jenkins用户设为管理员。 **
2.5 选择用户列表下方的登录选项,将自动登录用户设为Jenkins。

3.初始化Jenkins
重启以后,自动以Jenkins登录了。找到/Users/Shared/Jenkins/Home/ 这个目录下,打开initialAdminPassword文件,复制出密码,就可以填到网页上去重置密码了

Unlock Jenkins
Customize Jenkins
Creast First Admin User

常用插件

Keychains and Provisioning Profiles Management
Post-Build Script Plug-in
SSH Slaves plugin
Subversion Tagging Plugin
GitLab Plugin
Extended Choice Parameter Plug-In

配置项目

Snip20170111_6.png
Snip20170112_8.png

配置代码

echo "准备开始打ipa包...................." 

#项目名称
project_name="HeiPiaoFishingBusiness"

#工程环境路径  
workspace_path="/Users/Shared/Jenkins/Home/workspace/IOS-B"

#build的路径
build_path="$workspace_path/$project_name"

#证书
CODE_SIGN_IDENTITY="iPhone Distribution: Shenzhen Heipiao Technology Co., Ltd. (456PY4GRQJ)"

#描述文件
PROVISIONING_PROFILE_APPSTORE="eea7f8c4-08c8-459d-ae9d-9ca66a5e529b"
PROVISIONING_PROFILE_AD_Hoc="fc6bf319-0114-4c0b-8d1c-e9f90419ffe9"


#蒲公英USER_KEY
USER_KEY="7b19054ef2a2aa2678cddbd33d1b10d5"

#蒲公英API_KEY
API_KEY="cafcda0bf7a09201f1d39cb2965a2c6f"

svn upgrade
#解决冲突文件
svn resolve --accept theirs-full "${build_path}/${project_name}/Dev_info.plist"
# info.plist路径
project_infoplist_path="$build_path/$project_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-%H-%M-%S)"

#IPA名
appName_appStore="${project_name}_V${bundleShortVersion}_${DATE}_appStore"
appName_productNetTest="${project_name}_V${bundleShortVersion}_${DATE}_productNetTest"
appName_outNetTest="${project_name}_V${bundleShortVersion}_${DATE}_outNetTest"
appName_inNetTest="${project_name}_V${bundleShortVersion}_${DATE}_inNetTest"

#.app生成后的路径
app_path=$build_path/build/Build/Products/Release-iphoneos/${project_name}.app
app_Dev_path=$build_path/build/Build/Products/Release-iphoneos/${project_name}_Dev.app


#添加解锁
security unlock-keychain -p "0" "/Users/Shared/Jenkins/Library/Keychains/login.keychain-db"

cd $workspace_path



log=$(svn log |head -n 5) 
#  >不追加输出 >>追加输出
echo $log > log.txt

mkdir -p APPS


#IPA生成后的路径
ipa_appStore_path=$workspace_path/APPS/${appName_appStore}.ipa
ipa_productNetTest_path=$workspace_path/APPS/${appName_productNetTest}.ipa
ipa_outNetTest_path=$workspace_path/APPS/${appName_outNetTest}.ipa
ipa_inNetTest_path=$workspace_path/APPS/${appName_inNetTest}.ipa


echo "第一步,进入项目工程文件: $build_path"
cd $build_path

echo "第二步,执行build clean命令"
xcodebuild clean



#参数构建

#内网测试
if [ $para = "innet" ]; then 
echo "第三步,执行编译生成.app命令"
xcodebuild -workspace $project_name.xcworkspace -scheme "${project_name}_Dev" -sdk iphoneos GCC_PREPROCESSOR_DEFINITIONS="DEVELOPMENT=1 API_TYPE=0" PROVISIONING_PROFILE="$PROVISIONING_PROFILE_AD_Hoc" CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" IPHONEOS_DEPLOYMENT_TARGET="8.0" -configuration Release -derivedDataPath build

echo "第四步, 导出ipa包"
xcrun -sdk iphoneos PackageApplication -v ${app_Dev_path} -o ${ipa_inNetTest_path}

echo "制作 outNetTest ipa 包完成......................."

#路径写入文件
#echo "${ipa_inNetTest_path}" > $workspace_path/path.txt

cd /Users/Shared/Jenkins/Home/workspace
./upload.sh ${ipa_inNetTest_path} ${log}




#外网测试
elif [ $para = "outnet" ]; then 
echo "第三步,执行编译生成.app命令"
xcodebuild -workspace $project_name.xcworkspace -scheme "${project_name}_Dev" -sdk iphoneos GCC_PREPROCESSOR_DEFINITIONS="DEVELOPMENT=1 API_TYPE=1" PROVISIONING_PROFILE="$PROVISIONING_PROFILE_AD_Hoc" CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" IPHONEOS_DEPLOYMENT_TARGET="8.0" -configuration Release -derivedDataPath build

#echo "第四步, 导出ipa包"
xcrun -sdk iphoneos PackageApplication -v ${app_Dev_path} -o ${ipa_outNetTest_path}
echo "制作 outNetTest ipa 包完成......................."

#上传外网测试包到蒲公英
echo '++++++++++++++upload+++++++++++++'

#路径写入文件
#echo "${ipa_outNetTest_path}" > $workspace_path/path.txt

cd /Users/Shared/Jenkins/Home/workspace
./upload.sh ${ipa_outNetTest_path} ${log}



else

#生成APPSTORE包
echo "第三步,执行编译生成.app命令"
xcodebuild -workspace $project_name.xcworkspace    -scheme   $project_name   -sdk iphoneos GCC_PREPROCESSOR_DEFINITIONS="DEVELOPMENT=0 API_TYPE=2" PROVISIONING_PROFILE="$PROVISIONING_PROFILE_APPSTORE" CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" IPHONEOS_DEPLOYMENT_TARGET="8.0" -configuration Release -derivedDataPath build
echo "第四步, 导出ipa包"
xcrun -sdk iphoneos PackageApplication -v $app_path -o $ipa_appStore_path
echo "制作appStore ipa包完成......................."


#生产环境测试
echo "第二步,执行build clean命令"
xcodebuild clean
echo "第三步,执行编译生成.app命令"
xcodebuild -workspace $project_name.xcworkspace   -scheme   ${project_name}   -sdk iphoneos GCC_PREPROCESSOR_DEFINITIONS="DEVELOPMENT=0 API_TYPE=2" PROVISIONING_PROFILE="$PROVISIONING_PROFILE_AD_Hoc" CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" IPHONEOS_DEPLOYMENT_TARGET="8.0" -configuration Release -derivedDataPath build
echo "第四步, 导出ipa包"
xcrun -sdk iphoneos PackageApplication -v ${app_path} -o ${ipa_productNetTest_path}
echo "制作 productNetTest ipa 包完成......................."

#路径写入文件
#echo "${ipa_productNetTest_path}" > $workspace_path/path.txt

cd /Users/Shared/Jenkins/Home/workspace
./upload.sh ${ipa_productNetTest_path} ${log}


if [ $tag = "true" ]; then 
#tag
echo "打tag V${bundleShortVersion}_${DATE}"
svn cp -m  "打tag V${bundleShortVersion}_${DATE}"  https://192.168.1.201/svn/heipiao/app/ios/B/trunk/${project_name} https://192.168.1.201/svn/heipiao/app/ios/B/tags/V${bundleShortVersion}_${DATE}
fi

fi 

upload.sh代码

#!/bin/sh
echo '==============='
echo $*

while result=$(curl --retry 10 -F "file=@$1" -F "uKey=7b19054ef2a2aa2678cddbd33d1b10d5" -F "_api_key=cafcda0bf7a09201f1d39cb2965a2c6f" -F "updateDescription=$2" "https://qiniu-storage.pgyer.com/apiv1/app/upload")
echo  ${result}
do
    if [[ $result == '' ]]; then
        echo "upload fail" 
    else
        echo "upload success"
        break
    fi
done

没有Scheme,导致无法打包

命令行调用code sign时报错

security unlock-keychain -p "你的用户密码" ~/Library/Keychains/login.keychain

Mac下Jenkins+SVN+Xcode构建持续导出环境
Mac下Jenkins+SVN(Git)+Xcode搭建持续构建环境
手把手教你利用Jenkins持续集成iOS项目
基于xcodebuild和xcrun的自动化打包

xcodebuild -sdk xxx -target xxx GCC_PREPROCESSOR_DEFINITIONS="API_TYPE=0"  
API_TYPE=0 ,后面只能为数字 在下图配置
Snip20170111_1.png

基本配置

参数化构建
测试脚本
Jenkins地址
xcodebuild路径
设置编码
svn方式构建
构建出发机制

安卓配置

QQ20170114-0.png
QQ20170114-1.png
  • 安卓shell脚本
#start
#项目名称
PROJECT_NAME="Android_B"

#工程环境路径
WORKSPACE_PATH="${JENKINS_HOME}/jobs/${PROJECT_NAME}/workspace"

#蒲公英USER_KEY
USER_KEY="7b19054ef2a2aa2678cddbd33d1b10d5"

#蒲公英API_KEY
API_KEY="cafcda0bf7a09201f1d39cb2965a2c6f"

# gradle.properties路径
VERSION_CODE_PATH="${WORKSPACE_PATH}/gradle.properties"

#取版本号
VERSION_CODE=`cat ${VERSION_CODE_PATH} | sed -n 's/.*VERSION_NAME=\(\S\)/\1/p' | tr -d '\r'`

echo ${VERSION_CODE}

#时间
DATE="$(date +%Y-%m-%d)"


#svn路径

SVN_TAG_PATH="https://192.168.1.201/svn/heipiao/app/andriod/B/tags"
#trunk_path
TRUNK_PATH="https://192.168.1.201/svn/heipiao/app/andriod/B/trunk"

SVN_USER="maimingliang"
SVN_PWD="maimingliang"

#tagName

TAG_NAME="v${VERSION_CODE}-${DATE}"


echo ${TAG_NAME}

 

 
if [ ${BUILD_TYPE} = 'ProductionRelease' ]&&[ ${IS_CREATE_TAG} = 'true' ]; then


echo "创建tag目录"

svn mkdir ${SVN_TAG_PATH}/${TAG_NAME} -m "mkdir tags ${TAG_NAME}" --username "$SVN_USER" --password "$SVN_PWD" --non-interactive


echo "打tag"

svn cp $TRUNK_PATH $SVN_TAG_PATH/${TAG_NAME} -m "tag version ${TAG_NAME}-${DATE}"  --username "$SVN_USER" --password "$SVN_PWD" --non-interactive


else

echo '不符合打tag的条件'

fi
 
 


#日志

LOG_STR=$(svn log --limit 1 --username=$SVN_USER --password=$SVN_PWD ${WORKSPACE_PATH})

echo ${LOG_STR}




#判断是否需要上传蒲公英

if [ ${BUILD_TYPE} = 'BetaOutdebug' ]; then

curl --retry 10 -F "file=@${WORKSPACE_PATH}/app/build/outputs/apk/hp-b-v${VERSION_CODE}-beta-${DATE}-outdebug.apk" -F "uKey=${USER_KEY}" -F "_api_key=${API_KEY}" https://qiniu-storage.pgyer.com/apiv1/app/upload

else

echo ${BUILD_TYPE}

fi


#判断是否需要打tag

#end

xcodebuild批量打包之区分不同的渠道

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容