From 3937c295525f44c777fc93bb4dcdf0dbddaa91fa Mon Sep 17 00:00:00 2001 From: Jenkins CI Date: Fri, 8 May 2026 18:47:02 +0800 Subject: [PATCH] ci(jenkins): adapt Jenkinsfile for Windows Jenkins node --- Jenkinsfile | 129 +++++++++++++++++++++++++++------------------------- 1 file changed, 67 insertions(+), 62 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 837b66e..c30ac2c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,89 +1,91 @@ pipeline { agent any - environment { - ANDROID_HOME = '/Users/xuqinmin/Library/Android/sdk' - NEXUS_USER = credentials('nexus-android-user') - NEXUS_PASS = credentials('nexus-android-pass') - AVD_1 = 'Pixel_9_Pro' - AVD_2 = 'Pixel_9_Pro_2' - EMULATOR_BIN = "${ANDROID_HOME}/emulator/emulator" - ADB = "${ANDROID_HOME}/platform-tools/adb" - TEST_PKG = 'com.xuqm.demo.test' - RUNNER = 'androidx.test.runner.AndroidJUnitRunner' + parameters { + string(name: 'BRANCH', defaultValue: 'main', description: 'Git 分支名') + string(name: 'VERSION', defaultValue: '', description: '发布版本号(留空使用 gradle.properties 中的 PUBLISH_VERSION)') + booleanParam(name: 'RUN_TESTS', defaultValue: true, description: '是否运行自动化测试') + booleanParam(name: 'PUBLISH', defaultValue: true, description: '是否发布到 Nexus') } - options { - timeout(time: 60, unit: 'MINUTES') - buildDiscarder(logRotator(numToKeepStr: '10')) + environment { + NEXUS_USER = credentials('nexus-android-user') + NEXUS_PASS = credentials('nexus-android-pass') } stages { - stage('Build') { + stage('Checkout') { steps { - sh './gradlew :sample-app:assembleDebug :sample-app:assembleDebugAndroidTest --no-daemon' + checkout scm + script { + if (params.VERSION?.trim()) { + bat "powershell -Command \"(Get-Content gradle.properties) -replace '^PUBLISH_VERSION=.*', 'PUBLISH_VERSION=${params.VERSION}' | Set-Content gradle.properties\"" + } + } + } + } + + stage('Build AARs & APKs') { + steps { + bat 'gradlew.bat :sample-app:assembleDebug :sample-app:assembleDebugAndroidTest --no-daemon' } } stage('Start Emulators') { + when { expression { return params.RUN_TESTS } } steps { - sh """ - ${EMULATOR_BIN} -avd ${AVD_1} -no-audio -no-boot-anim -no-snapshot-save -no-window & - ${EMULATOR_BIN} -avd ${AVD_2} -no-audio -no-boot-anim -no-snapshot-save -no-window & - ${ADB} wait-for-device - sleep 20 - ${ADB} devices - """ + bat ''' + start /B emulator -avd Pixel_9_Pro -no-audio -no-boot-anim -no-snapshot-save -no-window + start /B emulator -avd Pixel_9_Pro_2 -no-audio -no-boot-anim -no-snapshot-save -no-window + adb wait-for-device + timeout /t 20 /nobreak >nul + adb devices + ''' } } stage('Install APKs') { + when { expression { return params.RUN_TESTS } } steps { - sh """ - APK=sample-app/build/outputs/apk/debug/sample-app-debug.apk - TEST_APK=sample-app/build/outputs/apk/androidTest/debug/sample-app-debug-androidTest.apk - for DEV in emulator-5554 emulator-5556; do - ${ADB} -s \$DEV install -r "\$APK" - ${ADB} -s \$DEV install -r "\$TEST_APK" - done - """ + bat ''' + set APK=sample-app\\build\\outputs\\apk\\debug\\sample-app-debug.apk + set TEST_APK=sample-app\\build\\outputs\\apk\\androidTest\\debug\\sample-app-debug-androidTest.apk + for %%D in (emulator-5554 emulator-5556) do ( + adb -s %%D install -r "%APK%" + adb -s %%D install -r "%TEST_APK%" + ) + ''' } } stage('Single-Device Tests') { + when { expression { return params.RUN_TESTS } } steps { - sh """ - ALL_SINGLE="com.xuqm.sdk.sample.SdkIntegrationTest,\ -com.xuqm.sdk.sample.PushSdkTest,\ -com.xuqm.sdk.sample.NetworkResilienceTest" - ${ADB} -s emulator-5554 shell am instrument -w -r \\ - -e class "\${ALL_SINGLE}" \\ - "${TEST_PKG}/${RUNNER}" | tee test-results-5554.txt - grep -q "FAILURES" test-results-5554.txt && exit 1 || true - """ + bat ''' + set ALL_SINGLE=com.xuqm.sdk.sample.SdkIntegrationTest,com.xuqm.sdk.sample.PushSdkTest,com.xuqm.sdk.sample.NetworkResilienceTest + adb -s emulator-5554 shell am instrument -w -r -e class "%ALL_SINGLE%" "com.xuqm.demo.test/androidx.test.runner.AndroidJUnitRunner" > test-results-5554.txt + findstr /C:"FAILURES" test-results-5554.txt && exit 1 || exit 0 + ''' } } stage('Cross-Device Tests') { + when { expression { return params.RUN_TESTS } } parallel { stage('Sender (5554)') { steps { - sh """ - ${ADB} -s emulator-5554 shell am instrument -w -r \\ - -e class "com.xuqm.sdk.sample.CrossDeviceSenderTest" \\ - "${TEST_PKG}/${RUNNER}" | tee cross-sender.txt - grep -q "FAILURES" cross-sender.txt && exit 1 || true - """ + bat ''' + adb -s emulator-5554 shell am instrument -w -r -e class "com.xuqm.sdk.sample.CrossDeviceSenderTest" "com.xuqm.demo.test/androidx.test.runner.AndroidJUnitRunner" > cross-sender.txt + findstr /C:"FAILURES" cross-sender.txt && exit 1 || exit 0 + ''' } } stage('Receiver (5556)') { steps { - sh """ - ${ADB} -s emulator-5556 shell am instrument -w -r \\ - -e class "com.xuqm.sdk.sample.CrossDeviceReceiverTest" \\ - "${TEST_PKG}/${RUNNER}" | tee cross-receiver.txt - grep -q "FAILURES" cross-receiver.txt && exit 1 || true - """ + bat ''' + adb -s emulator-5556 shell am instrument -w -r -e class "com.xuqm.sdk.sample.CrossDeviceReceiverTest" "com.xuqm.demo.test/androidx.test.runner.AndroidJUnitRunner" > cross-receiver.txt + findstr /C:"FAILURES" cross-receiver.txt && exit 1 || exit 0 + ''' } } } @@ -91,29 +93,32 @@ com.xuqm.sdk.sample.NetworkResilienceTest" stage('Publish to Nexus') { when { - branch 'main' + allOf { + branch 'main' + expression { return params.PUBLISH } + } } steps { - sh """ - ./gradlew publish --no-daemon \\ - -PNEXUS_USER=\${NEXUS_USER} \\ - -PNEXUS_PASSWORD=\${NEXUS_PASS} - """ + script { + def versionArg = params.VERSION?.trim() ? "-PPUBLISH_VERSION=${params.VERSION}" : '' + bat "gradlew.bat publish ${versionArg} -PNEXUS_USER=%NEXUS_USER% -PNEXUS_PASSWORD=%NEXUS_PASS% --no-daemon" + } } } } post { always { - sh "${ADB} emu kill || true" + bat 'adb emu kill || exit 0' archiveArtifacts artifacts: 'test-results-*.txt, cross-*.txt', allowEmptyArchive: true } failure { - sh """ - ${ADB} -s emulator-5554 logcat -d -s XuqmImSDK:D XuqmPushSDK:W XuqmUpdateSDK:D > logcat-5554.txt || true - ${ADB} -s emulator-5556 logcat -d -s XuqmImSDK:D XuqmPushSDK:W XuqmUpdateSDK:D > logcat-5556.txt || true - """ + bat ''' + adb -s emulator-5554 logcat -d -s XuqmImSDK:D XuqmPushSDK:W XuqmUpdateSDK:D > logcat-5554.txt || exit 0 + adb -s emulator-5556 logcat -d -s XuqmImSDK:D XuqmPushSDK:W XuqmUpdateSDK:D > logcat-5556.txt || exit 0 + ''' archiveArtifacts artifacts: 'logcat-*.txt', allowEmptyArchive: true } + success { echo "✅ Android SDK 构建成功" } } }