parameters: - name: NpmPackagingMode displayName: 'NPM packages publish configuration' type: string default: 'dev' - name: BuildConfig displayName: 'Build config' type: string values: - 'Release' - 'MinSizeRel' - 'Debug' - 'RelWithDebugInfo' default: 'Release' - name: PoolName displayName: 'Pool name' type: string - name: PackageName displayName: 'Package name' type: string default: 'NPM_packages' stages: - stage: Build_Android_AAR displayName: Build Android AAR jobs: - template: android-java-api-aar.yml parameters: buildConfig: '${{parameters.BuildConfig}}' # Mobile build: # buildSettings: '$(Build.SourcesDirectory)/tools/ci_build/github/js/react_native_e2e_mobile_aar_build_settings.json' # includedOpsConfig: '$(Build.SourcesDirectory)/tools/ci_build/github/android/mobile_package.required_operators.config' # artifactName: 'onnxruntime-android-mobile-aar' # packageName: 'onnxruntime-mobile' buildSettings: '$(Build.SourcesDirectory)/tools/ci_build/github/js/react_native_e2e_full_aar_build_settings.json' artifactName: 'onnxruntime-android-full-aar' job_name_suffix: 'For_React_Native' pool_name: '${{parameters.PoolName}}' packageName: 'onnxruntime-android' - stage: ReactNative_CI displayName: React Native CI dependsOn: - Build_Android_AAR jobs: - job: ReactNative_CI pool: vmImage: 'macOS-12' variables: runCodesignValidationInjection: false TODAY: $[format('{0:dd}{0:MM}{0:yyyy}', pipeline.startTime)] PROTO_CACHE_DIR: '$(Pipeline.Workspace)/ccache_proto' ORT_CACHE_DIR: '$(Pipeline.Workspace)/ccache_ort' timeoutInMinutes: 150 steps: - task: mspremier.PostBuildCleanup.PostBuildCleanup-task.PostBuildCleanup@3 displayName: Clean Agent Directories condition: always() # Onnx has no 3.9 python package available yet, need to use python 3.8 to avoid build onnx package # pythonVersion can be updated in Azure pipeline settings # https://dev.azure.com/onnxruntime/onnxruntime/_build?definitionId=188 - task: UsePythonVersion@0 displayName: Use Python $(pythonVersion) inputs: versionSpec: $(pythonVersion) - task: NodeTool@0 inputs: versionSpec: '16.x' - script: brew install coreutils ninja npm yarn displayName: Install coreutils, ninja, npm, and yarn - script: | python3 -m pip install -q flatbuffers displayName: Install python modules - template: mac-build-step-with-cache.yml parameters: TODAY: $(TODAY) AdditionalKey: ' protobuf | "$(Agent.OS)" | $(Build.SourcesDirectory)/cmake/deps.txt, $(Build.SourcesDirectory)/tools/ci_build/github/linux/docker/inference/x64/python/cpu/scripts/install_protobuf.sh' CacheDir: $(PROTO_CACHE_DIR) ChangeEveryCommit: false BuildStep: - script: | set -e -x $(Build.SourcesDirectory)/tools/ci_build/github/linux/docker/inference/x64/python/cpu/scripts/install_protobuf.sh -d $(Build.SourcesDirectory)/cmake/deps.txt -p $(Build.BinariesDirectory)/installed displayName: Build protobuf env: CCACHE_DIR: $(PROTO_CACHE_DIR) - template: mac-build-step-with-cache.yml parameters: TODAY: $(TODAY) AdditionalKey: react_${{parameters.BuildConfig}} CacheDir: $(ORT_CACHE_DIR) BuildStep: - script: | set -e -x python3 $(Build.SourcesDirectory)/tools/ci_build/github/apple/build_ios_framework.py \ --config ${{parameters.BuildConfig}} \ --build_dir $(Build.BinariesDirectory)/ios_framework --path_to_protoc_exe $(Build.BinariesDirectory)/installed/bin/protoc \ $(Build.SourcesDirectory)/tools/ci_build/github/js/react_native_e2e_full_ios_framework_build_settings.json cd $(Build.BinariesDirectory)/ios_framework/framework_out zip -r onnxruntime-c.zip . # Mobile build: # python3 $(Build.SourcesDirectory)/tools/ci_build/github/apple/build_ios_framework.py \ # --config ${{parameters.BuildConfig}} \ # --build_dir $(Build.BinariesDirectory)/ios_framework \ # --include_ops_by_config $(Build.SourcesDirectory)/tools/ci_build/github/android/mobile_package.required_operators.config \ # $(Build.SourcesDirectory)/tools/ci_build/github/js/react_native_e2e_mobile_ios_framework_build_settings.json # cd $(Build.BinariesDirectory)/ios_framework/framework_out # zip -r onnxruntime-mobile-c.zip . displayName: Build iOS package env: CC: clang CXX: clang++ CCACHE_CPP2: 1 CCACHE_DEPEND: 1 CCACHE_SLOPPINESS: modules CCACHE_DIR: $(ORT_CACHE_DIR) - task: DownloadPipelineArtifact@2 inputs: buildType: 'current' # Mobile build: # artifactName: 'onnxruntime-android-mobile-aar' # targetPath: '$(Build.BinariesDirectory)/android-mobile-aar' artifactName: 'onnxruntime-android-full-aar' targetPath: '$(Build.BinariesDirectory)/android-full-aar' displayName: Download Android AAR artifacts - task: CopyFiles@2 inputs: # Mobile build: # sourceFolder: $(Build.BinariesDirectory)/android-mobile-aar # contents: onnxruntime-mobile-*.aar sourceFolder: $(Build.BinariesDirectory)/android-full-aar contents: onnxruntime-android-*.aar targetFolder: $(Build.SourcesDirectory)/js/react_native/android/libs displayName: Copy Android package to React Native directory - task: CopyFiles@2 inputs: sourceFolder: $(Build.BinariesDirectory)/ios_framework/framework_out # Mobile build: # contents: onnxruntime-mobile-c.zip contents: onnxruntime-c.zip targetFolder: $(Build.SourcesDirectory)/js/react_native/local_pods displayName: Copy iOS package to React Native directory - script: | npm ci workingDirectory: '$(Build.SourcesDirectory)/js' displayName: npm ci js - script: | npm ci workingDirectory: '$(Build.SourcesDirectory)/js/common' displayName: npm ci js/common - script: | yarn workingDirectory: '$(Build.SourcesDirectory)/js/react_native' displayName: yarn js/react_native - script: | python3 tools/python/run_android_emulator.py \ --android-sdk-root $(ANDROID_SDK_ROOT) \ --create-avd --system-image "system-images;android-30;default;x86_64" \ --start --emulator-extra-args="-partition-size 4096" \ --emulator-pid-file $(Build.BinariesDirectory)/emulator.pid displayName: Start Android Emulator - script: | xcrun simctl create iPhoneRNTest com.apple.CoreSimulator.SimDeviceType.iPhone-13 workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/ios' displayName: Start iOS Simulator - template: android-dump-logs-from-steps.yml parameters: steps: - task: Gradle@3 inputs: gradleWrapperFile: '$(Build.SourcesDirectory)/js/react_native/android/gradlew' workingDirectory: '$(Build.SourcesDirectory)/js/react_native/android' options: '--stacktrace' tasks: 'connectedDebugAndroidTest' publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' testRunTitle: 'React Native Android Instrumented Test results' javaHomeOption: 'path' jdkDirectory: '$(JAVA_HOME_11_X64)' sonarQubeRunAnalysis: false spotBugsAnalysis: false displayName: Run React Native Android Instrumented Tests - script: | pod install workingDirectory: '$(Build.SourcesDirectory)/js/react_native/ios' displayName: Pod install for onnxruntime react native ios bridge library - task: Xcode@5 inputs: actions: 'test' configuration: 'Debug' sdk: 'iphonesimulator' xcWorkspacePath: '$(Build.SourcesDirectory)/js/react_native/ios/OnnxruntimeModule.xcworkspace' scheme: 'OnnxruntimeModuleTest' packageApp: false destinationPlatformOption: 'iOS' destinationSimulators: 'iPhone 13,OS=latest' workingDirectory: '$(Build.SourcesDirectory)/js/react_native/ios' xcprettyArgs: '--output build/reports/test-results.xml' publishJUnitResults: true testRunTitle: 'React Native iOS Instrumented Test Results' displayName: Run React Native iOS Instrumented Tests - task: PublishTestResults@2 inputs: testResultsFiles: '$(Build.SourcesDirectory)/js/react_native/ios/build/reports/test-results.xml' failTaskOnFailedTests: true testRunTitle: 'React Native iOS Instrumented Test results' condition: succeededOrFailed() displayName: Publish React Native iOS Instrumented Test Results - task: PowerShell@2 inputs: filePath: '$(Build.SourcesDirectory)/tools/ci_build/github/js/pack-npm-packages.ps1' arguments: '"-dev.$(Get-Date -Format yyyyMMdd)-$(git rev-parse --short HEAD)" $(Build.SourcesDirectory) react_native' workingDirectory: '$(Build.SourcesDirectory)' errorActionPreference: stop env: ORT_JS_PACK_MODE: e2e displayName: Pack NPM packages - script: | mv $(Build.SourcesDirectory)/js/common/onnxruntime-common*.tgz onnxruntime-common.tgz yarn add --no-lockfile file:./onnxruntime-common.tgz mv $(Build.SourcesDirectory)/js/react_native/onnxruntime-react-native*.tgz onnxruntime-react-native.tgz yarn add --no-lockfile file:./onnxruntime-react-native.tgz yarn workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e' displayName: Bootstrap Android and iOS e2e tests - script: | pod install workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/ios' displayName: Pod install for onnxruntime react native ios e2e tests - script: | keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -storepass android \ -keypass android -keyalg RSA -keysize 2048 -validity 999999 -dname "CN=Android Debug,O=Android,C=US" workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/android' displayName: Generate a debug keystore - task: CopyFiles@2 inputs: # Mobile build: # sourceFolder: $(Build.BinariesDirectory)/android-mobile-aar # contents: onnxruntime-mobile-*.aar sourceFolder: $(Build.BinariesDirectory)/android-full-aar contents: onnxruntime-*.aar targetFolder: $(Build.SourcesDirectory)/js/react_native/e2e/android/app/libs displayName: Copy Android package to Android e2e test directory - template: android-dump-logs-from-steps.yml parameters: steps: - task: Gradle@3 inputs: gradleWrapperFile: '$(Build.SourcesDirectory)/js/react_native/e2e/android/gradlew' workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/android' options: '--stacktrace' tasks: ':app:connectedDebugAndroidTest' publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' testRunTitle: 'React Native Android e2e Test results' javaHomeOption: 'path' jdkDirectory: '$(JAVA_HOME_11_X64)' sonarQubeRunAnalysis: false spotBugsAnalysis: false displayName: Run React Native Android e2e Tests - script: | export FORCE_BUNDLING=1 export RCT_NO_LAUNCH_PACKAGER=1 export ENTRY_FILE=index.tsx xcrun xcodebuild test -workspace $(Build.SourcesDirectory)/js/react_native/e2e/ios/OnnxruntimeModuleExample.xcworkspace \ -scheme OnnxruntimeModuleExample -destination 'platform=iOS Simulator,OS=latest,name=iPhoneRNTest' \ -derivedDataPath $(Build.BinariesDirectory)/react_native/ios_e2e_test/derived_data | xcpretty -r junit --no-color \ --output $(Build.SourcesDirectory)/js/react_native/e2e/ios/build/reports/test-results.xml workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e' displayName: Run React Native iOS e2e tests - task: PublishTestResults@2 inputs: testResultsFiles: '$(Build.SourcesDirectory)/js/react_native/e2e/ios/build/reports/test-results.xml' failTaskOnFailedTests: true testRunTitle: 'React Native iOS e2e Test results' condition: succeededOrFailed() displayName: Publish React Native iOS e2e Test Results - script: | python3 tools/python/run_android_emulator.py \ --android-sdk-root $(ANDROID_SDK_ROOT) \ --stop \ --emulator-pid-file $(Build.BinariesDirectory)/emulator.pid displayName: Stop Android Emulator condition: always() - script: | xcrun simctl delete iPhoneRNTest workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/ios' displayName: Stop iOS Simulator condition: always() - script: | git restore . workingDirectory: '$(Build.SourcesDirectory)/js' displayName: Restore git changes - task: PowerShell@2 inputs: filePath: '$(Build.SourcesDirectory)/tools/ci_build/github/js/pack-npm-packages.ps1' arguments: '"${{parameters.NpmPackagingMode}}" $(Build.SourcesDirectory) react_native' workingDirectory: '$(Build.SourcesDirectory)' errorActionPreference: stop displayName: Pack NPM packages - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/js/common contents: onnxruntime-common*.tgz targetFolder: $(Build.ArtifactStagingDirectory) displayName: 'Create Artifacts onnxruntime-common' - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/js/react_native contents: onnxruntime-react-native*.tgz targetFolder: $(Build.ArtifactStagingDirectory) displayName: Create Artifacts onnxruntime-react-native - task: PublishPipelineArtifact@0 inputs: artifactName: '${{parameters.PackageName}}' targetPath: '$(Build.ArtifactStagingDirectory)' displayName: Publish Pipeline Artifact - template: component-governance-component-detection-steps.yml parameters : condition : 'succeeded' - template: explicitly-defined-final-tasks.yml