【问题标题】:Continuous Integration with Jenkins for React Native (iOS + Android) project与 Jenkins 持续集成 React Native (iOS + Android) 项目
【发布时间】:2017-04-20 18:16:54
【问题描述】:

是否可以使用 Jenkins 为 React Native 应用程序实现持续集成?我还没有找到这样做的指南。如果还有其他解决方案,最好的解决方案是什么?另外,iOS项目必须有Mac OS机器吗?

【问题讨论】:

  • 嘿,有什么运气能解决这个问题吗?目前正在尝试做同样的事情。

标签: android ios jenkins react-native continuous-integration


【解决方案1】:

首先要让命令行构建适用于 Android 和 iOS。您可以查看 Xcode 或 Android Studio 日志并复制一些命令。

我将 build.sh 脚本放在 ios 和 android 文件夹中,我可以从 Jenkins 作业中调用该脚本来构建各自的目标。您可以在项目根目录中有一个 build.sh 来调用两者。

Todo:我想弄清楚如何在 Jenkins 作业中运行 eslint airbnb 并生成报告?

这是我的适用于 Xcode 9 的 iOS build.sh 脚本:

#!/bin/sh
############################################
# File: build.sh
# -----------------------
# Author: edOfTheMountain@acme.com
#
# Command line build:
#   1) clean
#   2) build
#   3) archive
#   4) export IPA
#
# http://shashikantjagtap.net/xcodebuild-deploy-ios-app-command-line/
# https://help.apple.com/itc/apploader/e3#/apdATD1E53-D1E1A1303-D1E53A1126
#

 isInPath=$(which xcodebuild)
 if [ ! -x "${isInPath}" ] ; then
    echo "*** Error xcodebuild not found in path"
    exit 1
 fi

isInPath=$(which xcrun)
 if [ ! -x "${isInPath}" ] ; then
    echo "*** Error xcrun not found in path"
    exit 1
 fi


echo "### Start: Cleaning ###############################################################"
rm -rf build
xcodebuild -project MyApp.xcodeproj -scheme MyApp -destination generic/platform=iOS clean     
echo "### Done: Cleaning ###############################################################"

# Analyze
# xcodebuild -project MyApp.xcodeproj -scheme MyApp -sdk iphoneos clean analyze

echo "### Start: Building ###############################################################"
# xcodebuild -project MyApp.xcodeproj -target MyApp -showBuildSettings
# xcodebuild -project MyApp.xcodeproj -scheme MyApp -destination generic/platform=iOS build    

# Run pod install once before building workspace
pod install 

# Now using a Podfile so have to build workspace not build project
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -destination generic/platform=iOS build     
echo "### Done: Building ###############################################################"


CFBundleShortVersionString=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ./MyApp/Info.plist`
CFBundleVersion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" ./MyApp/Info.plist`
echo "CFBundleShortVersionString: ${CFBundleShortVersionString}"
echo "CFBundleVersion: ${CFBundleVersion}"

ipaFileName=MyApp.ipa
renameIpaFileName="field-scout-${CFBundleShortVersionString}.${CFBundleVersion}.ipa"

echo "### Start: Archiving ###############################################################"
# xcodebuild -project MyApp.xcodeproj -scheme MyApp -sdk iphoneos -configuration AppStoreDistribution archive -archivePath $PWD/build/MyApp.xcarchive

# Now using a Podfile so have to build workspace not build project
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -sdk iphoneos -configuration AppStoreDistribution archive -archivePath $PWD/build/MyApp.xcarchive
echo "### Done: Archiving ###############################################################"

echo "### Start: Exporting ###############################################################"
xcodebuild -exportArchive -archivePath $PWD/build/MyApp.xcarchive -exportOptionsPlist MyApp/ExportOptions.plist -exportPath $PWD/build
ls -al build
echo "### Done: Exporting ###############################################################"

appArchiveFile=build/${ipaFileName}
if [ ! -f "${appArchiveFile}" ]; then
    echo "*** Error file not found: ${appArchiveFile}"
    exit 1    
fi

# Extract and verify archive contents
echo "### Unzip: ${ipaFileName}  ###############################################################"
( cd build; unzip -q ${ipaFileName} )
( cd build/Payload; xcrun codesign -dv MyApp.app/ )

outputFile=build/Payload/MyApp.app
if [ ! -d "${outputFile}" ]; then
    echo "*** Error file not found: ${outputFile}"
    exit 1    
fi
rm -rf ./build/Payload
rm -rf ./build/Symbols


# altool is used to verify iOS IPA files
altool_path=/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/Current/Support

isInPath=$(which altool)
 if [ ! -x "${isInPath}" ] ; then
    echo "*** Error altool not found in path"
    echo "Expected altool path:\n ${altool_path}"
    exit 1
 fi

# altool validate will trigger a user dialog first time it is run.
# On a jenkins slave you will need to execute manually in a console once, to allow keychain access.
# $ altool --validate-app -f file -u username [-p password] [--output-format xml]
# $ altool --upload-app -f file -u username [-p password] [--output-format xml]
altool --validate-app -f build/${ipaFileName} -u edOfTheMountain@acme.com -p @keychain:"Application Loader: edOfTheMountain@acme.com"
altool --validate-app -f build/${ipaFileName} -u edOfTheMountain@acme.com -p @keychain:"Application Loader: edOfTheMountain@acme.com" --output-format xml > build/validate.xml
altoolValidate=$?
if [ ${altoolValidate} -ne 0 ]; then
    echo "*** Error IPA failed to validate: build/${ipaFileName}"
    echo "See: build/validate.xml"
    exit 1    
fi

echo "Rename build/${ipaFileName} to build/${renameIpaFileName}" 
mv ./build/${ipaFileName} ./build/${renameIpaFileName} 

echo ##############################
echo        Done 
echo ##############################
echo Ready to upload archive to iTunes:
echo "  ${appArchiveFile}"
echo
uploadExample="$( echo altool --upload-app -f build/${renameIpaFileName} -u edOfTheMountain@acme.com -p @keychain:"Application Loader: edOfTheMountain@acme.com" )"
echo "Upload Example:\n ${uploadExample}"
echo

【讨论】:

  • 为了测试我们在 Jenkinsfile 中有这个:builderNode { // TODO: record results stage("test") { sh "docker run --rm -i '${imageName}' yarn test" } }
【解决方案2】:

是的,完全有可能。您只需从命令行而不是 XCode 或您选择的 IDE 执行所有操作。对于 iOS,请查看 react-native bundle 命令来创建 JS 包,查看 xcodebuildxcrun 以编译本机代码。在 Android 中它更容易一些,因为你有 gradle assembleRelease 任务。在此之前,您必须运行 npm install 来获取所有依赖项,但大致就是这样。

至于 iOS 开发,遗憾的是没有办法,你确实需要一台 OS X 机器。

【讨论】:

  • 能否提供链接
  • 遗憾的是,React Native 网页中没有关于该主题的文档,因此很难将您指向特定的地方。我个人使用fastlane,并遵循非常标准的配置。
  • martinarroyo 还有其他我可以遵循的文档或脚本示例吗?
  • 我不知道,不幸的是:(
  • @martinarroyo : 我和你提到的一样,但是在构建 apk 文件时出现了一些错误,如link
猜你喜欢
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
相关资源
最近更新 更多