@@ -20,155 +20,168 @@ pipeline {
2020 stage(' Check for [skip ci]' ) {
2121 when {
2222 expression {
23- return isSkipCI()
23+ return isSkipCI() || isTargetDevelop()
2424 }
2525 }
2626 steps {
2727 script {
28- currentBuild. result = ' UNSTABLE' // Mark build as a warning instead of an error
29- echo " ⚠️ Warning: Skipping CI because '[skip ci]' was found in the PR title or description."
30- }
31- }
32- }
33- stage(' Change to JAVA 17' ) {
34- steps {
35- script {
36- echo ' Changing JAVA version to 17'
37- sh ' sudo update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java'
38- env. JAVA_HOME = ' /usr/lib/jvm/java-17-openjdk-amd64'
28+ if (isTargetDevelop()) {
29+ currentBuild. description = " CI skipped: develop runs on GitHub Actions"
30+ echo " ✅ Skipping CI because the target branch is 'develop'. CI for develop runs on GitHub Actions."
31+ } else {
32+ currentBuild. description = " CI skipped: '[skip ci]' found in the PR"
33+ echo " ✅ Skipping CI because '[skip ci]' was found in the PR title or description."
34+ }
3935 }
4036 }
4137 }
42- stage(' Check PR Size ' ) {
38+ stage(' CI ' ) {
4339 when {
4440 expression {
45- return ! isSkipSizeCheck()
46- }
47- }
48- environment {
49- GIT_BRANCH = " ${ env.CHANGE_BRANCH} "
50- GIT_BRANCH_DEST = " ${ env.CHANGE_TARGET == null ? '' : env.CHANGE_TARGET} "
51- }
52- steps {
53- script {
54- echo " Checking PR Size against ${ env.CHANGE_TARGET ?: 'None (CI build)'} "
55- sh ' chmod +x ./scripts/check_pr_size.sh'
56- sh ' ./scripts/check_pr_size.sh'
41+ return ! isSkipCI() && ! isTargetDevelop()
5742 }
5843 }
59- }
60- stage(' Lint Check' ) {
61- steps {
62- script {
63- echo ' Running Ktlint'
64- sh ' ./gradlew ktlintCheck'
65- }
66- }
67- }
68- stage(' Unit tests' ) {
69- when {
70- expression {
71- return ! isSkipUnitTest()
44+ stages {
45+ stage(' Change to JAVA 17' ) {
46+ steps {
47+ script {
48+ echo ' Changing JAVA version to 17'
49+ sh ' sudo update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java'
50+ env. JAVA_HOME = ' /usr/lib/jvm/java-17-openjdk-amd64'
51+ }
52+ }
7253 }
73- }
74- environment {
75- ANDROID_HOME = ' /opt/android-sdk'
76- }
77- steps {
78- script {
79- echo ' Running unit tests'
80- sh ' ./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest --stacktrace --no-daemon'
54+ stage(' Check PR Size' ) {
55+ when {
56+ expression {
57+ return ! isSkipSizeCheck()
58+ }
59+ }
60+ environment {
61+ GIT_BRANCH = " ${ env.CHANGE_BRANCH} "
62+ GIT_BRANCH_DEST = " ${ env.CHANGE_TARGET == null ? '' : env.CHANGE_TARGET} "
63+ }
64+ steps {
65+ script {
66+ echo " Checking PR Size against ${ env.CHANGE_TARGET ?: 'None (CI build)'} "
67+ sh ' chmod +x ./scripts/check_pr_size.sh'
68+ sh ' ./scripts/check_pr_size.sh'
69+ }
70+ }
8171 }
82- }
83- }
84- stage( ' Build Test APKs ' ) {
85- steps {
86- script {
87- echo ' Building UI APKs '
88- sh ' ./gradlew :app:assembleDhis2Debug :app:assembleDhis2DebugAndroidTest :form:assembleAndroidTest '
72+ stage( ' Lint Check ' ) {
73+ steps {
74+ script {
75+ echo ' Running Ktlint '
76+ sh ' ./gradlew ktlintCheck '
77+ }
78+ }
8979 }
90- }
91- }
92- stage(' Run Form Tests' ) {
93- environment {
94- BROWSERSTACK = credentials(' android-browserstack' )
95- form_apk = sh(returnStdout : true , script : ' find form/build/outputs -iname "*.apk" | sed -n 1p' )
96- form_apk_path = " ${ env.WORKSPACE} /${ form_apk} "
97- buildTag = " ${ env.GIT_BRANCH} - form"
80+ stage(' Unit tests' ) {
81+ when {
82+ expression {
83+ return ! isSkipUnitTest()
84+ }
85+ }
86+ environment {
87+ ANDROID_HOME = ' /opt/android-sdk'
88+ }
89+ steps {
90+ script {
91+ echo ' Running unit tests'
92+ sh ' ./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest --stacktrace --no-daemon'
93+ }
94+ }
9895 }
99- steps {
100- dir( " ${ env.WORKSPACE } /scripts " ) {
96+ stage( ' Build Test APKs ' ) {
97+ steps {
10198 script {
102- echo ' Browserstack deployment and running Form module tests'
103- sh ' chmod +x browserstackJenkinsForm.sh'
104- sh ' ./browserstackJenkinsForm.sh'
99+ echo ' Building UI APKs'
100+ sh ' ./gradlew :app:assembleDhis2Debug :app:assembleDhis2DebugAndroidTest :form:assembleAndroidTest'
105101 }
106102 }
107103 }
108- }
109- stage(' Run UI Tests in portrait' ) {
110- environment {
111- BROWSERSTACK = credentials(' android-browserstack' )
112- app_apk = sh(returnStdout : true , script : ' find app/build/outputs/apk/dhis2/debug -iname "*.apk"' )
113- test_apk = sh(returnStdout : true , script : ' find app/build/outputs/apk/androidTest -iname "*.apk"' )
114- app_apk_path = " ${ env.WORKSPACE} /${ app_apk} "
115- test_apk_path = " ${ env.WORKSPACE} /${ test_apk} "
116- buildTag = " ${ env.GIT_BRANCH} "
117- }
118- steps {
119- dir(" ${ env.WORKSPACE} /scripts" ){
120- script {
121- echo ' Browserstack deployment and running tests'
122- sh ' chmod +x browserstackJenkins.sh'
123- sh ' ./browserstackJenkins.sh'
104+ stage(' Run Form Tests' ) {
105+ environment {
106+ BROWSERSTACK = credentials(' android-browserstack' )
107+ form_apk = sh(returnStdout : true , script : ' find form/build/outputs -iname "*.apk" | sed -n 1p' )
108+ form_apk_path = " ${ env.WORKSPACE} /${ form_apk} "
109+ buildTag = " ${ env.GIT_BRANCH} - form"
110+ }
111+ steps {
112+ dir(" ${ env.WORKSPACE} /scripts" ){
113+ script {
114+ echo ' Browserstack deployment and running Form module tests'
115+ sh ' chmod +x browserstackJenkinsForm.sh'
116+ sh ' ./browserstackJenkinsForm.sh'
117+ }
118+ }
124119 }
125120 }
126- }
127- }
128- stage( ' Run UI Tests in Landscape ' ) {
129- environment {
130- BROWSERSTACK = credentials( ' android-browserstack ' )
131- app_apk = sh( returnStdout : true , script : ' find app/build/outputs/apk/dhis2/debug -iname "*.apk" ' )
132- test_apk = sh( returnStdout : true , script : ' find app/build/outputs/apk/androidTest -iname "*.apk" ' )
133- app_apk_path = " ${ env.WORKSPACE } / ${ app_apk } "
134- test_apk_path = " ${ env.WORKSPACE } / ${ test_apk } "
135- buildTag = " ${ env.GIT_BRANCH } "
136- }
137- steps {
138- dir( " ${ env.WORKSPACE } /scripts " ){
139- script {
140- echo ' Browserstack deployment and running tests '
141- sh ' chmod +x browserstackJenkinsLandscape.sh '
142- sh ' ./browserstackJenkinsLandscape.sh '
121+ stage( ' Run UI Tests in portrait ' ) {
122+ environment {
123+ BROWSERSTACK = credentials( ' android-browserstack ' )
124+ app_apk = sh( returnStdout : true , script : ' find app/build/outputs/apk/dhis2/debug -iname "*.apk" ' )
125+ test_apk = sh( returnStdout : true , script : ' find app/build/outputs/apk/androidTest -iname "*.apk" ' )
126+ app_apk_path = " ${ env.WORKSPACE } / ${ app_apk } "
127+ test_apk_path = " ${ env.WORKSPACE } / ${ test_apk } "
128+ buildTag = " ${ env.GIT_BRANCH } "
129+ }
130+ steps {
131+ dir( " ${ env.WORKSPACE } /scripts " ){
132+ script {
133+ echo ' Browserstack deployment and running tests '
134+ sh ' chmod +x browserstackJenkins.sh '
135+ sh ' ./browserstackJenkins.sh '
136+ }
137+ }
143138 }
144139 }
145- }
146- }
147- stage(' JaCoCo report' ) {
148- steps {
149- script {
150- echo ' Running JaCoCo report on app module'
151- sh ' ./gradlew jacocoReport --stacktrace --no-daemon'
140+ stage(' Run UI Tests in Landscape' ) {
141+ environment {
142+ BROWSERSTACK = credentials(' android-browserstack' )
143+ app_apk = sh(returnStdout : true , script : ' find app/build/outputs/apk/dhis2/debug -iname "*.apk"' )
144+ test_apk = sh(returnStdout : true , script : ' find app/build/outputs/apk/androidTest -iname "*.apk"' )
145+ app_apk_path = " ${ env.WORKSPACE} /${ app_apk} "
146+ test_apk_path = " ${ env.WORKSPACE} /${ test_apk} "
147+ buildTag = " ${ env.GIT_BRANCH} "
148+ }
149+ steps {
150+ dir(" ${ env.WORKSPACE} /scripts" ){
151+ script {
152+ echo ' Browserstack deployment and running tests'
153+ sh ' chmod +x browserstackJenkinsLandscape.sh'
154+ sh ' ./browserstackJenkinsLandscape.sh'
155+ }
156+ }
157+ }
152158 }
153- }
154- }
155- stage(' Sonarqube' ) {
156- environment {
157- GIT_BRANCH = " ${ env.GIT_BRANCH} "
158- // Jenkinsfile considers empty value ('') as null
159- GIT_BRANCH_DEST = " ${ env.CHANGE_TARGET == null ? '' : env.CHANGE_TARGET} "
160- PULL_REQUEST = " ${ env.CHANGE_ID == null ? '' : env.CHANGE_ID } "
161- SONAR_TOKEN = credentials(' android-sonarcloud-token' )
162- }
163- steps {
164- script {
165- echo ' Running Sonarqube'
166- sh ' chmod +x ./scripts/sonarqube.sh'
167- sh ' ./scripts/sonarqube.sh'
159+ stage(' JaCoCo report' ) {
160+ steps {
161+ script {
162+ echo ' Running JaCoCo report on app module'
163+ sh ' ./gradlew jacocoReport --stacktrace --no-daemon'
164+ }
165+ }
166+ }
167+ stage(' Sonarqube' ) {
168+ environment {
169+ GIT_BRANCH = " ${ env.GIT_BRANCH} "
170+ // Jenkinsfile considers empty value ('') as null
171+ GIT_BRANCH_DEST = " ${ env.CHANGE_TARGET == null ? '' : env.CHANGE_TARGET} "
172+ PULL_REQUEST = " ${ env.CHANGE_ID == null ? '' : env.CHANGE_ID } "
173+ SONAR_TOKEN = credentials(' android-sonarcloud-token' )
174+ }
175+ steps {
176+ script {
177+ echo ' Running Sonarqube'
178+ sh ' chmod +x ./scripts/sonarqube.sh'
179+ sh ' ./scripts/sonarqube.sh'
180+ }
181+ }
168182 }
169183 }
170184 }
171-
172185 }
173186 post {
174187 success {
@@ -202,6 +215,10 @@ def isSkipCI() {
202215 return (prTitle. contains(" [skip ci]" ) || prDescription. contains(" [skip ci]" ))
203216}
204217
218+ def isTargetDevelop () {
219+ return (env. CHANGE_TARGET ?: " " ) == ' develop'
220+ }
221+
205222def isSkipSizeCheck () {
206223 def prTitle = env. CHANGE_TITLE ?: " "
207224 def prDescription = env. CHANGE_DESCRIPTION ?: " "
@@ -212,4 +229,4 @@ def isSkipUnitTest() {
212229 def prTitle = env. CHANGE_TITLE ?: " "
213230 def prDescription = env. CHANGE_DESCRIPTION ?: " "
214231 return (prTitle. contains(" [skip unitTest]" ) || prDescription. contains(" [skip unitTest]" ))
215- }
232+ }
0 commit comments