基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

zeqinjie發表於2019-04-11

Jenkins 持續整合

自動化打包分發

基於Jenkins + Gitlab + 蒲公英

部署流程

安裝Jenkins

  1. 安裝Java環境,目前jenkins只支援jdk8 下載地址
  1. 安裝完使用命令 java -version檢查當前版本
  2. java選擇如圖

基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

  1. 安裝 Jenkins
  • 先確保已安裝Homebrew

  • 命令安裝 brew install jenkins

  • 設定開機自啟動

    • 建立一個連結到開機啟動資料夾裡
    ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
    複製程式碼
    • 手動啟動jenkins
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
    複製程式碼
    • 手動關閉jenkins
    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
    複製程式碼
  1. 啟動 Jenkins

瀏覽器開啟連線

  1. 按照提示,找到/Users/wsh/.jenkins/secrets/initialAdminPassword 這個目錄下的initialAdminPassword檔案
  2. Install suggested plugins 安裝推薦外掛
  3. 安裝GitLab Plugin 和 Gitlab Hook Plugin

配置shell指令碼

注意 將shell指令碼儲存到工程目錄下 儲存為 zzq.sh

SECONDS=0

#預設使用的語言是英文
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

#假設指令碼放置在與專案相同的路徑下
project_dir=$(pwd)

#編輯上傳的檔案全部放於此路徑下,不影響原工程 ,儲存專案目錄地址
upload_dir="/Users/addcn/Documents/591TestAndUpload"

if [ -d "$upload_dir" ]; then
    echo "編輯上傳的檔案輸出檔案目錄存在,目錄為:$upload_dir" 
else 
    echo "編輯上傳的檔案目錄不存在" 
    mkdir -pv $upload_dir
    echo "建立打包檔案目錄${upload_dir}成功"
fi


#打包配置環境
configuration="Release"

#判斷是用的xcodeproj還是直接xcworkspace,xcworkspace設定為true,否則設定為false
isWorkSpace=true

#專案名稱
scheme=`find . -name *.xcodeproj | awk -F "[/.]" '{print $(NF-1)}'`

projectName="${scheme}.xcworkspace"

#確定工程名稱,如果用了cocopods,則使用xcworkspace,但是沒有該檔案則使用xcodeproj進行

if [ -a "$project_dir/$projectName" ]; then
	isWorkSpace=true
	projectName="${scheme}.xcworkspace"
else
	isWorkSpace=false
	projectName="${scheme}.xcodeproj"
fi

#指定專案地址
project_path="$project_dir/$projectName"

#確認輸出日期
buildDate=$(date +%Y%m%d%H%M%S)

#指定輸出路徑
output_path="$upload_dir/package$buildDate"

#指定輸出歸檔檔案地址
archive_path="$output_path/${scheme}.xcarchive"

#指定輸出ipa名稱
ipa_name="${scheme}.ipa"

#指定輸出ipa地址
ipa_path="$output_path/$ipa_name"

#指定xarchive檔案匯出授權樣式 bundle id
provisioningProfileName="XC iOS: com.xxxx.xxxxxxx"

#指定打包所使用的輸出方式,目前支援app-store, package, ad-hoc, enterprise, development, 和developer-id,即xcodebuild的method引數
export_method='ad-hoc'

