Skip to content

Commit 77931c5

Browse files
authored
Simplified pipelines and made deeper reuse across them (#4160)
1 parent 851359c commit 77931c5

File tree

66 files changed

+3858
-377
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+3858
-377
lines changed

.github/workflows/pr.yml

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -300,20 +300,6 @@ jobs:
300300
- name: Build Android Port
301301
run: ant -noinput -buildfile Ports/Android/build.xml jar
302302

303-
- name: Run Java SE device-runner tests
304-
env:
305-
ARTIFACTS_DIR: ${{ github.workspace }}/artifacts/desktop-device-runner
306-
run: ./scripts/run-javase-device-tests.sh
307-
308-
- name: Upload Java SE device-runner artifacts
309-
if: ${{ always() }}
310-
uses: actions/upload-artifact@v4
311-
with:
312-
name: javase-device-runner
313-
path: artifacts/desktop-device-runner
314-
if-no-files-found: warn
315-
retention-days: 14
316-
317303
- name: Packaging Everything
318304
run: zip -j result.zip CodenameOne/javadocs.zip CodenameOne/dist/CodenameOne.jar CodenameOne/updatedLibs.zip Ports/JavaSE/dist/JavaSE.jar build/CodenameOneDist/CodenameOne/demos/CodenameOne_SRC.zip
319305

.github/workflows/scripts-ios.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,29 @@ jobs:
7575
gem install cocoapods xcodeproj --no-document --user-install
7676
pod --version
7777
78+
- name: Compute setup-workspace hash
79+
id: setup_hash
80+
run: |
81+
set -euo pipefail
82+
echo "hash=$(shasum -a 256 scripts/setup-workspace.sh | awk '{print $1}')" >> "$GITHUB_OUTPUT"
83+
7884
- name: Restore cn1-binaries cache
7985
uses: actions/cache@v4
8086
with:
8187
path: ../cn1-binaries
82-
key: cn1-binaries-${{ runner.os }}-${{ hashFiles('scripts/setup-workspace.sh') }}
88+
key: cn1-binaries-${{ runner.os }}-${{ steps.setup_hash.outputs.hash }}
8389
restore-keys: |
8490
cn1-binaries-${{ runner.os }}-
8591
92+
# Temporary disabled due to github issue: https://github.com/actions/runner/issues/4134
93+
# - name: Restore cn1-binaries cache
94+
# uses: actions/cache@v4
95+
# with:
96+
# path: ../cn1-binaries
97+
# key: cn1-binaries-${{ runner.os }}-${{ hashFiles('scripts/setup-workspace.sh') }}
98+
# restore-keys: |
99+
# cn1-binaries-${{ runner.os }}-
100+
86101
- name: Setup workspace
87102
run: ./scripts/setup-workspace.sh -q -DskipTests
88103
# per-step timeout

maven/core-unittests/src/test/java/com/codename1/ui/AutoCompleteTextComponentTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codename1.ui;
22

3+
import com.codename1.junit.FormTest;
34
import com.codename1.junit.UITestBase;
45
import com.codename1.ui.list.DefaultListModel;
56
import com.codename1.ui.list.ListModel;
@@ -23,7 +24,7 @@ void initModel() {
2324
suggestionModel = new DefaultListModel<String>(new String[]{"alpha", "beta", "gamma"});
2425
}
2526

26-
@Test
27+
@FormTest
2728
void constructorAppliesCustomFilterAndProvidesEditorAccess() throws Exception {
2829
final List<String> filtered = new ArrayList<String>();
2930
AutoCompleteTextComponent.AutoCompleteFilter filter = new AutoCompleteTextComponent.AutoCompleteFilter() {
@@ -44,7 +45,7 @@ public boolean filter(String text) {
4445
assertSame(field, component.getEditor(), "getEditor should return the AutoCompleteTextField instance");
4546
}
4647

47-
@Test
48+
@FormTest
4849
void focusAnimationFollowsThemeAndManualOverrides() {
4950
Hashtable theme = new Hashtable();
5051
theme.put("@textComponentAnimBool", "true");
@@ -60,7 +61,7 @@ void focusAnimationFollowsThemeAndManualOverrides() {
6061
assertTrue(component.isFocusAnimation(), "Explicit true should override theme");
6162
}
6263

63-
@Test
64+
@FormTest
6465
void fluentSettersUpdateUnderlyingField() {
6566
AutoCompleteTextComponent component = new AutoCompleteTextComponent(suggestionModel, AcceptAllFilter.INSTANCE);
6667
Image hintIcon = Image.createImage(2, 2);
@@ -84,7 +85,7 @@ void fluentSettersUpdateUnderlyingField() {
8485
assertSame(hintIcon, field.getHintIcon());
8586
}
8687

87-
@Test
88+
@FormTest
8889
void propertyMetadataAndValuesReflectFieldState() {
8990
AutoCompleteTextComponent component = new AutoCompleteTextComponent(suggestionModel, AcceptAllFilter.INSTANCE);
9091
component

scripts/build-android-app.sh

Lines changed: 7 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ set -euo pipefail
44

55
ba_log() { echo "[build-android-app] $1"; }
66

7+
REPO_ROOT="$(pwd)"
78
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8-
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
99
cd "$REPO_ROOT"
1010

1111
TMPDIR="${TMPDIR:-/tmp}"; TMPDIR="${TMPDIR%/}"
1212
DOWNLOAD_DIR="${TMPDIR%/}/codenameone-tools"
1313
ENV_DIR="$DOWNLOAD_DIR/tools"
14-
EXTRA_MVN_ARGS=("$@")
1514

1615
ENV_FILE="$ENV_DIR/env.sh"
1716
ba_log "Loading workspace environment from $ENV_FILE"
@@ -74,191 +73,21 @@ fi
7473
export ANDROID_SDK_ROOT ANDROID_HOME="$ANDROID_SDK_ROOT"
7574
ba_log "Using Android SDK at $ANDROID_SDK_ROOT"
7675

77-
CN1_VERSION=$(awk -F'[<>]' '/<version>/{print $3; exit}' maven/pom.xml)
78-
ba_log "Detected Codename One version $CN1_VERSION"
79-
80-
WORK_DIR="$TMPDIR/cn1-hello-android"
81-
rm -rf "$WORK_DIR"; mkdir -p "$WORK_DIR"
82-
83-
GROUP_ID="com.codenameone.examples"
84-
ARTIFACT_ID="hello-codenameone"
85-
PACKAGE_NAME="com.codenameone.examples.hellocodenameone"
86-
MAIN_NAME="HelloCodenameOne"
87-
88-
SOURCE_PROJECT="$REPO_ROOT/Samples/SampleProjectTemplate"
89-
if [ ! -d "$SOURCE_PROJECT" ]; then
90-
ba_log "Source project template not found at $SOURCE_PROJECT" >&2
91-
exit 1
92-
fi
93-
ba_log "Using source project template at $SOURCE_PROJECT"
94-
95-
LOCAL_MAVEN_REPO="${LOCAL_MAVEN_REPO:-$HOME/.m2/repository}"
96-
ba_log "Using local Maven repository at $LOCAL_MAVEN_REPO"
97-
mkdir -p "$LOCAL_MAVEN_REPO"
98-
MAVEN_CMD=(
99-
"$MAVEN_HOME/bin/mvn" -B -ntp
100-
-Dmaven.repo.local="$LOCAL_MAVEN_REPO"
101-
-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
102-
)
103-
104-
# --- Generate app skeleton ---
105-
ba_log "Generating Codename One application skeleton via codenameone-maven-plugin"
106-
(
107-
cd "$WORK_DIR"
108-
xvfb-run -a "${MAVEN_CMD[@]}" -q \
109-
com.codenameone:codenameone-maven-plugin:7.0.204:generate-app-project \
110-
-DgroupId="$GROUP_ID" \
111-
-DartifactId="$ARTIFACT_ID" \
112-
-Dversion=1.0-SNAPSHOT \
113-
-DsourceProject="$SOURCE_PROJECT" \
114-
-Dcn1Version="7.0.204" \
115-
"${EXTRA_MVN_ARGS[@]}"
116-
)
117-
118-
APP_DIR="$WORK_DIR/$ARTIFACT_ID"
119-
120-
# --- Namespace-aware CN1 normalization (xmlstarlet) ---
121-
ROOT_POM="$APP_DIR/pom.xml"
122-
NS="mvn=http://maven.apache.org/POM/4.0.0"
123-
124-
if ! command -v xmlstarlet >/dev/null 2>&1; then
125-
sudo apt-get update -y && sudo apt-get install -y xmlstarlet
126-
fi
127-
128-
# Helper to run xmlstarlet with Maven namespace
129-
x() { xmlstarlet ed -L -N "$NS" "$@"; }
130-
q() { xmlstarlet sel -N "$NS" "$@"; }
131-
132-
# 1) Ensure <properties><codenameone.version> exists/updated (root pom)
133-
if [ "$(q -t -v 'count(/mvn:project/mvn:properties)' "$ROOT_POM" 2>/dev/null || echo 0)" = "0" ]; then
134-
x -s "/mvn:project" -t elem -n properties -v "" "$ROOT_POM"
135-
fi
136-
if [ "$(q -t -v 'count(/mvn:project/mvn:properties/mvn:codenameone.version)' "$ROOT_POM" 2>/dev/null || echo 0)" = "0" ]; then
137-
x -s "/mvn:project/mvn:properties" -t elem -n codenameone.version -v "$CN1_VERSION" "$ROOT_POM"
138-
else
139-
x -u "/mvn:project/mvn:properties/mvn:codenameone.version" -v "$CN1_VERSION" "$ROOT_POM"
140-
fi
141-
142-
# 2) Parent must be a LITERAL version (no property allowed)
143-
while IFS= read -r -d '' P; do
144-
x -u "/mvn:project[mvn:parent/mvn:groupId='com.codenameone' and mvn:parent/mvn:artifactId='codenameone-maven-parent']/mvn:parent/mvn:version" -v "$CN1_VERSION" "$P" || true
145-
done < <(find "$APP_DIR" -type f -name pom.xml -print0)
146-
147-
# 3) Point com.codenameone deps/plugins to ${codenameone.version}
148-
while IFS= read -r -d '' P; do
149-
# Dependencies
150-
x -u "/mvn:project//mvn:dependencies/mvn:dependency[starts-with(mvn:groupId,'com.codenameone')]/mvn:version" -v '${codenameone.version}' "$P" 2>/dev/null || true
151-
# Plugins (regular)
152-
x -u "/mvn:project//mvn:build/mvn:plugins/mvn:plugin[starts-with(mvn:groupId,'com.codenameone')]/mvn:version" -v '${codenameone.version}' "$P" 2>/dev/null || true
153-
# Plugins (pluginManagement)
154-
x -u "/mvn:project//mvn:build/mvn:pluginManagement/mvn:plugins/mvn:plugin[starts-with(mvn:groupId,'com.codenameone')]/mvn:version" -v '${codenameone.version}' "$P" 2>/dev/null || true
155-
done < <(find "$APP_DIR" -type f -name pom.xml -print0)
156-
157-
# 4) Ensure common Maven plugins have a version (Maven requires it even if parent not yet resolved)
158-
declare -A PIN=(
159-
[org.apache.maven.plugins:maven-compiler-plugin]=3.11.0
160-
[org.apache.maven.plugins:maven-resources-plugin]=3.3.1
161-
[org.apache.maven.plugins:maven-surefire-plugin]=3.2.5
162-
[org.apache.maven.plugins:maven-failsafe-plugin]=3.2.5
163-
[org.apache.maven.plugins:maven-jar-plugin]=3.3.0
164-
[org.apache.maven.plugins:maven-clean-plugin]=3.3.2
165-
[org.apache.maven.plugins:maven-deploy-plugin]=3.1.2
166-
[org.apache.maven.plugins:maven-install-plugin]=3.1.2
167-
[org.apache.maven.plugins:maven-assembly-plugin]=3.6.0
168-
[org.apache.maven.plugins:maven-site-plugin]=4.0.0-M15
169-
[com.codenameone:codenameone-maven-plugin]='${codenameone.version}'
170-
)
171-
172-
add_version_if_missing() {
173-
local pom="$1" g="$2" a="$3" v="$4"
174-
# build/plugins
175-
if [ "$(q -t -v "count(/mvn:project/mvn:build/mvn:plugins/mvn:plugin[mvn:groupId='$g' and mvn:artifactId='$a']/mvn:version)" "$pom" 2>/dev/null || echo 0)" = "0" ] &&
176-
[ "$(q -t -v "count(/mvn:project/mvn:build/mvn:plugins/mvn:plugin[mvn:groupId='$g' and mvn:artifactId='$a'])" "$pom" 2>/dev/null || echo 0)" != "0" ]; then
177-
x -s "/mvn:project/mvn:build/mvn:plugins/mvn:plugin[mvn:groupId='$g' and mvn:artifactId='$a']" -t elem -n version -v "$v" "$pom" || true
178-
fi
179-
# pluginManagement/plugins
180-
if [ "$(q -t -v "count(/mvn:project/mvn:build/mvn:pluginManagement/mvn:plugins/mvn:plugin[mvn:groupId='$g' and mvn:artifactId='$a']/mvn:version)" "$pom" 2>/dev/null || echo 0)" = "0" ] &&
181-
[ "$(q -t -v "count(/mvn:project/mvn:build/mvn:pluginManagement/mvn:plugins/mvn:plugin[mvn:groupId='$g' and mvn:artifactId='$a'])" "$pom" 2>/dev/null || echo 0)" != "0" ]; then
182-
x -s "/mvn:project/mvn:build/mvn:pluginManagement/mvn:plugins/mvn:plugin[mvn:groupId='$g' and mvn:artifactId='$a']" -t elem -n version -v "$v" "$pom" || true
183-
fi
184-
}
185-
186-
while IFS= read -r -d '' P; do
187-
for ga in "${!PIN[@]}"; do
188-
add_version_if_missing "$P" "${ga%%:*}" "${ga##*:}" "${PIN[$ga]}"
189-
done
190-
done < <(find "$APP_DIR" -type f -name pom.xml -print0)
191-
192-
# 5) Build with the property set so any lingering refs resolve to the local snapshot
193-
EXTRA_MVN_ARGS+=("-Dcodenameone.version=${CN1_VERSION}")
194-
195-
# (Optional) quick non-fatal checks
196-
xmlstarlet sel -N "$NS" -t -v "/mvn:project/mvn:properties/mvn:codenameone.version" -n "$ROOT_POM" || true
197-
xmlstarlet sel -N "$NS" -t -c "/mvn:project/mvn:build/mvn:plugins" -n "$ROOT_POM" | head -n 60 || true
198-
199-
76+
APP_DIR="scripts/hellocodenameone"
20077

20178
[ -d "$APP_DIR" ] || { ba_log "Failed to create Codename One application project" >&2; exit 1; }
20279
[ -f "$APP_DIR/build.sh" ] && chmod +x "$APP_DIR/build.sh"
20380

204-
SETTINGS_FILE="$APP_DIR/common/codenameone_settings.properties"
205-
echo "codename1.arg.android.useAndroidX=true" >> "$SETTINGS_FILE"
206-
[ -f "$SETTINGS_FILE" ] || { ba_log "codenameone_settings.properties not found at $SETTINGS_FILE" >&2; exit 1; }
207-
208-
set_prop() {
209-
local key="$1" value="$2"
210-
if grep -q "^${key}=" "$SETTINGS_FILE"; then
211-
if sed --version >/dev/null 2>&1; then
212-
sed -i -E "s|^${key}=.*$|${key}=${value}|" "$SETTINGS_FILE"
213-
else
214-
sed -i '' -E "s|^${key}=.*$|${key}=${value}|" "$SETTINGS_FILE"
215-
fi
216-
else
217-
printf '\n%s=%s\n' "$key" "$value" >> "$SETTINGS_FILE"
218-
fi
219-
}
220-
221-
# --- Install Codename One application sources ---
222-
PACKAGE_PATH="${PACKAGE_NAME//.//}"
223-
JAVA_DIR="$APP_DIR/common/src/main/java/${PACKAGE_PATH}"
224-
mkdir -p "$JAVA_DIR"
225-
MAIN_FILE_SOURCE="$SCRIPT_DIR/device-runner-app/main/${MAIN_NAME}.java"
226-
if [ ! -f "$MAIN_FILE_SOURCE" ]; then
227-
ba_log "Sample application source not found: $MAIN_FILE_SOURCE" >&2
228-
exit 1
229-
fi
230-
cp "$MAIN_FILE_SOURCE" "$JAVA_DIR/${MAIN_NAME}.java"
231-
232-
ba_log "Setting Codename One application metadata"
233-
set_prop "codename1.packageName" "$PACKAGE_NAME"
234-
set_prop "codename1.mainName" "$MAIN_NAME"
235-
# DeviceRunner integration is handled inside the copied sources, so unit test
236-
# build mode is not required (and is unsupported for local Android builds).
237-
# Ensure trailing newline
238-
tail -c1 "$SETTINGS_FILE" | read -r _ || echo >> "$SETTINGS_FILE"
239-
240-
# --- Install DeviceRunner UI tests ---
241-
TEST_SOURCE_DIR="$SCRIPT_DIR/device-runner-app/tests"
242-
TEST_JAVA_DIR="$APP_DIR/common/src/main/java/${PACKAGE_PATH}/tests"
243-
mkdir -p "$TEST_JAVA_DIR"
244-
if [ ! -d "$TEST_SOURCE_DIR" ]; then
245-
ba_log "DeviceRunner test sources not found: $TEST_SOURCE_DIR" >&2
246-
exit 1
247-
fi
248-
cp "$TEST_SOURCE_DIR"/*.java "$TEST_JAVA_DIR"/
249-
ba_log "Installed DeviceRunner UI tests in $TEST_JAVA_DIR"
250-
251-
# --- Normalize Codename One versions (use Maven Versions Plugin) ---
252-
ba_log "Normalizing Codename One Maven coordinates to $CN1_VERSION"
253-
25481
# --- Build Android gradle project ---
25582
ba_log "Building Android gradle project using Codename One port"
256-
xvfb-run -a "${MAVEN_CMD[@]}" -q -f "$APP_DIR/pom.xml" package \
83+
cd $APP_DIR
84+
xvfb-run -a ./mvnw package \
25785
-DskipTests \
25886
-Dcodename1.platform=android \
25987
-Dcodename1.buildTarget=android-source \
26088
-Dopen=false \
261-
"${EXTRA_MVN_ARGS[@]}"
89+
-U -e
90+
cd ../..
26291

26392
GRADLE_PROJECT_DIR=$(find "$APP_DIR/android/target" -maxdepth 2 -type d -name "*-android-source" | head -n 1 || true)
26493
if [ -z "$GRADLE_PROJECT_DIR" ]; then
@@ -273,7 +102,7 @@ ba_log "Normalizing Android Gradle project in $GRADLE_PROJECT_DIR"
273102
# --- Install Android instrumentation harness for coverage ---
274103
ANDROID_TEST_SOURCE_DIR="$SCRIPT_DIR/device-runner-app/androidTest"
275104
ANDROID_TEST_ROOT="$GRADLE_PROJECT_DIR/app/src/androidTest"
276-
ANDROID_TEST_JAVA_DIR="$ANDROID_TEST_ROOT/java/${PACKAGE_PATH}"
105+
ANDROID_TEST_JAVA_DIR="$ANDROID_TEST_ROOT/java/com/codenameone/examples/hellocodenameone"
277106
if [ -d "$ANDROID_TEST_ROOT" ]; then
278107
ba_log "Removing template Android instrumentation tests from $ANDROID_TEST_ROOT"
279108
rm -rf "$ANDROID_TEST_ROOT"
@@ -342,7 +171,6 @@ if [ -n "${GITHUB_OUTPUT:-}" ]; then
342171
{
343172
echo "gradle_project_dir=$GRADLE_PROJECT_DIR"
344173
echo "apk_path=$APK_PATH"
345-
echo "package_name=$PACKAGE_NAME"
346174
} >> "$GITHUB_OUTPUT"
347175
ba_log "Published GitHub Actions outputs for downstream steps"
348176
fi

0 commit comments

Comments
 (0)