.gitignore
... ...
@@ -4,7 +4,19 @@ war
4 4
build.log
5 5
reporting.log
6 6
.metadata
7
+
8
+# Built application files
9
+*.apk
10
+*.aar
11
+*.ap_
12
+*.aab
13
+
14
+# Files for the ART/Dalvik VM
15
+*.dex
16
+
17
+# Java class files
7 18
*.class
19
+
8 20
*.swp
9 21
*~
10 22
manifest.txt
... ...
@@ -20,6 +32,9 @@ java/com.sap.sailing.simulator/bin/com/sap/sailing/simulator/Simulator.gwt.xml
20 32
java/com.sap.sailing.gwt.ui/SailingGWT Remote Profiling (Run-Mode only).launch
21 33
java/com.sap.sailing.gwt.ui/SailingGWT.launch
22 34
35
+# Generated files
36
+bin/
37
+
23 38
## Android Studio and Intellij and Android in general
24 39
gen/
25 40
.idea/
... ...
@@ -46,3 +61,73 @@ SailingServer (No Proxy) Chargebee.launch
46 61
mta_archives/
47 62
db/.env
48 63
64
+# Proguard folder generated by Eclipse
65
+proguard/
66
+
67
+# Log Files
68
+*.log
69
+
70
+# Android Studio Navigation editor temp files
71
+.navigation/
72
+
73
+# Android Studio captures folder
74
+captures/
75
+
76
+# IntelliJ
77
+*.iml
78
+.idea/workspace.xml
79
+.idea/tasks.xml
80
+.idea/gradle.xml
81
+.idea/assetWizardSettings.xml
82
+.idea/dictionaries
83
+.idea/libraries
84
+.idea/compiler.xml
85
+.idea/misc.xml
86
+.idea/runConfigurations.xml
87
+# Android Studio 3 in .gitignore file.
88
+.idea/caches
89
+.idea/modules.xml
90
+# Comment next line if keeping position of elements in Navigation Editor is relevant for you
91
+.idea/navEditor.xml
92
+.idea/jarRepositories.xml
93
+
94
+# Keystore files
95
+# Uncomment the following lines if you do not want to check your keystore files in.
96
+#*.jks
97
+#*.keystore
98
+
99
+# External native build folder generated in Android Studio 2.2 and later
100
+.externalNativeBuild
101
+.cxx/
102
+
103
+# Google Services (e.g. APIs or Firebase)
104
+# google-services.json
105
+
106
+# Freeline
107
+freeline.py
108
+freeline/
109
+freeline_project_description.json
110
+
111
+# fastlane
112
+fastlane/report.xml
113
+fastlane/Preview.html
114
+fastlane/screenshots
115
+fastlane/test_output
116
+fastlane/readme.md
117
+
118
+# Version control
119
+vcs.xml
120
+
121
+# lint
122
+lint/intermediates/
123
+lint/generated/
124
+lint/outputs/
125
+lint/tmp/
126
+# lint/reports/
127
+
128
+# OS generated files #
129
+######################
130
+.DS_Store
131
+.DS_Store?
132
+
133
+/gav.json
.pipeline/config.yml
... ...
@@ -0,0 +1,29 @@
1
+# Project-specific config
2
+# Defaults are loaded from (with increasing precedence):
3
+# 1. https://github.tools.sap/project-piper/sap-piper/blob/master/resources/piper-defaults.yml
4
+# 2. https://github.tools.sap/SAPMobile/sap-mobile-pipeline/blob/main/custom-defaults-android.yml
5
+general:
6
+ # Vault config
7
+ vaultPath: 'piper/PIPELINE-GROUP-5565'
8
+ vaultBasePath: 'piper/PIPELINE-GROUP-5565'
9
+ vaultServerUrl: 'https://vault.tools.sap'
10
+ vaultNamespace: 'ies/hyperspace/pipelines'
11
+ vaultPipelineName: 'PIPELINE-29049'
12
+ # Versioning
13
+ versioningModel: 'full' # possible values: major, major-minor, semantic, full
14
+
15
+steps:
16
+ # Fastlane
17
+ sapExecuteFastlane:
18
+ platform: 'android'
19
+ # Configuration for Sonar Scan
20
+ sonarExecuteScan:
21
+ versioningModel: 'semantic' # overwrite default from general section -> Track metrics since last release
22
+ sonarVaultSecretName: 'PIPELINE-29049/sonar-SAP-Sailing-Analytics-Sonarqube'
23
+ # Cumulus
24
+ sapCumulusUpload:
25
+ pipelineId: '84d219f0-1abb-4b37-bad0-e2893612ce25'
26
+ versioningModel: 'semantic' # overwrite default from general section -> don't spam Cumulus
27
+ # Rotating vault secret if it is expring soon:
28
+ vaultRotateSecretId:
29
+ daysBeforeExpiry: 45
Gemfile
... ...
@@ -0,0 +1,8 @@
1
+source "https://rubygems.org"
2
+
3
+gem 'highline', '> 0'
4
+gem 'json', '> 0'
5
+gem 'fastlane', '> 0'
6
+
7
+plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
8
+eval_gemfile(plugins_path) if File.exist?(plugins_path)
Gemfile.lock
... ...
@@ -0,0 +1,225 @@
1
+GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ CFPropertyList (3.0.6)
5
+ rexml
6
+ addressable (2.8.5)
7
+ public_suffix (>= 2.0.2, < 6.0)
8
+ artifactory (3.0.15)
9
+ atomos (0.1.3)
10
+ aws-eventstream (1.2.0)
11
+ aws-partitions (1.837.0)
12
+ aws-sdk-core (3.185.1)
13
+ aws-eventstream (~> 1, >= 1.0.2)
14
+ aws-partitions (~> 1, >= 1.651.0)
15
+ aws-sigv4 (~> 1.5)
16
+ jmespath (~> 1, >= 1.6.1)
17
+ aws-sdk-kms (1.72.0)
18
+ aws-sdk-core (~> 3, >= 3.184.0)
19
+ aws-sigv4 (~> 1.1)
20
+ aws-sdk-s3 (1.136.0)
21
+ aws-sdk-core (~> 3, >= 3.181.0)
22
+ aws-sdk-kms (~> 1)
23
+ aws-sigv4 (~> 1.6)
24
+ aws-sigv4 (1.6.0)
25
+ aws-eventstream (~> 1, >= 1.0.2)
26
+ babosa (1.0.4)
27
+ claide (1.1.0)
28
+ colored (1.2)
29
+ colored2 (3.1.2)
30
+ commander (4.6.0)
31
+ highline (~> 2.0.0)
32
+ declarative (0.0.20)
33
+ digest-crc (0.6.5)
34
+ rake (>= 12.0.0, < 14.0.0)
35
+ domain_name (0.5.20190701)
36
+ unf (>= 0.0.5, < 1.0.0)
37
+ dotenv (2.8.1)
38
+ emoji_regex (3.2.3)
39
+ excon (0.104.0)
40
+ faraday (1.10.3)
41
+ faraday-em_http (~> 1.0)
42
+ faraday-em_synchrony (~> 1.0)
43
+ faraday-excon (~> 1.1)
44
+ faraday-httpclient (~> 1.0)
45
+ faraday-multipart (~> 1.0)
46
+ faraday-net_http (~> 1.0)
47
+ faraday-net_http_persistent (~> 1.0)
48
+ faraday-patron (~> 1.0)
49
+ faraday-rack (~> 1.0)
50
+ faraday-retry (~> 1.0)
51
+ ruby2_keywords (>= 0.0.4)
52
+ faraday-cookie_jar (0.0.7)
53
+ faraday (>= 0.8.0)
54
+ http-cookie (~> 1.0.0)
55
+ faraday-em_http (1.0.0)
56
+ faraday-em_synchrony (1.0.0)
57
+ faraday-excon (1.1.0)
58
+ faraday-httpclient (1.0.1)
59
+ faraday-multipart (1.0.4)
60
+ multipart-post (~> 2)
61
+ faraday-net_http (1.0.1)
62
+ faraday-net_http_persistent (1.2.0)
63
+ faraday-patron (1.0.0)
64
+ faraday-rack (1.0.0)
65
+ faraday-retry (1.0.3)
66
+ faraday_middleware (1.2.0)
67
+ faraday (~> 1.0)
68
+ fastimage (2.2.7)
69
+ fastlane (2.216.0)
70
+ CFPropertyList (>= 2.3, < 4.0.0)
71
+ addressable (>= 2.8, < 3.0.0)
72
+ artifactory (~> 3.0)
73
+ aws-sdk-s3 (~> 1.0)
74
+ babosa (>= 1.0.3, < 2.0.0)
75
+ bundler (>= 1.12.0, < 3.0.0)
76
+ colored
77
+ commander (~> 4.6)
78
+ dotenv (>= 2.1.1, < 3.0.0)
79
+ emoji_regex (>= 0.1, < 4.0)
80
+ excon (>= 0.71.0, < 1.0.0)
81
+ faraday (~> 1.0)
82
+ faraday-cookie_jar (~> 0.0.6)
83
+ faraday_middleware (~> 1.0)
84
+ fastimage (>= 2.1.0, < 3.0.0)
85
+ gh_inspector (>= 1.1.2, < 2.0.0)
86
+ google-apis-androidpublisher_v3 (~> 0.3)
87
+ google-apis-playcustomapp_v1 (~> 0.1)
88
+ google-cloud-storage (~> 1.31)
89
+ highline (~> 2.0)
90
+ http-cookie (~> 1.0.5)
91
+ json (< 3.0.0)
92
+ jwt (>= 2.1.0, < 3)
93
+ mini_magick (>= 4.9.4, < 5.0.0)
94
+ multipart-post (>= 2.0.0, < 3.0.0)
95
+ naturally (~> 2.2)
96
+ optparse (~> 0.1.1)
97
+ plist (>= 3.1.0, < 4.0.0)
98
+ rubyzip (>= 2.0.0, < 3.0.0)
99
+ security (= 0.1.3)
100
+ simctl (~> 1.6.3)
101
+ terminal-notifier (>= 2.0.0, < 3.0.0)
102
+ terminal-table (~> 3)
103
+ tty-screen (>= 0.6.3, < 1.0.0)
104
+ tty-spinner (>= 0.8.0, < 1.0.0)
105
+ word_wrap (~> 1.0.0)
106
+ xcodeproj (>= 1.13.0, < 2.0.0)
107
+ xcpretty (~> 0.3.0)
108
+ xcpretty-travis-formatter (>= 0.0.3)
109
+ fastlane-plugin-json (1.1.0)
110
+ fastlane-plugin-properties (1.1.2)
111
+ java-properties
112
+ gh_inspector (1.1.3)
113
+ google-apis-androidpublisher_v3 (0.51.0)
114
+ google-apis-core (>= 0.11.0, < 2.a)
115
+ google-apis-core (0.11.1)
116
+ addressable (~> 2.5, >= 2.5.1)
117
+ googleauth (>= 0.16.2, < 2.a)
118
+ httpclient (>= 2.8.1, < 3.a)
119
+ mini_mime (~> 1.0)
120
+ representable (~> 3.0)
121
+ retriable (>= 2.0, < 4.a)
122
+ rexml
123
+ webrick
124
+ google-apis-iamcredentials_v1 (0.17.0)
125
+ google-apis-core (>= 0.11.0, < 2.a)
126
+ google-apis-playcustomapp_v1 (0.13.0)
127
+ google-apis-core (>= 0.11.0, < 2.a)
128
+ google-apis-storage_v1 (0.19.0)
129
+ google-apis-core (>= 0.9.0, < 2.a)
130
+ google-cloud-core (1.6.0)
131
+ google-cloud-env (~> 1.0)
132
+ google-cloud-errors (~> 1.0)
133
+ google-cloud-env (1.6.0)
134
+ faraday (>= 0.17.3, < 3.0)
135
+ google-cloud-errors (1.3.1)
136
+ google-cloud-storage (1.44.0)
137
+ addressable (~> 2.8)
138
+ digest-crc (~> 0.4)
139
+ google-apis-iamcredentials_v1 (~> 0.1)
140
+ google-apis-storage_v1 (~> 0.19.0)
141
+ google-cloud-core (~> 1.6)
142
+ googleauth (>= 0.16.2, < 2.a)
143
+ mini_mime (~> 1.0)
144
+ googleauth (1.8.1)
145
+ faraday (>= 0.17.3, < 3.a)
146
+ jwt (>= 1.4, < 3.0)
147
+ multi_json (~> 1.11)
148
+ os (>= 0.9, < 2.0)
149
+ signet (>= 0.16, < 2.a)
150
+ highline (2.0.3)
151
+ http-cookie (1.0.5)
152
+ domain_name (~> 0.5)
153
+ httpclient (2.8.3)
154
+ java-properties (0.3.0)
155
+ jmespath (1.6.2)
156
+ json (2.6.3)
157
+ jwt (2.7.1)
158
+ mini_magick (4.12.0)
159
+ mini_mime (1.1.5)
160
+ multi_json (1.15.0)
161
+ multipart-post (2.3.0)
162
+ nanaimo (0.3.0)
163
+ naturally (2.2.1)
164
+ optparse (0.1.1)
165
+ os (1.1.4)
166
+ plist (3.7.0)
167
+ public_suffix (5.0.3)
168
+ rake (13.0.6)
169
+ representable (3.2.0)
170
+ declarative (< 0.1.0)
171
+ trailblazer-option (>= 0.1.1, < 0.2.0)
172
+ uber (< 0.2.0)
173
+ retriable (3.1.2)
174
+ rexml (3.2.6)
175
+ rouge (2.0.7)
176
+ ruby2_keywords (0.0.5)
177
+ rubyzip (2.3.2)
178
+ security (0.1.3)
179
+ signet (0.18.0)
180
+ addressable (~> 2.8)
181
+ faraday (>= 0.17.5, < 3.a)
182
+ jwt (>= 1.5, < 3.0)
183
+ multi_json (~> 1.10)
184
+ simctl (1.6.10)
185
+ CFPropertyList
186
+ naturally
187
+ terminal-notifier (2.0.0)
188
+ terminal-table (3.0.2)
189
+ unicode-display_width (>= 1.1.1, < 3)
190
+ trailblazer-option (0.1.2)
191
+ tty-cursor (0.7.1)
192
+ tty-screen (0.8.1)
193
+ tty-spinner (0.9.3)
194
+ tty-cursor (~> 0.7)
195
+ uber (0.1.0)
196
+ unf (0.1.4)
197
+ unf_ext
198
+ unf_ext (0.0.8.2)
199
+ unicode-display_width (2.5.0)
200
+ webrick (1.8.1)
201
+ word_wrap (1.0.0)
202
+ xcodeproj (1.23.0)
203
+ CFPropertyList (>= 2.3.3, < 4.0)
204
+ atomos (~> 0.1.3)
205
+ claide (>= 1.0.2, < 2.0)
206
+ colored2 (~> 3.1)
207
+ nanaimo (~> 0.3.0)
208
+ rexml (~> 3.2.4)
209
+ xcpretty (0.3.0)
210
+ rouge (~> 2.0.7)
211
+ xcpretty-travis-formatter (1.0.1)
212
+ xcpretty (~> 0.2, >= 0.0.7)
213
+
214
+PLATFORMS
215
+ x86_64-linux
216
+
217
+DEPENDENCIES
218
+ fastlane (> 0)
219
+ fastlane-plugin-json
220
+ fastlane-plugin-properties
221
+ highline (> 0)
222
+ json (> 0)
223
+
224
+BUNDLED WITH
225
+ 2.4.21
azure-pipelines/main.yml
... ...
@@ -0,0 +1,55 @@
1
+#################################################################
2
+####### Azure Pipeline for Android Applications #################
3
+#################################################################
4
+
5
+trigger:
6
+ branches:
7
+ include:
8
+ - hyperspace
9
+ - release-race-manager-app
10
+ - release-buoy-pinger-app
11
+
12
+pr:
13
+- hyperspace
14
+
15
+#################################################################
16
+#################################################################
17
+#################################################################
18
+
19
+# Define yml templates for specific steps. They are hosted on an external GitHub repsitory.
20
+resources:
21
+ repositories:
22
+ - repository: sap-mobile-pipeline
23
+ type: githubenterprise
24
+ name: SAPMobile/sap-mobile-pipeline
25
+ endpoint: 'github.tools.sap'
26
+ # Uncomment the line below this comment block if you want to pin a specific version
27
+ # By default, it will always take the latest commit on the hyperspace branch
28
+ # For available versions, please have a look here (use the tag, not the release name):
29
+ # https://github.tools.sap/SAPMobile/sap-mobile-pipeline/releases
30
+ # ----------
31
+ # ref: 'refs/tags/1.0.0'
32
+
33
+#################################################################
34
+######################### Pipeline Start ########################
35
+#################################################################
36
+extends:
37
+ template: android.yml@sap-mobile-pipeline
38
+ parameters:
39
+ # Please check the pipeline documentation for available parameters:
40
+ # https://pages.github.tools.sap/SAPMobile/Documentation/Pipelines/android-library/#configuration
41
+ repositoryName: 'sapsailing'
42
+ # whatever we use here for a tag or branch, make sure that it triggers the pipeline; see section "triggers:"
43
+ isRelease: ${{ startsWith(variables['Build.SourceBranch'], 'refs/tags/') }}
44
+ # productiveBranchName acts as part of a condition that selects the flow, such as the "release" flow
45
+ productiveBranchName: refs/heads/hyperspace
46
+ buildLaneName: 'releaseBuild'
47
+ testLaneName: 'test'
48
+ # requestAuthentication: true # enable if fetching dependencies from Artifactory or Nexus
49
+ appCenterSlug: 'sapsailing/sapsailing-android-apps'
50
+ jdkVersion: 11
51
+ androidVersion: 33
52
+ # We are building more than one app from our repository; we will use branches
53
+ # to determine which app is to be built/released/signed
54
+ # Default: Race Manager App
55
+ momaAssemblyId: 189
cfg/VERSION
... ...
@@ -1 +1 @@
1
-1.4.91
1
+1.4.118
cfg/files2sign.json
... ...
@@ -1,22 +0,0 @@
1
-{
2
- "ANDROID":[
3
- {
4
- "version": "1.4.91",
5
- "groupid": "com.sap.sailing",
6
- "file": "src/java/com.sap.sailing.www/apps/com.sap.sailing.racecommittee.app-unsigned.apk",
7
- "artifactid": "com.sap.sailing.racecommittee.app"
8
- },
9
- {
10
- "version": "1.4.91",
11
- "groupid": "com.sap.sailing",
12
- "file": "src/java/com.sap.sailing.www/apps/com.sap.sailing.android.tracking.app-unsigned.apk",
13
- "artifactid": "com.sap.sailing.android.tracking.app"
14
- },
15
- {
16
- "version": "1.4.91",
17
- "groupid": "com.sap.sailing",
18
- "file": "src/java/com.sap.sailing.www/apps/com.sap.sailing.android.buoy.positioning.app-unsigned.apk",
19
- "artifactid": "com.sap.sailing.android.buoy.positioning.app"
20
- }
21
- ]
22
-}
configuration/releaseAndroidApps.sh
... ...
@@ -1,11 +1,11 @@
1 1
#!/bin/sh
2
-ANDROID_RELEASE_BRANCH=android-xmake-release
3
-RELEASE_BRANCH=fa/rel-1.4
2
+ANDROID_RELEASE_BRANCH=hyperspace
3
+RELEASE_BRANCHES="release-race-manager-app release-buoy-pinger-app"
4 4
APP_DIRS="mobile/com.sap.sailing.android.tracking.app/ mobile/com.sap.sailing.android.buoy.positioning.app/ mobile/com.sap.sailing.racecommittee.app/"
5 5
APP_GRADLE_PROPERTIES="gradle.properties"
6
-FILES2SIGN=cfg/files2sign.json
6
+FILES2SIGN=files2sign.json
7 7
VERSION_FILE=cfg/VERSION
8
-GIT_REMOTE=sap
8
+GIT_REMOTE=githubsapsailing
9 9
10 10
OPTION_UPDATE_ANDROID_VERSIONS=1
11 11
OPTION_PERFORM_GIT_OPERATIONS=1
... ...
@@ -16,7 +16,7 @@ usage() {
16 16
echo "See more usage details in the sapsailing.com wiki at:"
17 17
echo " https://wiki.sapsailing.com/wiki/info/landscape/building-and-deploying#building-deploying-stopping-and-starting-server-instances"
18 18
echo "-m Disable upgrading the versionCode and versionName"
19
- echo "-g Disable the final git push operation to $RELEASE_BRANCH"
19
+ echo "-g Disable the final git push operation to ${RELEASE_BRANCHES}"
20 20
echo "-r The git remote; defaults to origin"
21 21
exit 2
22 22
}
... ...
@@ -42,9 +42,11 @@ increment_version_code_and_set_version_name() {
42 42
# replace, e.g. "version": "1.4.xy" with new one
43 43
update_files2sign() {
44 44
echo "Update files2sign.json with new versionName $NEW_VERSION_NAME"
45
- OLD_VERSION_NAMES=`grep '"version": "1.4.[0-9]*"' $FILES2SIGN | sed -e 's/^.*\"version\": \"\(1.4.[0-9]*\)\".*$/\1/'`
46
- for OLD_VERSION_NAME in $OLD_VERSION_NAMES; do
47
- sed --in-place -e "s/\"version\": \"$OLD_VERSION_NAME\"/\"version\": \"$NEW_VERSION_NAME\"/" "$FILES2SIGN"
45
+ for f in $( find . -name "${FILES2SIGN}" ); do
46
+ OLD_VERSION_NAMES=`grep '"version": "1.4.[0-9]*"' "${f}" | sed -e 's/^.*\"version\": \"\(1.4.[0-9]*\)\".*$/\1/'`
47
+ for OLD_VERSION_NAME in $OLD_VERSION_NAMES; do
48
+ sed --in-place -e "s/\"version\": \"$OLD_VERSION_NAME\"/\"version\": \"$NEW_VERSION_NAME\"/" "${f}"
49
+ done
48 50
done
49 51
}
50 52
... ...
@@ -84,8 +86,6 @@ cd "$GIT_DIR"
84 86
git fetch $GIT_REMOTE
85 87
git checkout $ANDROID_RELEASE_BRANCH
86 88
git merge -m "Merging $GIT_REMOTE/$ANDROID_RELEASE_BRANCH" $GIT_REMOTE/$ANDROID_RELEASE_BRANCH
87
-git fetch $GIT_REMOTE $RELEASE_BRANCH:$RELEASE_BRANCH
88
-git merge -m "Merging $RELEASE_BRANCH into $ANDROID_RELEASE_BRANCH, probably incorporating version setting to -SNAPSHOT" $GIT_REMOTE/$RELEASE_BRANCH
89 89
if [ "$OPTION_PERFORM_GIT_OPERATIONS" = "1" ]; then
90 90
git push $GIT_REMOTE $ANDROID_RELEASE_BRANCH:$ANDROID_RELEASE_BRANCH
91 91
fi
... ...
@@ -97,18 +97,21 @@ if [ "$OPTION_UPDATE_ANDROID_VERSIONS" = "1" ]; then
97 97
for m in $APP_DIRS; do
98 98
increment_version_code_and_set_version_name $m
99 99
done
100
-
101 100
update_files2sign
102
-
103 101
update_version_file
104 102
fi
105 103
106 104
# Now commit the version changes and amend the commit using the change request ID tag:
107 105
git commit -a -m "Upgraded Android apps from version $OLD_VERSION_NAME to $NEW_VERSION_NAME"
108 106
git commit --amend -m "`git show -s --pretty=format:%s%n%n%b`"
109
-if [ "$OPTION_PERFORM_GIT_OPERATIONS" = "1" ]; then
110
- git push $GIT_REMOTE $ANDROID_RELEASE_BRANCH:$RELEASE_BRANCH
111
-fi
107
+for RELEASE_BRANCH in ${RELEASE_BRANCHES}; do
108
+ git checkout ${RELEASE_BRANCH}
109
+ echo "Merging version number changes into release branch ${RELEASE_BRANCH}"
110
+ git merge -m "Merging version update from ${ANDROID_RELEASE_BRANCH} into ${RELEASE_BRANCH}" ${ANDROID_RELEASE_BRANCH}
111
+ if [ "$OPTION_PERFORM_GIT_OPERATIONS" = "1" ]; then
112
+ git push $GIT_REMOTE ${RELEASE_BRANCH}:${RELEASE_BRANCH}
113
+ fi
114
+done
112 115
113 116
echo "Launch a stage build here: https://xmake-mobile-dev.wdf.sap.corp/job/sapsailingprogram/job/sapsailingcapture.android-SP-REL-common_directshipment/"
114 117
echo "using $RELEASE_BRANCH as the Treeish to build."
dummy/TEST-dummy.xml
... ...
@@ -0,0 +1,4 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<testsuites>
3
+ <!-- Empty JUnit Test Suite -->
4
+</testsuites>
dummy/jacoco/jacocoTestReport.xml
... ...
@@ -0,0 +1,5 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE report SYSTEM "report.dtd">
3
+<report name="JaCoCo Empty Coverage Report">
4
+ <group name="EmptyGroup"/>
5
+</report>
fastlane/Appfile
... ...
@@ -0,0 +1,6 @@
1
+
2
+package_name('com.sap.sailing')
3
+
4
+
5
+# For more information about the Appfile, see:
6
+# https://docs.fastlane.tools/advanced/#appfile
fastlane/Fastfile
... ...
@@ -0,0 +1,55 @@
1
+# This file contains the fastlane.tools configuration
2
+# You can find the documentation at https://docs.fastlane.tools
3
+#
4
+# For a list of all available actions, check out
5
+#
6
+# https://docs.fastlane.tools/actions
7
+#
8
+# For a list of all available plugins, check out
9
+#
10
+# https://docs.fastlane.tools/plugins/available-plugins
11
+#
12
+
13
+default_platform(:android)
14
+
15
+platform :android do
16
+
17
+ def update_version_code(code: 1)
18
+ set_properties_value(
19
+ path: "gradle.properties",
20
+ key: "appVersionCode",
21
+ value: "#{code}"
22
+ )
23
+ end
24
+
25
+ desc "Compile debug and test sources and lint them"
26
+ lane :build do
27
+ gradle(task: "compileDebugSources")
28
+ gradle(task: "compileDebugUnitTestSources")
29
+ gradle(task: "compileDebugAndroidTestSources")
30
+ end
31
+
32
+ desc "Runs all the tests & creates Jacoco Coverage reports"
33
+ lane :test do
34
+ UI.message("Using empty test reports")
35
+ # gradle(task: "jacocoTestCoverageVerification")
36
+ end
37
+
38
+ desc "Assemble app"
39
+ lane :releaseBuild do
40
+ # Automatic versioning
41
+ if is_ci
42
+ commits = sh("git rev-list --count HEAD").to_i
43
+ update_version_code(code: commits)
44
+ end
45
+
46
+ gradle(task: "assembleRelease") # Build .apk
47
+ #gradle(task: "bundleRelease") # Build .aab
48
+ end
49
+
50
+ desc "Call Kotlin Lint"
51
+ lane :lint do
52
+ gradle(task: "ktlintCheck")
53
+ end
54
+
55
+end
fastlane/Pluginfile
... ...
@@ -0,0 +1,6 @@
1
+# Autogenerated by fastlane
2
+#
3
+# Ensure this file is checked in to source control!
4
+
5
+gem 'fastlane-plugin-properties'
6
+gem 'fastlane-plugin-json'
gradle.properties
... ...
@@ -17,7 +17,7 @@
17 17
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 18
# org.gradle.parallel=true
19 19
20
-org.gradle.jvmargs=-Xmx4096m
20
+org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8
21 21
22 22
commonRepoURL=https://int.repositories.cloud.sap/artifactory/build-snapshots
23 23
sapGradleDistBaseUrl=https://int.repositories.cloud.sap/artifactory/build-releases/org/gradle/download/gradle/gradle
mobile/com.sap.sailing.android.buoy.positioning.app/files2sign.json
... ...
@@ -0,0 +1,10 @@
1
+{
2
+ "ANDROID":[
3
+ {
4
+ "version": "1.4.118",
5
+ "groupid": "com.sap.sailing",
6
+ "file": "com.sap.sailing.android.buoy.positioning.app-unsigned.apk",
7
+ "artifactid": "com.sap.sailing.android.buoy.positioning.app"
8
+ }
9
+ ]
10
+}
mobile/com.sap.sailing.android.buoy.positioning.app/gradle.properties
... ...
@@ -1,3 +1,3 @@
1 1
packageName=com.sap.sailing.android.buoy.positioning.app
2
-appVersionCode=91
3
-appVersionName=1.4.91
2
+appVersionCode=118
3
+appVersionName=1.4.118
mobile/com.sap.sailing.android.tracking.app/gradle.properties
... ...
@@ -1,3 +1,3 @@
1 1
packageName=com.sap.sailing.android.tracking.app
2
-appVersionCode=91
3
-appVersionName=1.4.91
2
+appVersionCode=118
3
+appVersionName=1.4.118
mobile/com.sap.sailing.racecommittee.app/files2sign.json
... ...
@@ -0,0 +1,10 @@
1
+{
2
+ "ANDROID":[
3
+ {
4
+ "version": "1.4.118",
5
+ "groupid": "com.sap.sailing",
6
+ "file": "com.sap.sailing.racecommittee.app-unsigned.apk",
7
+ "artifactid": "com.sap.sailing.racecommittee.app"
8
+ }
9
+ ]
10
+}
mobile/com.sap.sailing.racecommittee.app/gradle.properties
... ...
@@ -1,3 +1,3 @@
1 1
packageName=com.sap.sailing.racecommittee.app
2
-appVersionCode=91
3
-appVersionName=1.4.91
2
+appVersionCode=118
3
+appVersionName=1.4.118
scripts/setup_toolchain.sh
... ...
@@ -0,0 +1,12 @@
1
+#!/bin/zsh -l
2
+
3
+echo "Please enter your username for github.tools.sap: "
4
+read -r GH_USER_INPUT
5
+
6
+echo "Please enter a personal access token for github.tools.sap: "
7
+read -sr GH_PAT_INPUT
8
+
9
+# Execute centrally managed script
10
+/bin/zsh -c "$(curl -fsSL -u $GH_USER_INPUT:$GH_PAT_INPUT https://raw.github.tools.sap/SAPMobile/dev-setup/main/android-developer.sh)"
11
+
12
+# Extend below if you like :)
sonar-project.properties
... ...
@@ -0,0 +1,21 @@
1
+# Server data
2
+sonar.host.url=https://sonar.tools.sap
3
+
4
+# Basic project metadata
5
+sonar.projectKey=sapsailing-android-apps
6
+sonar.projectName=sapsailing-android-apps
7
+sonar.scm.provider=git
8
+
9
+# Parameters for sonar-scanner
10
+sonar.sources=mobile
11
+sonar.inclusions=**/*.kt
12
+
13
+# Kotlin specific config
14
+sonar.kotlin.file.suffixes=.kt
15
+#sonar.coverage.jacoco.xmlReportPaths=jacocoTestReport.xml
16
+
17
+# Ignore irrelevant files
18
+sonar.c.file.suffixes=-
19
+sonar.cpp.file.suffixes=-
20
+sonar.objc.file.suffixes=-
21
+sonar.exclusions=**/androidTest/**,**/test/**
wiki/info/landscape/amazon-ec2.md
... ...
@@ -229,7 +229,7 @@ The MongoDB Live Replica Set NVMe image is used to scale out or upgrade existing
229 229
```
230 230
Like the SAP Sailing Analytics image, the MongoDB image understands the ``image-upgrade`` and the ``no-shutdown`` directives in the user data.
231 231
232
-The latest Hudson Ubuntu Slave image is what the Hudson process reachable at [https://hudson.sapsailing.com](https://hudson.sapsailing.com) will launch to run a build. See also ``configuration/launchhudsonslave`` and ``configuration/aws-automation/getLatestImageOfType.sh`` in Git. Like the two other images discussed so far, the image understands the ``image-upgrade`` and ``no-shutdown`` directives in the instance's EC2 user data which will pull the Git repository's latest master to ``/home/sailing/code`` which is also from where the boot scripts are taken; furthermore, the SAP JVM 8 is brought to the latest release.
232
+The latest Hudson Ubuntu Slave image is what the Hudson process reachable at [https://hudson.sapsailing.com](https://hudson.sapsailing.com) will launch to run a build. See also ``configuration/launchhudsonslave`` and ``configuration/aws-automation/getLatestImageOfType.sh`` in Git. Like the two other images discussed so far, the image understands the ``image-upgrade`` and ``no-shutdown`` directives in the instance's EC2 user data which will pull the Git repository's latest master to ``/home/sailing/code`` which is also from where the boot scripts are taken; furthermore, the SAP JVM 8 is brought to the latest release. See also [here](/wiki/info/landscape/creating-ec2-image-for-hudon-from-scratch) for hints about setting such an image up.
233 233
234 234
The Webserver image can be used to launch a new web server / reverse proxy in a region. It is mainly a small Linux installation with the following elements
235 235
- an Apache httpd and the default macros defined under ``/etc/httpd/conf`` and ``/etc/httpd/conf.d``
wiki/info/landscape/building-and-deploying.md
... ...
@@ -76,53 +76,55 @@ Stopping a running server has---for your convenience---been wrapped into the `st
76 76
77 77
When firing up an EC2 instance it can be convenient to not having to log on to have the EC2 instance run a Java instance automatically after it has completed its boot process. This is possible using so-called _user data_. The process of firing up an instance that either builds a certain git commit, installs and starts it after server boot or that downloads and installs a release and starts it is explained [here](https://wiki.sapsailing.com/wiki/info/landscape/amazon-ec2#amazon-ec2-for-sap-sailing-analytics_howto).
78 78
79
-## App Build Process for iOS and Android
79
+## App Build Process for Android
80 80
81
-Our git and Project Portal structure seems to be somewhat unusual for the Final Assembly group. It is planned to move us to Xmake in the near future, although we don't know exactly which changes this will entail. Presumably, we'll become a little more flexible with regards to choosing branch names and branch namespace layouts.
81
+(Also look at older versions of this document in Git as there has been a long history of different approaches for how SAP builds and releases our apps. Meanwhile, the "Sail Insight" app is no longer shipped from our primary Git repository but instead, a new version of it has been developed, using React Native and TypeScript as the technology. This app was originally shipped by d-labs, later through our partner, Marcus Baur and the developer at the time (Adrian Aioanei), before in 2023 we moved this to d-labs again.)
82 82
83
-The following descriptions are based on a situation where an Xmake migration has not yet taken place. Builds for iOS apps are performed using the "MiOS" infrastructure, builds for Android apps use "LeanDI."
83
+### Preparing the Azure Build Pipeline with Hyperspace
84 84
85
-### MiOS Build for iOS Apps
85
+As of January 2024, the xMake build infrastructure will be terminated. Projects have been requested to migrate their builds to Azure Pipelines. The creation of those pipelines is managed by an SAP-internal tool called [Hyperspace](https://hyperspace.tools.sap/). Pipelines are organized into "Groups" within Hyperspace. Those groups may share, e.g., secrets stored in a common Hashicorp Vault. But secrets may as well be managed separately per pipeline. As a prerequisite, all code must be made available in a Github repository that is owned by a Github "organization," not a personal user account. For this purpose, the SAP Sailing Analytics Git repository is now also available at [https://github.tools.sap/SAP-Sailing-Analytics/sapsailing](https://github.tools.sap/SAP-Sailing-Analytics/sapsailing). Furthermore, in order to use the Hyperspace templates for mobile projects, such as Android, the group responsible for Hyperspace needs to actively enable your user account for the use of those templates. Find more Hyperspace onboarding documentation [here](https://pages.github.tools.sap/SAPMobile/Documentation/GettingStarted/hyperspace/). The set-up with all necessary steps is explained [here](https://pages.github.tools.sap/SAPMobile/Documentation/). In particular, the set-up for building mobile Android apps is then detailed further [here](https://pages.github.tools.sap/SAPMobile/Documentation/Pipelines/android/). Note that Hyperspace is accessible only from within the SAP network / VPN / Citrix Workplace; other elements of this, such as Github and Azure Pipelines can also be accessed from anywhere as long as you have your client certificate installed.
86 86
87
-For iOS and Android there are two different build processes in place. After changing from MiOS to xMake during July 2017, things have changed considerably. This is an attempt to summarize the technical steps necessary to get the build done and hand things over to the "Final Assembly" department for deployment to the stores.
87
+When working with Hyperspace to prepare the creation of the actual Azure Pipeline, various credentials have to be provided or obtained, such as for the [Github Enterprise repository](https://github.tools.sap), access to the "MoMa" app metadata management tool, and the [Microsoft AppCenter](https://appcenter.ms/) where a new organization must be created into which the apps get registered, configuring the optional Checkmarx and Black Duck code scanners and connecting to the Hashicorp vault for secret management. The result is a [pipeline](https://hyperspace.tools.sap/pipelines/29049/vault) configured in a pipeline group, in our case named `SAP-Sailing-Analytics`. The pipeline created by Hyperspace can then be found in [Azure DevOps](https://dev.azure.com/hyperspace-mobile/SAP-Sailing-Analytics/_build?definitionId=496):
88
+* Pipeline Name: ``sapsailing-android-apps``
89
+* Pipeline Description: Building the SAP Sailing Analytics Android Apps
90
+* Pipeline Group: ``SAP-Sailing-Analytics``
88 91
89
-The iOS app build is largely described by contents of a ``cfg/`` directory which is symbolically linked to from the root of the git hierarchy and is actually located under ``ios/SAPTracker/cfg``. It is independent on any Maven builds and therefore unrelated to any POM files (``pom.xml``) as used in the back-end OSGi and Android builds. Other than for the previous MiOS approach we can therefore build the contents of the ``master`` branch more or less directly. Another "sacrifice" we have to make to the iOS build is having to link ``src/`` symbolically from the root of our git to ``ios/SAPTracker/src``, but this seems adequate given the branch handling which is now much simplified over the previous Maven build where we had to separate the ``pom.xml`` contents between iOS build branches and the ``master`` branch.
92
+The pipeline configuration is produced as a [Github pull request](https://github.tools.sap/SAP-Sailing-Analytics/sapsailing/pull/1) for the Git repository used for Hyperspace onboarding. In particular, it contains a "Fastlane" configuration under ``fastlane/Fastfile`` and the actual pipeline configuration in ``azure-pipelines/mail.yml``. The fastlane config in ``fastlane/Fastfile`` we could slighly adjust and simplify because we only build ``.apk`` files, no ``.aab`` libraries. Furthermore, we need adjustments for the location of the ``gradle.properties`` file into which a git-based technical version identifier shall be generated during the build process. Later more on the details of this.
90 93
91
-Still, we use the branch ``central-ios-release-build`` to prepare for the build. We usually merge ``ubilabs--ios--develop`` into ``master`` and then ``master`` into ``central-ios-release-build``. Builds off the latter branch can be tested using [this Jenkins job](https://xmake-mobile-dev.wdf.sap.corp:8443/view/all/job/sapsailingprogram/job/sapsailingcapture-SP-REL-common_directshipment/). Run a [Build with Parameters](https://xmake-mobile-dev.wdf.sap.corp:8443/view/all/job/sapsailingprogram/job/sapsailingcapture-SP-REL-common_directshipment/build?delay=0sec) and enter ``central-ios-release-build`` as the TREEISH. The build should succeed and produce the .ipa file somewhere in the [build's target output](https://xmake-mobile-dev.wdf.sap.corp:8443/view/all/job/sapsailingprogram/job/sapsailingcapture-SP-REL-common_directshipment/ws/gen/out/Exported-IPAs-Release-iphoneos/)
92
-When the test build was successful, the branch contents need to be merged into the central git repository's branch ``fa/rel-1.x``, e.g., ``fa/rel-1.0``.
94
+In the ``azure-pipelines/main.yml`` file under the ``trigger:`` property we configure which Git branches and/or tags shall trigger a pipeline execution. The core part then is defined by a reference to the pipeline's template, and specific adjustments can then be made to the template pipeline in the ``extends:`` section. The ``isRelease`` boolean property controls whether the build shall be a release build that triggers code signing, in particular. The ``productiveBranchName`` property controls for buils of which branch all scanning and test tasks shall be performed. We required special adjustments of the ``jdkVersion`` property to ``11`` and the ``androidVersion`` to ``33`` for our Gradle app build to work. Furthermore, the MoMa Assembly ID must be configured in the ``momaAssemblyId`` property. Each app folder now has its own ``files2sign.json`` file in its app folder under ``mobile/`` because this allows us to limit the build output to files under the app's own folder.
93 95
94
-Final Assembly will need to be notified using a BCP ticket, such as a Handover ticket that can be created using [this link](https://support.wdf.sap.corp/sap/bc/dsi/ii/create_zini?sap-language=EN&system_id=BCV&short_description=Handover%20%3cPPMS%20Software%20Component%20Version%3e&priority=3&main_impact=A&category_label=XX-INT-NAAS-MOBILE&incident_description=Requesting%2520Development%2520to%2520Production%2520Handover%2520for%2520the%2520App%253A%250A%253CFull%2520App%2520Name%253E%250A%250AProgram%2520Repository%2520Link%253A%250AProgram%2520Name%253A%250APPMS%2520Software%2520Component%2520Version%2520Name%253A%250APlatform%253A%2520%253CAndroid%2520%252F%2520iOS%2520%252F%2520TFS%2520(Windows)%253E%250A%250AShipment%2520Channel(s)%253A%250A%255B%255D%2520Indirect%2520shipment%2520(promotion%2520to%2520Nexus%2520only)%250A%255B%255D%2520Apple%2520App%2520Store%250A%255B%255D%2520Google%2520Play%250A%255B%255D%2520Google%2520Chrome%2520Store%250A%255B%255D%2520Amazon%2520App%2520Store%250A%255B%255D%2520BlackBerry%2520World%250A%255B%255D%2520Windows%25208%2520Store%250A%255B%255D%2520Windows%2520Phone%2520Store%250A%255B%255D%2520SMP%2520-%2520Binary%250A%255B%255D%2520SMP%2520-%2520Source%2520Code%250A%250AiOS%2520%252F%2520Android%250A----------------%250ALink%2520to%2520Project%2520Portal%253A%250ASource%2520Code%2520Project%2520Path%253A%2520%253CPerforce%2520path%2520with%2520codeline%2520%252F%2520Git%2520Path%253E%250A%250AIf%2520project%2520is%2520using%2520the%2520LeanDI%2520environment%252C%2520code%2520signing%2520is%2520enabled%2520and%2520will%2520remain%2520enabled%2520for%2520All%2520Release%2520builds%253A%2520%253Cyes%2520%252F%2520no%253E%250A%250ATFS%2520(Windows)%250A-----------------%250ATeam%2520Project%2520Collection%253A%250ATeam%2520Project%253A%250AREL%2520Branch%2520Path%253A%250AREL%2520Build%2520Definition%2520Name%253A%250A%250ACode%2520Signing%2520Request%2520Ticket%2520(if%2520applicable)%253A%2520%253CBCP%2520Ticket%2520Number%253E%250A%250AList%2520of%2520build%2520Dependencies%253A%2520%253CNexus%2520artifacts%2520including%2520libraries%253E%250A%250ALink%2520to%2520completed%2520Metaman%2520Entry%2520(for%2520External%2520Stores)%253A%250A%250AContacts%2520%253CUser%2520IDs%253E%250AProduction%2520Project%2520Lead%253A%250AProduct%2520Owner%253A%250AResponsible%2520for%2520Handover%253A%250AResponsible%2520for%2520Technical%2520issues%252Fquestions%253A%250AOthers%253A) or an update ticket as explained [here](https://wiki.wdf.sap.corp/wiki/display/NAAS/Mobile+Patch+Releases) in section "Requesting an update."
96
+Since we want to build and release two apps out of one Git repo and ideally with one pipeline, we work with Git branches, one per app that we want to release, as follows:
95 97
96
-As a result of handling the request, Final Assembly will trigger builds on [https://xmake-mobile-dev.wdf.sap.corp:8443/view/all/job/sapsailingprogram/job/sapsailingcapture-SP-REL-common_directshipment/44/](https://xmake-mobile-dev.wdf.sap.corp:8443/view/all/job/sapsailingprogram/job/sapsailingcapture-SP-REL-common_directshipment/44/).
98
+- ``release-buoy-pinger-app`` to release the SAP Sailing Buoy Pinger app with MoMa assembly ID 188
99
+- ``release-race-manager-app`` to release the SAP Sailing Race Manager app with MoMa assembly ID 189
97 100
98
-### xMake Build for Android Apps
101
+Both these branches derive from the branch ``hyperspace`` which is more like a proxy branch as its original changes with the pipeline / fastlane definition and a few changes to the top-level README and .gitignore files have now been merged fully into the master branch where they have no averse effects. However, pushing onto the ``hyperspace`` branch will trigger the Azure DevOps pipeline for a full build including "tests" and "scans." However, since we don't have any app-specific UI tests and instead focus on unit tests for the logic shared also with the back-end and GWT UI ("common" and "shared" bundle projects), we "simulate" successful tests to satisfy the build pipeline's requirement for tests to be present. See files ``dummy/TEST-dummy.xml`` and ``dummy/jacoco/jacocoTestReport.xml``. This lets the "quality" stage of the Azure Pipeline pass without complaints. The two app-specific branches each make four important adjustments compared to the ``hyperspace``/``master`` branch:
99 102
100
-We currently release the Android apps off a branch called ``android-xmake-release`` and referred to in the sequel as the "Android release branch." The Android release branch holds the changes required to run a successful Android build in xMake, particularly some adjustments to the top-level "Gradle Wrapper" (``/gradlew``) and its properties (``/gradle/wrapper/gradle-wrapper.properties``), such as obtaining the Gradle ZIP file from an SAP-internal sources instead of from an external repository. Other diffs between ``android-xmake-release`` are rather a legacy from the earlier Maven-based build and could in principal be reverted, such as the specific version adjustments along all ``pom.xml`` files. The actual build is still the Gradle build that xMake invokes like this:
101
-```
102
-./gradlew -Pxmake -Pversion=1.4.116 -PcommonRepoURL=https://int.repositories.cloud.sap/artifactory/build-releases/
103
-```
103
+- The ``isRelease`` property is set to ``true`` for both app release branches to force the signing / releasing process
104
+- The ``buildOutputPath`` is set to ``mobile/{app-directory}`` for the respective app to limit the number of files staged (artifacts staged are the unsigned .apk file, the files2sign.json and the zipped archive of all sources that went into the app)
105
+- The MoMa Assembly ID is set in the ``momaAssemblyId`` property
106
+- In ``fastlane/Fastfile`` the path to the ``gradle.properties`` file into which to patch the version code update is adjusted to the respective app folder, e.g., ``mobile/com.sap.sailing.android.buoy.positioning.app/gradle.properties``
104 107
105
-We have various branches on which Android mobile app features are being developed. Ultimately, they should be merged into the ``master`` branch from where they get merged into the Android release branch. A so-called "Customer release" build can be triggered for the Android release branch on a [central Jenkins instance](https://xmake-mobile-dev.wdf.sap.corp/job/sapsailingprogram/job/sapsailingcapture.android-SP-REL-common_directshipment/). To get a release build staged for releasing, the version numbers in a few descriptor files, particularly the ``gradle.properties`` files of each app sub-directory under ``/mobile``, as well as ``cfg/files2sign.json`` need to be adjusted to the new version.
108
+Our points of contact for the Hyperspace / Azure Pipeline migration are Marc Bormeth (marc.bormeth@sap.com), Maurice Breit (maurice.breit@sap.com) and Philipp Resch (philipp.resch@sap.com).
106 109
107
-Also note that once released to Nexus / Artifactory, the next release build will have to use at least an incremented micro version, such as 1.4.1.
110
+### Running a Build / Release / Promote Cycle
108 111
109
-Releasing can happen only from branches in Gerrit (git.wdf.sap.corp) under the ``fa/`` branch name prefix. Our Android branch for releasing therefore currently is ``fa/rel-1.4``. We can simply push the latest version of our ``android-xmake-release`` branch to it.
110
-
111
-Many of the above steps can be automated by using the script ``configuration/releaseAndroidApps.sh``. Call like this:
112
+To release the apps, go to the MoMa records of the two apps ([https://moma.mo.sap.corp/#/apps/124](https://moma.mo.sap.corp/#/apps/124) and [https://moma.mo.sap.corp/#/apps/123](https://moma.mo.sap.corp/#/apps/123)) and from there into the Assembly-Data and press the "Add Release" button. Make sure the "Build System" is set to "free - Hyperspace Azure Pipelines". Then run the ``configuration/releaseAndroidApps.sh`` script, like this:
112 113
113 114
```
114 115
./configuration/releaseAndroidApps.sh
115 116
```
116 117
117 118
Additional options:
119
+
118 120
```
119 121
-m Disable upgrading the versionCode and versionName
120
- -g Disable the final git push operation to fa/rel-1.4
122
+ -g Disable the final git push operation the release branches
121 123
-r The git remote; defaults to origin
122 124
```
123 125
124
-This will checkout the `android-xmake-release` branch, merge the `fa/rel-1.4` release branch into it, push the result again so Gerrit knows this commit / change already. Then, the version substitutions for all ``gradle.properties`` and ``cfg/files2sign.json`` files are carried out automatically by looking at the version currently declared in them and incrementing the micro-version by one (e.g., 1.4.18 --&gt; 1.4.19). The result is committed to git and the resulting commit is pushed to the ``fa/rel-1.4`` branch.
126
+It starts with checking out the ``hyperspace`` branch, then increments the minor version number by one in all relevant files, in particular the ``files2sign.json`` files and the ``gradle.properties`` files in the app directories. It then commits these changes to the ``hyperspace`` branch and checks out each release branch one after another, merges the ``hyperspace`` branch with the version number updates and all other functional changes into the release branch and pushes it. This triggers the release build pipeline execution including code signing in Azure DevOps. The pipeline executions including their logs can be observed [here](https://dev.azure.com/hyperspace-mobile/SAP-Sailing-Analytics/_build?definitionId=496).
125 127
126
-Once this is done, a [Customer release build can be started](https://xmake-mobile-dev.wdf.sap.corp/job/sapsailingprogram/job/sapsailingcapture.android-SP-REL-common_directshipment/). Select "Build with Parameters" from the left, then select ``Stage`` as the build mode, then ``customer`` as the ``RELEASE_MODE`` and enter the ``fa/rel-1.4`` branch name in the "TREEISH" field and click the "Build" button. If the build succeeds, Final Assembly should be able to _promote_ the build artifact, such as the ``.apk`` files which should have been signed using the SAP certificate.
128
+When the release pipelines ran successfully, they will have updated the MoMa assembly metadata for the respective apps, including the version numbers and the staging repositories used. Furthermore, a "Build Release Pipeline Project Link" is generated, such as [https://gkemobilepipelines.jaas-gcp.cloud.sap.corp/job/NAAS%20-%20Mobile%20Freestyle/job/com.sap.sailing.android.buoy.positioning.app-android/](https://gkemobilepipelines.jaas-gcp.cloud.sap.corp/job/NAAS%20-%20Mobile%20Freestyle/job/com.sap.sailing.android.buoy.positioning.app-android/) for the SAP Sailing Buoy Pinger app, and [https://gkemobilepipelines.jaas-gcp.cloud.sap.corp/job/NAAS%20-%20Mobile%20Freestyle/job/com.sap.sailing.racecommittee.app-android/](https://gkemobilepipelines.jaas-gcp.cloud.sap.corp/job/NAAS%20-%20Mobile%20Freestyle/job/com.sap.sailing.racecommittee.app-android/) for the SAP Sailing Race Manager app. Before using these pipelines, go to the MoMa Google Play Metadata section for each app you'd like to release and click on "Add Release" there, too. You will have to make a few adjustments to some fields, such as that you're only releasing a "Patch" with specific release notes which you then have to submit to naming@sap.com for approval before you can send them to LXLabs using the respective button on the Google Play Metadata page in MoMa.
127 129
128
-If the build fails due to missing Nexus artifacts, check out the document describing [how to upload artifacts to Nexus](https://wiki.wdf.sap.corp/wiki/display/LeanDI/Uploading+Third+Party+Artifacts+to+Nexus#UploadingThirdPartyArtifactstoNexus-1.CreateaJiraTicket). You will have to create a JIRA ticked in this process and upload the artifact and its ``pom.xml`` file to Nexus. Usually, these requests get handled within less than 48 hours. Good luck...
... ...
\ No newline at end of file
0
+Only once you have all approvals in place, use the "Build Release Pipeline Project Link" for the app you'd like to release and run a build there. Note that these builds have interactive steps that pause and ask you to confirm the promotion to the Play Store. Your released app(s) should then show in the Google Play Store after a few hours.
... ...
\ No newline at end of file