From 962d8d2b191c3870e58d533983c61f75cf4bd593 Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Thu, 6 Apr 2023 10:39:14 +0800 Subject: [PATCH] Add compilation cache in react native CI (#15329) ### Description 1. Replacing jobs with stages for better debugging and maintainance 2. Added compilation cache to accelerate the workflow. 3. Splited building protobuf and major code as 2 tasks ### Motivation and Context Reduced compilation time about one hour. test run: https://dev.azure.com/onnxruntime/onnxruntime/_build/results?buildId=943695&view=logs&j=de302ec2-2305-57e0-e8c6-cd89c569f2a3&t=8b360243-7783-51da-8079-2304089d3d1d --- .../mac-coreml-ci-pipeline.yml | 2 +- .../mac-react-native-ci-pipeline.yml | 2 +- .../templates/check-cache-stats.yml | 2 +- .../templates/mac-build-step-with-cache.yml | 36 +- .../templates/react-native-ci.yml | 570 ++++++++++-------- 5 files changed, 325 insertions(+), 287 deletions(-) diff --git a/tools/ci_build/github/azure-pipelines/mac-coreml-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/mac-coreml-ci-pipeline.yml index dd1793921c..8aca46e232 100644 --- a/tools/ci_build/github/azure-pipelines/mac-coreml-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/mac-coreml-ci-pipeline.yml @@ -17,7 +17,7 @@ jobs: parameters: TODAY: $(TODAY) AdditionalKey: coreml - CACHE_DIR: $(CCACHE_DIR) + CacheDir: $(CCACHE_DIR) BuildStep: - script: | python3 tools/ci_build/build.py \ diff --git a/tools/ci_build/github/azure-pipelines/mac-react-native-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/mac-react-native-ci-pipeline.yml index 81c8eef234..51d9d27566 100644 --- a/tools/ci_build/github/azure-pipelines/mac-react-native-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/mac-react-native-ci-pipeline.yml @@ -27,7 +27,7 @@ variables: ${{ if eq(parameters.NpmPublish, 'custom') }}: NpmPackagingMode: '$(VersionSuffix)' -jobs: +stages: - template: templates/react-native-ci.yml parameters: NpmPackagingMode: ${{ variables.NpmPackagingMode }} diff --git a/tools/ci_build/github/azure-pipelines/templates/check-cache-stats.yml b/tools/ci_build/github/azure-pipelines/templates/check-cache-stats.yml index d1fcf24164..4905ae8e18 100644 --- a/tools/ci_build/github/azure-pipelines/templates/check-cache-stats.yml +++ b/tools/ci_build/github/azure-pipelines/templates/check-cache-stats.yml @@ -1,4 +1,4 @@ -# it's used to check the cache stats after the build with ccache +# it's used to check the cache stats after building with ccache parameters: - name: CacheDir displayName: Cache Directory diff --git a/tools/ci_build/github/azure-pipelines/templates/mac-build-step-with-cache.yml b/tools/ci_build/github/azure-pipelines/templates/mac-build-step-with-cache.yml index 68fe83a52d..7cf1fcb509 100644 --- a/tools/ci_build/github/azure-pipelines/templates/mac-build-step-with-cache.yml +++ b/tools/ci_build/github/azure-pipelines/templates/mac-build-step-with-cache.yml @@ -10,33 +10,35 @@ parameters: - name: AdditionalKey type: string -- name: CACHE_DIR +- name: CacheDir type: string +- name: ChangeEveryCommit + type: boolean + default: true + steps: - script: | - brew install ccache + which ccache || brew install ccache echo "##vso[task.prependpath]/usr/local/opt/ccache/libexec" - mkdir -p "${{ parameters.CACHE_DIR }}" + mkdir -p "${{ parameters.CacheDir }}" displayName: Install ccache and update PATH to use linked versions of gcc, cc, etc - task: Cache@2 inputs: - key: ' "${{parameters.TODAY}}" | ${{parameters.AdditionalKey}} | "$(Build.SourceVersion)" ' - path: ${{ parameters.CACHE_DIR }} - restoreKeys: | - "${{parameters.TODAY}}" | ${{parameters.AdditionalKey}} + ${{ if eq(parameters.ChangeEveryCommit, true) }}: + key: ' "${{parameters.TODAY}}" | ${{parameters.AdditionalKey}} | "$(Build.SourceVersion)" ' + restoreKeys: | + "${{parameters.TODAY}}" | ${{parameters.AdditionalKey}} + ${{ else }}: + key: ' ${{parameters.AdditionalKey}} ' + restoreKeys: | + ${{parameters.AdditionalKey}} + path: ${{ parameters.CacheDir }} displayName: ccache task - ${{ parameters.BuildStep }} - - script: | - set -ex - ccache -s - ccache -z - ls -l "${{ parameters.CACHE_DIR }}" - du -sh "${{ parameters.CACHE_DIR }}" - displayName: Show Cache stats and Clear stats. - env: - CCACHE_DIR: ${{parameters.CACHE_DIR}} - condition: always() + - template: check-cache-stats.yml + parameters: + CacheDir: ${{ parameters.CacheDir }} diff --git a/tools/ci_build/github/azure-pipelines/templates/react-native-ci.yml b/tools/ci_build/github/azure-pipelines/templates/react-native-ci.yml index e0eaf206f2..a4e4336f20 100644 --- a/tools/ci_build/github/azure-pipelines/templates/react-native-ci.yml +++ b/tools/ci_build/github/azure-pipelines/templates/react-native-ci.yml @@ -20,302 +20,338 @@ parameters: type: string default: 'NPM_packages' -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' - -- job: ReactNative_CI - pool: - vmImage: 'macOS-12' - variables: - runCodesignValidationInjection: false - dependsOn: - - Android_Java_API_AAR_Packaging_For_React_Native - timeoutInMinutes: 150 - steps: - # 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 - - - 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 - 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 - - - task: DownloadPipelineArtifact@2 - inputs: - buildType: 'current' +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' - # targetPath: '$(Build.BinariesDirectory)/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' - targetPath: '$(Build.BinariesDirectory)/android-full-aar' - displayName: Download Android AAR artifacts + job_name_suffix: 'For_React_Native' + pool_name: '${{parameters.PoolName}}' + packageName: 'onnxruntime-android' - - 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 +- 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() - - 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 + # 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) - - script: | - npm ci - workingDirectory: '$(Build.SourcesDirectory)/js' - displayName: npm ci js + - task: NodeTool@0 + inputs: + versionSpec: '16.x' - - script: | - npm ci - workingDirectory: '$(Build.SourcesDirectory)/js/common' - displayName: npm ci js/common + - script: + brew install coreutils ninja npm yarn + displayName: Install coreutils, ninja, npm, and yarn - - script: | - yarn - workingDirectory: '$(Build.SourcesDirectory)/js/react_native' - displayName: yarn js/react_native + - script: | + python3 -m pip install -q flatbuffers + displayName: Install python modules - - 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 + - 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) - - script: | - xcrun simctl create iPhoneRNTest com.apple.CoreSimulator.SimDeviceType.iPhone-13 - workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/ios' - displayName: Start iOS Simulator + - 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) - - 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 + - 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 - - script: | - pod install - workingDirectory: '$(Build.SourcesDirectory)/js/react_native/ios' - displayName: Pod install for onnxruntime react native ios bridge library + - 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: 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' + - 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' - xcprettyArgs: '--output build/reports/test-results.xml' - publishJUnitResults: true - testRunTitle: 'React Native iOS Instrumented Test Results' - displayName: Run React Native iOS Instrumented Tests + displayName: Pod install for onnxruntime react native ios bridge library - - 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: 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: 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 + - 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 - - 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 + - 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: | - pod install - workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/ios' - displayName: Pod install for onnxruntime react native ios e2e tests + - 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: | - 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 + - script: | + pod install + workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/ios' + displayName: Pod install for onnxruntime react native ios e2e tests - - 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 + - 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 - - 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 + - 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 - - 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 + - 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 - - 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: | + 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 - - 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() + - 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: | - xcrun simctl delete iPhoneRNTest - workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/ios' - displayName: Stop iOS Simulator - condition: always() + - 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: | - git restore . - workingDirectory: '$(Build.SourcesDirectory)/js' - displayName: Restore git changes + - script: | + xcrun simctl delete iPhoneRNTest + workingDirectory: '$(Build.SourcesDirectory)/js/react_native/e2e/ios' + displayName: Stop iOS Simulator + condition: always() - - 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 + - script: | + git restore . + workingDirectory: '$(Build.SourcesDirectory)/js' + displayName: Restore git changes - - task: CopyFiles@2 - inputs: - sourceFolder: $(Build.SourcesDirectory)/js/common - contents: onnxruntime-common*.tgz - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: 'Create Artifacts onnxruntime-common' + - 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/react_native - contents: onnxruntime-react-native*.tgz - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: Create Artifacts onnxruntime-react-native + - task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/js/common + contents: onnxruntime-common*.tgz + targetFolder: $(Build.ArtifactStagingDirectory) + displayName: 'Create Artifacts onnxruntime-common' - - task: PublishPipelineArtifact@0 - inputs: - artifactName: '${{parameters.PackageName}}' - targetPath: '$(Build.ArtifactStagingDirectory)' - displayName: Publish Pipeline Artifact + - task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/js/react_native + contents: onnxruntime-react-native*.tgz + targetFolder: $(Build.ArtifactStagingDirectory) + displayName: Create Artifacts onnxruntime-react-native - - template: component-governance-component-detection-steps.yml - parameters : - condition : 'succeeded' + - task: PublishPipelineArtifact@0 + inputs: + artifactName: '${{parameters.PackageName}}' + targetPath: '$(Build.ArtifactStagingDirectory)' + displayName: Publish Pipeline Artifact - - task: mspremier.PostBuildCleanup.PostBuildCleanup-task.PostBuildCleanup@3 - displayName: Clean Agent Directories - condition: always() + - template: component-governance-component-detection-steps.yml + parameters : + condition : 'succeeded' + + - template: explicitly-defined-final-tasks.yml