Skip to content

Commit 21e6d25

Browse files
committed
Add Android app build to pipeline
1 parent 1ed57ec commit 21e6d25

File tree

2 files changed

+172
-0
lines changed

2 files changed

+172
-0
lines changed

.github/workflows/scripts-android.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@ jobs:
2121
run: ./scripts/setup-workspace.sh -q -DskipTests
2222
- name: Build Android port
2323
run: ./scripts/build-android-port.sh -q -DskipTests
24+
- name: Build Hello Codename One Android app
25+
run: ./scripts/build-android-app.sh -q -DskipTests

scripts/build-android-app.sh

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
#!/usr/bin/env bash
2+
# Build a sample "Hello Codename One" Android application using the locally-built Codename One Android port
3+
set -euo pipefail
4+
5+
log() {
6+
echo "[build-android-app] $1"
7+
}
8+
9+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10+
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
11+
cd "$REPO_ROOT"
12+
13+
TMPDIR="${TMPDIR:-/tmp}"
14+
TMPDIR="${TMPDIR%/}"
15+
DOWNLOAD_DIR="${TMPDIR%/}/codenameone-tools"
16+
ENV_DIR="$DOWNLOAD_DIR/tools"
17+
18+
if [ -f "$ENV_DIR/env.sh" ]; then
19+
# shellcheck disable=SC1090
20+
source "$ENV_DIR/env.sh"
21+
else
22+
log "Workspace tools not provisioned; running setup-workspace.sh"
23+
./scripts/setup-workspace.sh -q -DskipTests
24+
# shellcheck disable=SC1090
25+
source "$ENV_DIR/env.sh"
26+
fi
27+
28+
if [ -z "${JAVA_HOME:-}" ] || [ ! -x "$JAVA_HOME/bin/java" ]; then
29+
log "JAVA_HOME is not set correctly. Please run scripts/setup-workspace.sh first." >&2
30+
exit 1
31+
fi
32+
if [ -z "${JAVA_HOME_17:-}" ] || [ ! -x "$JAVA_HOME_17/bin/java" ]; then
33+
log "JAVA_HOME_17 is not set correctly. Please run scripts/setup-workspace.sh first." >&2
34+
exit 1
35+
fi
36+
if [ -z "${MAVEN_HOME:-}" ] || [ ! -x "$MAVEN_HOME/bin/mvn" ]; then
37+
log "Maven is not available. Please run scripts/setup-workspace.sh first." >&2
38+
exit 1
39+
fi
40+
41+
export PATH="$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH"
42+
43+
ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME:-}}"
44+
if [ -z "$ANDROID_SDK_ROOT" ]; then
45+
if [ -d "/usr/local/lib/android/sdk" ]; then
46+
ANDROID_SDK_ROOT="/usr/local/lib/android/sdk"
47+
elif [ -d "$HOME/Android/Sdk" ]; then
48+
ANDROID_SDK_ROOT="$HOME/Android/Sdk"
49+
fi
50+
fi
51+
if [ -z "$ANDROID_SDK_ROOT" ] || [ ! -d "$ANDROID_SDK_ROOT" ]; then
52+
log "Android SDK not found. Set ANDROID_SDK_ROOT or ANDROID_HOME to a valid installation." >&2
53+
exit 1
54+
fi
55+
export ANDROID_SDK_ROOT
56+
export ANDROID_HOME="$ANDROID_SDK_ROOT"
57+
log "Using Android SDK at $ANDROID_SDK_ROOT"
58+
59+
CN1_VERSION=$(awk -F'[<>]' '/<version>/{print $3; exit}' maven/pom.xml)
60+
log "Detected Codename One version $CN1_VERSION"
61+
62+
WORK_DIR="$TMPDIR/cn1-hello-android"
63+
rm -rf "$WORK_DIR"
64+
mkdir -p "$WORK_DIR"
65+
66+
GROUP_ID="com.codenameone.examples"
67+
ARTIFACT_ID="hello-codenameone"
68+
MAIN_NAME="HelloCodenameOne"
69+
70+
log "Generating Codename One application skeleton"
71+
"$MAVEN_HOME/bin/mvn" -q archetype:generate \
72+
-DarchetypeArtifactId=cn1app-archetype \
73+
-DarchetypeGroupId=com.codenameone \
74+
-DarchetypeVersion="$CN1_VERSION" \
75+
-DgroupId="$GROUP_ID" \
76+
-DartifactId="$ARTIFACT_ID" \
77+
-Dversion=1.0-SNAPSHOT \
78+
-DmainName="$MAIN_NAME" \
79+
-DinteractiveMode=false \
80+
-Dpackage="$GROUP_ID.$MAIN_NAME" \
81+
-DoutputDirectory="$WORK_DIR"
82+
83+
APP_DIR="$WORK_DIR/$ARTIFACT_ID"
84+
if [ ! -d "$APP_DIR" ]; then
85+
log "Failed to create Codename One application project" >&2
86+
exit 1
87+
fi
88+
89+
if [ -f "$APP_DIR/build.sh" ]; then
90+
chmod +x "$APP_DIR/build.sh"
91+
fi
92+
93+
MAIN_FILE=$(find "$APP_DIR" -path "*/common/src/main/java/*Application.java" | head -n 1 || true)
94+
if [ -z "$MAIN_FILE" ]; then
95+
log "Could not locate the generated application source file" >&2
96+
exit 1
97+
fi
98+
99+
PACKAGE_NAME=$(sed -n 's/^package \(.*\);/\1/p' "$MAIN_FILE" | head -n 1)
100+
if [ -z "$PACKAGE_NAME" ]; then
101+
log "Unable to determine package name from $MAIN_FILE" >&2
102+
exit 1
103+
fi
104+
105+
cat > "$MAIN_FILE" <<HELLOEOF
106+
package $PACKAGE_NAME;
107+
108+
import com.codename1.ui.Display;
109+
import com.codename1.ui.Form;
110+
import com.codename1.ui.Label;
111+
import com.codename1.ui.layouts.BorderLayout;
112+
113+
public class ${MAIN_NAME} {
114+
private Form current;
115+
116+
public void init(Object context) {
117+
// No special initialization required for this sample
118+
}
119+
120+
public void start() {
121+
if (current != null) {
122+
current.show();
123+
return;
124+
}
125+
Form helloForm = new Form("Hello Codename One", new BorderLayout());
126+
helloForm.add(BorderLayout.CENTER, new Label("Hello Codename One"));
127+
helloForm.show();
128+
}
129+
130+
public void stop() {
131+
current = Display.getInstance().getCurrent();
132+
}
133+
134+
public void destroy() {
135+
// Nothing to clean up for this sample
136+
}
137+
}
138+
HELLOEOF
139+
140+
log "Building Android gradle project using Codename One port"
141+
"$MAVEN_HOME/bin/mvn" -q -f "$APP_DIR/pom.xml" package -DskipTests -Dcodename1.platform=android -Dcodename1.buildTarget=android-source -Dopen=false "$@"
142+
143+
GRADLE_PROJECT_DIR=$(find "$APP_DIR/target" -maxdepth 1 -type d -name "*-android-source" | head -n 1 || true)
144+
if [ -z "$GRADLE_PROJECT_DIR" ]; then
145+
log "Failed to locate generated Android project" >&2
146+
exit 1
147+
fi
148+
149+
log "Invoking Gradle build in $GRADLE_PROJECT_DIR"
150+
chmod +x "$GRADLE_PROJECT_DIR/gradlew"
151+
ORIGINAL_JAVA_HOME="$JAVA_HOME"
152+
export JAVA_HOME="$JAVA_HOME_17"
153+
(
154+
cd "$GRADLE_PROJECT_DIR"
155+
if command -v sdkmanager >/dev/null 2>&1; then
156+
yes | sdkmanager --licenses >/dev/null 2>&1 || true
157+
elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then
158+
yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --licenses >/dev/null 2>&1 || true
159+
fi
160+
./gradlew --no-daemon assembleDebug
161+
)
162+
export JAVA_HOME="$ORIGINAL_JAVA_HOME"
163+
164+
APK_PATH=$(find "$GRADLE_PROJECT_DIR" -path "*/outputs/apk/debug/*.apk" | head -n 1 || true)
165+
if [ -z "$APK_PATH" ]; then
166+
log "Gradle build completed but no APK was found" >&2
167+
exit 1
168+
fi
169+
170+
log "Successfully built Android APK at $APK_PATH"

0 commit comments

Comments
 (0)