使用Jenkins进行React Native(iOS+Android)项目的持续集成

11

能否使用Jenkins实现React Native应用的持续集成?我没有找到相关的指南。如果还有其他解决方案,哪个是最好的?此外,对于iOS项目,是否必须使用Mac OS机器?


嘿,有没有找到解决方法?我目前也在尝试做同样的事情。 - justColbs
这里有一篇很好的文章可以帮助你:https://medium.com/@iampravikant/ci-cd-pipeline-for-react-native-project-in-jenkins-from-bitbucket-396fa29f8dc5 - Pramod Ravikant
2个回答

13

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

至于iOS开发,不幸的是,没有绕过它的方法,您确实需要一台OS X机器。


1
请提供链接,谢谢。 - Ashok R
很不幸的是,React Native网页上并没有关于这个主题的文档,因此很难指向一个特定的位置。我个人使用fastlane ,并遵循相当标准的配置。 - martinarroyo
martinarroyo,有没有其他文档或脚本示例可以参考? - Jan
很遗憾,我不知道。 - martinarroyo
@martinarroyo:我按照你提到的步骤进行了操作,但是APK文件在构建时出现了一些错误,如此链接所述。 - Kalanka

5
首先要做的是使Android和iOS都能够进行命令行构建。您可以查看Xcode或Android Studio日志并复制其中的一些命令。
我在ios和android文件夹中放置了一个build.sh脚本,可以从Jenkins作业中调用来构建各自的目标。您可以在项目根目录中拥有一个build.sh,然后调用这两个目标的build.sh。
待办事项:我想找出如何在Jenkins作业中运行eslint airbnb并生成报告?
以下是我的iOS build.sh脚本,适用于Xcode 9:
#!/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" } } - Cole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接