Jenkins、shell

Select a method of distribution

shell脚本打包

#使用方法

if [ ! -d ./IPADir ];
    then
        mkdir -p IPADir;
fi

#工程绝对路径
project_path=$(cd `dirname $0`; pwd)

#工程名 将XXX替换成自己的工程名
project_name=XXX

#scheme名 将XXX替换成自己的sheme名
scheme_name=XXX

#打包模式 Debug/Release
development_mode=Release

#build文件夹路径
build_path=${project_path}/build

#plist文件所在路径
exportOptionsPlistPath=${project_path}/exportAppstore.plist

#导出.ipa文件所在路径
exportIpaPath=${project_path}/IPADir/${development_mode}

echo "请输入你想法发布的方式 ? [ 1:app-store 2:ad-hoc] "

##
read number
    while([[ $number != 1 ]] && [[ $number != 2 ]])
    do
        echo "笨蛋,只能输入 1 or 2"
        echo "请输入你想法发布的方式 ? [ 1:app-store 2:ad-hoc] "
        read number
    done

if [ $number == 1 ];
    then
    development_mode=Release
    exportOptionsPlistPath=${project_path}/exportAppstore.plist
## 证书名字

    else
    development_mode=Debug
    exportOptionsPlistPath=${project_path}/exportTest.plist

fi


echo '///-----------'
echo '/// 正在清理工程'
echo '///-----------'
xcodebuild \
clean -configuration ${development_mode} -quiet  || exit


echo '///--------'
echo '/// 清理完成'
echo '///--------'
echo ''

echo '///-----------'
echo '/// 正在编译工程:'${development_mode}
echo '///-----------'
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive -quiet  || exit

echo '///--------'
echo '/// 编译完成'
echo '///--------'
echo ''

echo '///----------'
echo '/// 开始ipa打包'
echo '///----------'
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit

# 删除build包
if [[ -d build ]]; then
rm -rf build -r
fi


if [ -e $exportIpaPath/$scheme_name.ipa ];
    then
    echo '///----------'
    echo '/// ipa包已导出'
    echo '///----------'
    open $exportIpaPath
    else
    echo '///-------------'
    echo '/// ipa包导出失败 '
    echo '///-------------'
fi
echo '///------------'
echo '/// 打包ipa完成  '
echo '///-----------='
echo ''

echo '///-------------'
echo '/// 开始发布ipa包 '
echo '///-------------'

if [ $number == 1 ];
    then

    #验证并上传到App Store
    # 将-u 后面的XXX替换成自己的AppleID的账号,-p后面的XXX替换成自己的密码
    altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"

# appstore 验证你的账号 accout + password
    "$altoolPath" --validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u xxxx [-p xxx]
# 双冲验证 : account + specialPassword
    "$altoolPath" --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u  xxxx -p xxx
else

    echo "请输入你要发布的平台 ? [ 1:fir 2:蒲公英] "
    ##
    read platform
        while([[ $platform != 1 ]] && [[ $platform != 2 ]])
        do
            echo "笨蛋,只能输入 1 or 2"
            echo "请输入你要发布的平台 ? [ 1:fir 2:蒲公英] "
            read platform
        done

            if [ $platform == 1 ];
                then
                #上传到Fir
                # 将XXX替换成自己的Fir平台的token
                fir login -T xxxx
                fir publish $exportIpaPath/$scheme_name.ipa
            else
                echo "开始上传到蒲公英"
                #上传到蒲公英
                #蒲公英aipKey
                MY_PGY_API_K=xxx
                #蒲公英uKey
                MY_PGY_UK=xxxx

                curl -F "file=@${exportIpaPath}/${scheme_name}.ipa" -F "uKey=${MY_PGY_UK}" -F "_api_key=${MY_PGY_API_K}" https://qiniu-storage.pgyer.com/apiv1/app/upload
            fi
fi
echo "\n\n"
echo "已运行完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
exit 0
  • specialKey位置 /APP-SPECIFIC PASSWORDS
  • 没有开启双重认证不需要specialKey

fastlane

fastfile完整版

default_platform(:ios)

platform :ios do

  before_all do

    ENV["FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"] = "rxpc-vbrs-very-wbrq"
    cocoapods(use_bundle_exec: FALSE)
    puts "所有任务执行开始了"

  end


  desc "上线 App Store"
  lane :release do | options |
    #increment_build_number(xcodeproj: ENV['Xcodeproj'])
    #build_app(workspace: ENV['Workspace', scheme: ENV['Scheme'])
    #upload_to_app_store
  end

  desc "上线testflight"
  lane :beta do | options |
    #increment_build_number(xcodeproj: ENV['Xcodeproj'])
    #build_app(workspace: ENV['Workspace'], scheme: ENV['Scheme'])
    #upload_to_testflight
  end

  desc "上线蒲公英"
  lane :adhoc_pgy do |options|

   increment_build_number(xcodeproj:ENV['Xcodeproj'])
//ipa包根据时间走
   currentTime = Time.new.strftime("%Y-%m-%d-%H-%M-%s")
   logDirectory = "#{currentTime}.ipa"

    build_app(
    workspace: ENV['Workspace'], 
    scheme: ENV['Scheme'],
    silent: true,
    clean: true,
    //输出路径
    output_directory: ENV['Pgy_Output_Path'],
    //ipa输出名字
    output_name: logDirectory,

# xcodebuild ios 9
# Xcode9以后描述文件的自更新必须加入这个字段。shell脚本是默认添加上的
        export_xcargs: "-allowProvisioningUpdates",
    
    export_method:"ad-hoc")

   pgyer(api_key: ENV['Api_Key'], 
	user_key: ENV['Api_Key'])

  end



  desc "上线firim"
  lane :adhoc_firim do |options|

   setup_version_build(options)
	
   build_app(
	workspace: ENV['Workspace'], 
	scheme: ENV['Workspace'],
 	silent: true,
 	clean: true,
	output_directory: ENV['Firim_Output_Path'],
	output_name: "自动打包技术.ipa",
        export_xcargs: "-allowProvisioningUpdates",
	export_method:"ad-hoc")

  firim(firim_api_token:ENV['Firim_Token'])

  end

# 函数
  desc "版本处理"
  def 
//传入options处理
//使用
// $ fastlane adhoc_firim version:2.1 build:2
setup_version_build(options)
    increment_build_number(
	   build_number:options[:build]
	)
    increment_version_number(
	   version_number:options[:version]
	)
 	
  end


  after_all do |lane, options|

    puts"结束了"
  end


  error do |lane, exception, options|
    if options[:debug]
     puts "Hi :)"
    end
  end

end

Jenkins

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
//秘钥
8f0e8a60XXXXXXXXXX676f528e83ed9

This may also be found at: /Users/qionglinfu/.jenkins/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

报错解决