Compare commits

...
Author SHA1 Message Date
forge-recoveryandCodex 6bd6207bbc ci: qualify existing cache and HTTPS artifact interface
Co-Authored-By: Codex <noreply@openai.com>
2026-11-02 18:41:09 +00:00
james.maesandCodex 63fca899a9 ci: adopt managed orb 0.8 patch track (#7)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 16:04:29 -05:00
james.maesandCodex 88da04a124 ci: adopt shared orb 0.7.17 (#6)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 14:26:01 -05:00
james.maesandCodex 0b88114c81 ci: adopt central orb 0.7.12 and stable gates (#5)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 03:36:23 -05:00
james.maesandCodex cd034e0aab ci: adopt corrected shared package publisher from orb 0.7.11 (#4)
* ci: adopt shared GitHub package publisher from orb 0.7.10

Co-Authored-By: Codex <noreply@openai.com>

* ci: use corrected Android continuation from orb 0.7.11

Co-Authored-By: Codex <noreply@openai.com>

---------

Co-authored-by: Codex <noreply@openai.com>
2026-10-20 22:17:34 -05:00
james.maesandCodex 674246bbe8 ci: adopt shared Android publication credentials (#3)
Co-authored-by: Codex <noreply@openai.com>
2026-10-20 21:21:49 -05:00
james.maesandCodex 5c9a829f7f fix: publish Android modules to current QRun registry (#2)
Co-authored-by: Codex <noreply@openai.com>
2026-10-20 20:46:36 -05:00
james.maesandCodex f49fc8e3d2 ci: delegate Android pipelines to shared QQQ orb (#1)
Co-authored-by: Codex <noreply@openai.com>
2026-10-20 20:13:05 -05:00
5 changed files with 118 additions and 166 deletions

No files matched your search

+10 -164
View File
@@ -1,168 +1,14 @@
version: 2.1
setup: true
orbs:
android: circleci/android@2.5.0
gcp-cli: circleci/gcp-cli@3.2.2
jobs:
unit-test:
executor:
name: android/android-machine
tag: default
steps:
- checkout
- android/restore-gradle-cache
- android/run-tests:
test-command: ./gradlew testDebug
- android/save-gradle-cache
- run:
name: Save test results
command: |
mkdir -p ~/test-results/junit/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/junit/ \;
when: always
- store_test_results:
path: ~/test-results
- store_artifacts:
path: ~/test-results/junit
android-test:
parameters:
system-image:
type: string
default: system-images;android-30;google_apis;x86
executor:
name: android/android-machine
tag: default
steps:
- checkout
- android/start-emulator-and-run-tests:
test-command: ./gradlew connectedDebugAndroidTest
system-image: << parameters.system-image >>
- run:
name: Save test results
command: |
mkdir -p ~/test-results/junit/
find . -type f -regex ".*/build/outputs/androidTest-results/.*xml" -exec cp {} ~/test-results/junit/ \;
when: always
- store_test_results:
path: ~/test-results
- store_artifacts:
path: ~/test-results/junit
benchmarks-ftl:
executor:
name: android/android-docker
tag: default
steps:
- checkout
- android/restore-gradle-cache
- run:
name: Build app and test app
command: ./gradlew app:assembleRelease macrobenchmark:assemble
- gcp-cli/initialize:
gcloud-service-key: GCP_SA_KEY
google-project-id: GCP_PROJECT_ID
- run:
name: run on FTL
command: |
gcloud firebase test android run \
--type instrumentation \
--app app/build/outputs/apk/release/app-release.apk \
--test macrobenchmark/build/outputs/apk/release/macrobenchmark-release.apk \
--device model=redfin:,version=30,locale=en,orientation=portrait \
--directories-to-pull /sdcard/Download \
--results-bucket gs://android-sample-benchmarks \
--results-dir macrobenchmark \
--environment-variables clearPackageData=true,additionalTestOutputDir=/sdcard/Download,no-isolated-storage=true
- run:
name: Download benchmark data
command: |
mkdir ~/benchmarks
gsutil cp -r 'gs://android-sample-benchmarks/macrobenchmark/**/artifacts/sdcard/Download/*' ~/benchmarks
gsutil rm -r gs://android-sample-benchmarks/macrobenchmark
- store_artifacts:
path: ~/benchmarks
- run:
name: Evaluate benchmark results
command: node scripts/eval_startup_benchmark_output.js
maven-deploy:
executor:
name: android/android-machine
tag: default
steps:
- checkout
- android/restore-gradle-cache
- run:
name: Write credentials to gradle.properties
command: |
echo "" >> gradle.properties
echo "githubQqqMavenRegistryUsername=${QQQ_ANDROID_MAVEN_REGISTRY_USERNAME}" >> gradle.properties
echo "githubQqqMavenRegistryPassword=${QQQ_ANDROID_MAVEN_REGISTRY_PASSWORD}" >> gradle.properties
- run:
name: Publish (Deploy) to Maven
command: |
./gradlew publishMavenPublicationToGithubQqqMavenRegistryRepository
release-build:
executor:
name: android/android-docker
tag: default
steps:
- checkout
- android/restore-gradle-cache
- run:
name: Assemble release build
command: |
./gradlew assembleRelease
- store_artifacts:
path: app/build/outputs/apk/release/app-release-unsigned.apk
qqq-orb: kingsrook/qqq-orb@0.8
workflows:
test-and-build:
setup:
jobs:
- unit-test
- android-test:
filters:
branches:
## main will run all the versions below.
ignore: main
## todo? - android-test:
## todo? matrix:
## todo? alias: android-test-all
## todo? parameters:
## todo? system-image:
## todo? - system-images;android-35;google_apis;x86
## todo? - system-images;android-34;google_apis;x86
## todo? - system-images;android-33;google_apis;x86
## todo? - system-images;android-32;google_apis;x86
## todo? - system-images;android-31;google_apis;x86
## todo? - system-images;android-30;google_apis;x86
## todo? - system-images;android-29;google_apis;x86
## todo? - system-images;android-28;google_apis;x86
## todo? - system-images;android-27;google_apis;x86
## todo? - system-images;android-26;google_apis;x86
## todo? name: android-test-<<matrix.system-image>>
## todo? filters:
## todo? branches:
## todo? only: main
## todo? - release-build:
## todo? requires:
## todo? - unit-test
## todo? - android-test
## todo? - android-test-all
## todo? filters:
## todo? branches:
## todo? only: main
- maven-deploy:
requires:
- unit-test
- android-test
filters:
branches:
only: main
- qqq-orb/generate_pipeline:
orb_version: '0.8'
filters:
branches:
ignore: automation/qbit-rc-pending
tags:
only: /.*/
@@ -0,0 +1,103 @@
name: Cache roundtrip fixture
# Manual proof of the builtin runner cache plus the HTTPS artifact path.
# Synthetic public data only. Requires the exact upstream actions/cache v4.2.3
# (5a3ec84eff668545956fd18022155c47e93e2684), using the reviewed public upstream refs.
on:
workflow_dispatch:
permissions:
contents: read
env:
HOME: /tmp
MARKER_DIR: /tmp/.m2/repository/kof-cache-roundtrip
MARKER_FILE: /tmp/.m2/repository/kof-cache-roundtrip/marker.txt
ARTIFACT_DIR: /tmp/cache-roundtrip/artifact
DOWNLOAD_DIR: /tmp/cache-roundtrip/downloaded
CACHE_KEY: kof-cache-roundtrip-${{ github.run_id }}-${{ github.run_attempt }}
jobs:
save:
runs-on: android-build
timeout-minutes: 15
container:
image: git.kof22.com/koftwentytwo/ci-android-runtime@sha256:838a1a494794a7c0705930e9a13d744498c6e01dc481a29bdda5ecae85f1a466
options: --init --shm-size=256m --volume /var/lib/gitea-job-workspace:${{ github.workspace }}
outputs:
marker-sha256: ${{ steps.marker.outputs.sha256 }}
steps:
- name: Install the pinned action runtime without root
run: |
set -eu
mkdir -p /tmp/java-actions-node
curl -fsSL https://nodejs.org/dist/v22.20.0/node-v22.20.0-linux-x64.tar.gz -o /tmp/java-actions-node/node.tar.gz
printf '%s\n' 'eeaccb0378b79406f2208e8b37a62479c70595e20be6b659125eb77dd1ab2a29 /tmp/java-actions-node/node.tar.gz' | sha256sum -c -
tar -xzf /tmp/java-actions-node/node.tar.gz -C /tmp/java-actions-node --strip-components=1
echo /tmp/java-actions-node/bin >> "$GITHUB_PATH"
- name: Create the synthetic public marker and artifact
id: marker
run: |
set -eu
rm -rf "$MARKER_DIR" /tmp/cache-roundtrip
mkdir -p "$MARKER_DIR" "$ARTIFACT_DIR"
printf 'synthetic public cache marker %s\n' "$CACHE_KEY" > "$MARKER_FILE"
printf 'synthetic public artifact marker %s\n' "$CACHE_KEY" > "$ARTIFACT_DIR/artifact.txt"
echo "sha256=$(sha256sum "$MARKER_FILE" | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
sha256sum "$MARKER_FILE" "$ARTIFACT_DIR/artifact.txt"
- name: Save the cache entry
uses: https://github.com/actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684
with:
path: /tmp/.m2/repository/kof-cache-roundtrip
key: ${{ env.CACHE_KEY }}
- name: Upload the artifact
uses: self:KofTwentyTwo/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: cache-roundtrip-artifact
path: /tmp/cache-roundtrip/artifact/artifact.txt
if-no-files-found: error
retention-days: 1
restore:
needs: save
runs-on: android-build
timeout-minutes: 15
container:
image: git.kof22.com/koftwentytwo/ci-android-runtime@sha256:838a1a494794a7c0705930e9a13d744498c6e01dc481a29bdda5ecae85f1a466
options: --init --shm-size=256m --volume /var/lib/gitea-job-workspace:${{ github.workspace }}
steps:
- name: Install the pinned action runtime without root
run: |
set -eu
mkdir -p /tmp/java-actions-node
curl -fsSL https://nodejs.org/dist/v22.20.0/node-v22.20.0-linux-x64.tar.gz -o /tmp/java-actions-node/node.tar.gz
printf '%s\n' 'eeaccb0378b79406f2208e8b37a62479c70595e20be6b659125eb77dd1ab2a29 /tmp/java-actions-node/node.tar.gz' | sha256sum -c -
tar -xzf /tmp/java-actions-node/node.tar.gz -C /tmp/java-actions-node --strip-components=1
echo /tmp/java-actions-node/bin >> "$GITHUB_PATH"
- name: Start from a clean path
run: |
set -eu
rm -rf "$MARKER_DIR" /tmp/cache-roundtrip
mkdir -p "$DOWNLOAD_DIR"
- name: Restore the cache entry
id: restore
uses: https://github.com/actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684
with:
path: /tmp/.m2/repository/kof-cache-roundtrip
key: ${{ env.CACHE_KEY }}
fail-on-cache-miss: true
- name: Assert exact cache hit and marker checksum
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
EXPECTED_SHA256: ${{ needs.save.outputs.marker-sha256 }}
run: |
set -eu
[ "$CACHE_HIT" = 'true' ] || { echo "cache-hit was '$CACHE_HIT', expected true"; exit 1; }
[ -n "$EXPECTED_SHA256" ] || { echo 'missing expected checksum'; exit 1; }
printf '%s %s\n' "$EXPECTED_SHA256" "$MARKER_FILE" | sha256sum -c -
- name: Download the artifact
uses: self:KofTwentyTwo/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
with:
name: cache-roundtrip-artifact
path: /tmp/cache-roundtrip/downloaded
- name: Assert artifact content
run: |
set -eu
expected="synthetic public artifact marker $CACHE_KEY"
[ "$(cat "$DOWNLOAD_DIR/artifact.txt")" = "$expected" ] || { echo 'artifact content mismatch'; exit 1; }
sha256sum "$DOWNLOAD_DIR/artifact.txt"
+3
View File
@@ -0,0 +1,3 @@
profile: android
orb_version: '0.8'
default_branch: main
+1 -1
View File
@@ -10,7 +10,7 @@ publishing {
repositories {
maven {
name = "githubQqqMavenRegistry"
url = uri("https://maven.pkg.github.com/Kingsrook/qqq-maven-registry")
url = uri("https://maven.pkg.github.com/QRun-IO/qqq-maven-registry")
// username and password (a personal Github access token) should be specified as
// `githubPackagesUsername` and `githubPackagesPassword` Gradle properties
credentials(PasswordCredentials::class)
+1 -1
View File
@@ -10,7 +10,7 @@ publishing {
repositories {
maven {
name = "githubQqqMavenRegistry"
url = uri("https://maven.pkg.github.com/Kingsrook/qqq-maven-registry")
url = uri("https://maven.pkg.github.com/QRun-IO/qqq-maven-registry")
// username and password (a personal Github access token) should be specified as
// `githubPackagesUsername` and `githubPackagesPassword` Gradle properties
credentials(PasswordCredentials::class)