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文件,复制出密码,就可以填到网页上去重置密码了。
常用插件
Keychains and Provisioning Profiles Management
Post-Build Script Plug-in
SSH Slaves plugin
Subversion Tagging Plugin
GitLab Plugin
Extended Choice Parameter Plug-In
配置项目
配置代码
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 ,后面只能为数字 在下图配置
基本配置
安卓配置
- 安卓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