###############獲取版本號,bundleID
infoPlist="$project_dir/$scheme-Info.plist"
bundleVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $infoPlist`
bundleIdentifier=`/usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" $infoPlist`
bundleBuildVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $infoPlist`
displayname=`/usr/libexec/PlistBuddy -c "Print CFBundleDisplayName" $infoPlist`

#輸出設定的變數值
echo  "專案名:$projectName"

echo "===專案路徑: ${project_path}==="

echo "===打包xarchive檔案路徑: ${archive_path}==="

echo "===打包ipa檔案路徑: ${ipa_path}==="

echo "~~~~~~~~~~~~~~~~~~~開始編譯~~~~~~~~~~~~~~~~~~~"

#處理沒有輸出打包檔案目錄的情況
if [ -d "$output_path" ]; then
    echo "打包檔案輸出檔案目錄存在,目錄為:$output_path" 
else 
    echo "打包檔案目錄不存在" 
    mkdir -pv $output_path
    echo "建立打包檔案目錄${output_path}成功"
fi

#處理編譯檔案目錄的情況
cd $upload_dir
rm -rf ./build
buildAppToDir="$upload_dir/build" #編譯打包完成後.app檔案存放的目錄

#重新進入當前專案路徑下
cd $project_dir

security unlock-keychain -p "addcn" /Users/addcn/Library/Keychains/login.keychain

#開始編譯app
if $isWorkSpace ; then  #判斷編譯方式
    echo  "開始編譯workspace...." 
    xcodebuild  -workspace $projectName -scheme $scheme  -configuration $configuration clean build SYMROOT=$buildAppToDir
else
    echo  "開始編譯target...."
    xcodebuild  -target  $projectName  -configuration $configuration clean build SYMROOT=$buildAppToDir
fi

#判斷編譯結果
if test $? -eq 0
then
echo "~~~~~~~~~~~~~~~~~~~編譯成功~~~~~~~~~~~~~~~~~~~"
else
echo "~~~~~~~~~~~~~~~~~~~編譯失敗~~~~~~~~~~~~~~~~~~~"
exit 1
fi

echo "開始打包$scheme.app成$scheme.ipa....."
cd $upload_dir
findFolderName=`find . -name "$configuration-*" -type d |xargs basename` #查詢目錄
appDir=$buildAppToDir/$findFolderName  #app所在路徑

#重新進入當前專案路徑下
cd $project_dir

echo "打包xarchive檔案,路徑為:$archive_path"
if $isWorkSpace ; then  #判斷編譯方式
    echo  "開始打包workspace...." 
    xcodebuild -workspace $projectName -scheme $scheme -destination generic/platform=iOS archive -configuration ${configuration} ONLY_ACTIVE_ARCH=NO -archivePath $archive_path
else
    echo  "開始打包target...."
    xcodebuild -target $projectName -scheme $scheme -destination generic/platform=iOS archive -configuration ${configuration} ONLY_ACTIVE_ARCH=NO -archivePath $archive_path
fi

#檢查檔案是否存在
if [ -a "$archive_path" ]; then
echo "打包$scheme.xcarchive成功."
else
echo "打包$scheme.xcarchive失敗."
exit 1
fi

# echo "開始匯出$scheme.xcarchive成$scheme.ipa....."
# xcodebuild -exportArchive -exportFormat ipa -archivePath $archive_path -exportPath $appDir/$ipa_name -exportProvisioningProfile $provisioningProfileName

echo "開始打包$scheme.app成$scheme.ipa....."
xcrun -sdk iphoneos PackageApplication -v $appDir/$scheme.app -o $appDir/$ipa_name #將app打包成ipa

echo "檢查打包檔案$appDir/${ipa_name}是否存在"
if [ -f "$appDir/$ipa_name" ];then
echo "打包${ipa_name}成功."
else
echo "打包${ipa_name}失敗."
exit 1
fi

cp -f -p $appDir/$ipa_name $ipa_path   #拷貝ipa檔案
echo "複製${ipa_name}${ipa_path}成功"


echo "~~~~~~~~~~~~~~~~~~~結束打包,處理成功~~~~~~~~~~~~~~~~~~~"
#輸出總用時
echo "===Finished.編譯加打包共花費時間: ${SECONDS}s==="

 
echo "正在上傳至蒲公英平臺"

echo "版本:${bundleVersion}"

#蒲公英的ukey apikey
curl -F "file=@${ipa_path}" -F "uKey=xxxxxxxxxxxxx" -F "_api_key=xxxxxxxxxxxxxxx" https://www.pgyer.com/apiv1/app/upload > $output_path/code.text

result=`cat $output_path/code.text`

result1=`echo "${result##*"appQRCodeURL"}"`

length=`expr ${#result1} - 6`

result2=`echo ${result1:3:$length}`

result3=`echo $result2 | sed 's:\\\/:\/:g'`

if [ ! $result3 ];
then
   echo "~~~~~~~~~~~~~~~~~~~上傳失敗~~~~~~~~~~~~~~~~~~~"
else
   echo "~~~~~~~~~~~~~~~~~~~上傳成功~~~~~~~~~~~~~~~~~~~"
   echo "生成的二維碼連結為:${result3}"
fi

# echo "刪除編譯檔案包和打包"
# rm -rf $buildAppToDir
# rm -rf $output_path

#輸出總用時
echo "===Finished.共花費時間: ${SECONDS}s==="

複製程式碼

配置Jenkins

  1. 構建任務
    1. 選擇新建任務
    2. 如建遠端develop。儲存名稱為remove_develop 專案

基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

  1. 配置任務-原始碼管理

基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

  1. 配置任務 - 定時觸發器配置(可選)參考

基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

  1. 配置任務 - 構建執行shell指令碼命令

基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

Jenkins配置結果

專案任務建立 (本地dev 遠端dev 遠端master)

基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

執行構建

基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

執行歷史

基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

蒲公英平臺

基於Jenkins + Gitlab + 蒲公英(附上shell指令碼)

區域網ip + 埠訪問失敗

修改

  • homebrew.mxcl.jenkins.plist 的 httpListenAddress 為 0.0.0.0

目錄地址

  • ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

重啟

  • brew services stop jenkins
  • brew services start jenkins

打包失敗

如報異常: xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH 則根據如下連結操作:

  1. Xcode指令碼自動化打包問題:xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH
  2. 後面根據對比發現新版的Xcode少了這個PackageApplication(轉註:PackageApplication在前幾個版本已被標識為廢棄,在8.3版本徹底移除了) 先去找個舊版的Xcode裡面copy一份過來
  3. 放到下面這個目錄: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
  4. 然後執行命令:
  • sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
  • chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication

相關文章