Skip to content

Commit 3a41138

Browse files
aj-rosadovvolkgang
andauthored
[PM-10515] CI build info on version copy (#4456)
Co-authored-by: Álison Fernandes <vvolkgang@users.noreply.github.com>
1 parent 889457a commit 3a41138

File tree

5 files changed

+86
-4
lines changed

5 files changed

+86
-4
lines changed

.github/workflows/build.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,10 @@ jobs:
460460
distribution: "temurin"
461461
java-version: ${{ env.JAVA_VERSION }}
462462

463+
- name: Update app CI Build info
464+
run: |
465+
./Scripts/update_app_ci_build_info.sh $GITHUB_REPOSITORY $GITHUB_REF_NAME $GITHUB_SHA $GITHUB_RUN_ID $GITHUB_RUN_ATTEMPT
466+
463467
# Start from 11000 to prevent collisions with mobile build version codes
464468
- name: Increment version
465469
run: |

app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ android {
6868
buildConfigField(
6969
type = "String",
7070
name = "CI_INFO",
71-
value = "\"${ciProperties.getOrDefault("ci.info", "local")}\""
71+
value = "${ciProperties.getOrDefault("ci.info", "\"local\"")}"
7272
)
7373
}
7474

app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/about/AboutViewModel.kt

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.x8bit.bitwarden.ui.platform.feature.settings.about
22

3+
import android.os.Build
34
import android.os.Parcelable
45
import androidx.lifecycle.SavedStateHandle
56
import androidx.lifecycle.viewModelScope
@@ -91,8 +92,34 @@ class AboutViewModel @Inject constructor(
9192
}
9293

9394
private fun handleVersionClick() {
95+
val buildFlavour = when (BuildConfig.FLAVOR) {
96+
"standard" -> ""
97+
else -> "-${BuildConfig.FLAVOR}"
98+
}
99+
100+
val buildVariant = when (BuildConfig.BUILD_TYPE) {
101+
"debug" -> "dev"
102+
"release" -> "prod"
103+
else -> BuildConfig.BUILD_TYPE
104+
}
105+
106+
val deviceBrandModel = "\uD83D\uDCF1 ${Build.BRAND} ${Build.MODEL}"
107+
val osInfo = "\uD83E\uDD16 ${Build.VERSION.RELEASE}@${Build.VERSION.SDK_INT}"
108+
val buildInfo = "\uD83D\uDCE6 $buildVariant$buildFlavour"
109+
val ciBuildInfoString = BuildConfig.CI_INFO
110+
94111
clipboardManager.setText(
95-
text = state.copyrightInfo.concat("\n\n".asText()).concat(state.version),
112+
text = state.copyrightInfo
113+
.concat("\n\n".asText())
114+
.concat(state.version)
115+
.concat("\n".asText())
116+
.concat("$deviceBrandModel $osInfo $buildInfo".asText())
117+
.concat(
118+
"\n$ciBuildInfoString"
119+
.takeUnless { ciBuildInfoString.isEmpty() }
120+
.orEmpty()
121+
.asText(),
122+
),
96123
)
97124
}
98125

app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/about/AboutViewModelTest.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.x8bit.bitwarden.ui.platform.feature.settings.about
22

3+
import android.os.Build
34
import androidx.lifecycle.SavedStateHandle
45
import app.cash.turbine.test
56
import com.x8bit.bitwarden.BuildConfig
@@ -111,12 +112,24 @@ class AboutViewModelTest : BaseViewModelTest() {
111112
fun `on VersionClick should call setText on the ClipboardManager with specific Text`() {
112113
val versionName = BuildConfig.VERSION_NAME
113114
val versionCode = BuildConfig.VERSION_CODE
115+
116+
val deviceBrandModel = "\uD83D\uDCF1 ${Build.BRAND} ${Build.MODEL}"
117+
val osInfo = "\uD83E\uDD16 ${Build.VERSION.RELEASE}@${Build.VERSION.SDK_INT}"
118+
val buildInfo = "\uD83D\uDCE6 dev"
119+
val ciInfo = BuildConfig.CI_INFO
120+
114121
val expectedText = "© Bitwarden Inc. 2015-"
115122
.asText()
116123
.concat(Year.now(fixedClock).value.toString().asText())
117124
.concat("\n\n".asText())
125+
.concat("Version: $versionName ($versionCode)".asText())
126+
.concat("\n".asText())
127+
.concat("$deviceBrandModel $osInfo $buildInfo".asText())
118128
.concat(
119-
"Version: $versionName ($versionCode)".asText(),
129+
"\n$ciInfo"
130+
.takeUnless { ciInfo.isEmpty() }
131+
.orEmpty()
132+
.asText(),
120133
)
121134

122135
every { clipboardManager.setText(expectedText, true, null) } just runs
@@ -125,7 +138,7 @@ class AboutViewModelTest : BaseViewModelTest() {
125138
viewModel.trySendAction(AboutAction.VersionClick)
126139

127140
verify(exactly = 1) {
128-
clipboardManager.setText(expectedText, true, null)
141+
clipboardManager.setText(expectedText, ofType(Boolean::class), isNull())
129142
}
130143
}
131144

scripts/update_app_ci_build_info.sh

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/bin/sh
2+
# CI Build Info Updater
3+
#
4+
# Updates the ci.properties file with additional info from the CI build.
5+
#
6+
# Prerequisites:
7+
# - Git command line tools installed
8+
# - Write access to ci.properties file
9+
10+
if [ $# -ne 5 ]; then
11+
echo "Usage: $0 <repository> <branch> <commit_hash> <ci_run_number> <ci_run_attempt>"
12+
echo "E.g: $0 bitwarden/android main abc123 123 1"
13+
exit 1
14+
fi
15+
16+
set -euo pipefail
17+
18+
repository=$1
19+
branch=$2
20+
commit_hash=$3
21+
ci_run_number=$4
22+
ci_run_attempt=$5
23+
24+
ci_build_info_file="../ci.properties"
25+
git_source="${repository}/${branch}@${commit_hash}"
26+
ci_run_source="${repository}/actions/runs/${ci_run_number}/attempts/${ci_run_attempt}"
27+
emoji_brick="\\ud83e\\uddf1" # 🧱
28+
emoji_computer="\\ud83d\\udcbb" # 💻
29+
30+
echo "🧱 Updating app CI Build info..."
31+
echo "🧱 🧱 commit: ${git_source}"
32+
echo "🧱 💻 build source: ${ci_run_source}"
33+
34+
cat << EOF > ${ci_build_info_file}
35+
ci.info="${emoji_brick} commit: ${git_source}\\\n${emoji_computer} build source: ${ci_run_source}"
36+
EOF
37+
38+
echo "✅ CI Build info updated successfully."

0 commit comments

Comments
 (0)