version: 2.1 orbs: codecov: codecov/codecov@3.2.5 # Configurable branch patterns for different actions # These can be overridden via CircleCI environment variables # Default to master if not specified # Set these in CircleCI project settings: # DOCKER_BRANCH_PATTERN=master,/^mike\/.*/ # COVERAGE_BRANCH_PATTERN=master,/^mike\/.*/ # CODACY_BRANCH_PATTERN=/^codacy.*/ executors: java-build: environment: _JAVA_OPTIONS: "-Xms512m -Xmx2g" GRADLE_OPTS: "-Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.caching=true" STACK_VER: << pipeline.number >> docker: - image: cimg/openjdk:21.0 jobs: # Complete build job that handles everything in the correct order build-and-test: executor: java-build resource_class: large environment: IMAGE_NAME: bc-build steps: - add_ssh_keys: fingerprints: - "7e:93:fb:39:b3:21:f7:b6:48:bd:f7:0e:56:5c:ad:87" - checkout - restore_cache: keys: - v3-build-cache-{{ checksum "build.gradle.kts" }}-{{ checksum "gradle/libs.versions.toml" }}-{{ checksum "settings.gradle.kts" }} - v2-build-cache-{{ checksum "build.gradle.kts" }} - v1-build-cache # Use manual build order to handle circular dependencies - run: name: Build All Projects and Publish Stubs command: | echo "๐Ÿ”จ Building all projects and publishing stubs..." echo "๐Ÿ“ฆ Step 1: Building core libraries..." ./gradlew :jar-common:build :jar-auth:build --no-daemon --parallel --max-workers=4 echo "๐Ÿ“ฆ Step 2: Building services and publishing stubs..." ./gradlew :svc-data:build --no-daemon --parallel --max-workers=4 ./gradlew :svc-data:pubStubs --no-daemon ./gradlew :svc-position:build --no-daemon --parallel --max-workers=4 ./gradlew :svc-position:pubStubs --no-daemon ./gradlew :svc-event:build --no-daemon --parallel --max-workers=4 echo "๐Ÿ“ฆ Step 3: Building client libraries..." ./gradlew :jar-client:build :jar-shell:build --no-daemon --parallel --max-workers=4 # Upload coverage for all projects - codecov/upload: file: ./jar-common/build/reports/jacoco/test/jacocoTestReport.xml - codecov/upload: file: ./jar-auth/build/reports/jacoco/test/jacocoTestReport.xml - codecov/upload: file: ./jar-client/build/reports/jacoco/test/jacocoTestReport.xml - codecov/upload: file: ./jar-shell/build/reports/jacoco/test/jacocoTestReport.xml - codecov/upload: file: ./svc-data/build/reports/jacoco/test/jacocoTestReport.xml - codecov/upload: file: ./svc-position/build/reports/jacoco/test/jacocoTestReport.xml - codecov/upload: file: ./svc-event/build/reports/jacoco/test/jacocoTestReport.xml # Save build cache for faster subsequent builds - run: name: Prepare Build Cache command: | echo "๐Ÿ’พ Preparing build cache for faster subsequent builds..." echo "Cache includes Gradle cache and Maven repository with stub JARs" - save_cache: paths: - ~/.gradle - ~/.m2 key: v3-build-cache-{{ checksum "build.gradle.kts" }}-{{ checksum "gradle/libs.versions.toml" }}-{{ checksum "settings.gradle.kts" }} # Store build artifacts (JAR files) - run: name: Store Core Library Artifacts command: | echo "๐Ÿ“ฆ Storing core library artifacts..." mkdir -p ~/artifacts/core-libs cp -r ~/project/jar-common/build/libs/* ~/artifacts/core-libs/ 2>/dev/null || echo "No jar-common artifacts" cp -r ~/project/jar-auth/build/libs/* ~/artifacts/core-libs/ 2>/dev/null || echo "No jar-auth artifacts" cp -r ~/project/jar-client/build/libs/* ~/artifacts/core-libs/ 2>/dev/null || echo "No jar-client artifacts" cp -r ~/project/jar-shell/build/libs/* ~/artifacts/core-libs/ 2>/dev/null || echo "No jar-shell artifacts" - store_artifacts: path: ~/artifacts/core-libs destination: core-libraries - run: name: Store Service Artifacts command: | echo "๐Ÿ“ฆ Storing service artifacts..." mkdir -p ~/artifacts/services cp -r ~/project/svc-data/build/libs/* ~/artifacts/services/ 2>/dev/null || echo "No svc-data artifacts" cp -r ~/project/svc-position/build/libs/* ~/artifacts/services/ 2>/dev/null || echo "No svc-position artifacts" cp -r ~/project/svc-event/build/libs/* ~/artifacts/services/ 2>/dev/null || echo "No svc-event artifacts" - store_artifacts: path: ~/artifacts/services destination: services # Store test results - run: name: Collect Test Results command: | echo "๐Ÿงช Collecting test results from all modules..." mkdir -p ~/test-results find ~/project -name "test-results" -type d -exec cp -r {}/test ~/test-results/ \; 2>/dev/null || echo "No test results found" - store_test_results: path: ~/test-results # Persist coverage reports and built artifacts for downstream jobs - run: name: Prepare Coverage Reports and Artifacts for Workspace command: | echo "๐Ÿ“Š Preparing coverage reports and artifacts for workspace persistence..." mkdir -p ~/workspace-artifacts mkdir -p ~/workspace-artifacts/coverage-reports mkdir -p ~/workspace-artifacts/build-artifacts # Copy coverage reports find ~/project -name "jacocoTestReport.xml" -exec cp {} ~/workspace-artifacts/coverage-reports/ \; cp ~/project/codecov.yml ~/workspace-artifacts/coverage-reports/ 2>/dev/null || echo "No codecov.yml found" # Copy built JAR files echo "๐Ÿ“ฆ Copying built JAR files to workspace..." cp -r ~/project/jar-common/build/libs/* ~/workspace-artifacts/build-artifacts/ 2>/dev/null || echo "No jar-common artifacts" cp -r ~/project/jar-auth/build/libs/* ~/workspace-artifacts/build-artifacts/ 2>/dev/null || echo "No jar-auth artifacts" cp -r ~/project/jar-client/build/libs/* ~/workspace-artifacts/build-artifacts/ 2>/dev/null || echo "No jar-client artifacts" cp -r ~/project/jar-shell/build/libs/* ~/workspace-artifacts/build-artifacts/ 2>/dev/null || echo "No jar-shell artifacts" cp -r ~/project/svc-data/build/libs/* ~/workspace-artifacts/build-artifacts/ 2>/dev/null || echo "No svc-data artifacts" cp -r ~/project/svc-position/build/libs/* ~/workspace-artifacts/build-artifacts/ 2>/dev/null || echo "No svc-position artifacts" cp -r ~/project/svc-event/build/libs/* ~/workspace-artifacts/build-artifacts/ 2>/dev/null || echo "No svc-event artifacts" echo "๐Ÿ“‹ Workspace artifacts prepared:" ls -la ~/workspace-artifacts/build-artifacts/ - persist_to_workspace: root: ~/workspace-artifacts paths: - . # Docker packaging jobs (only for master branch) package-shell: executor: java-build environment: IMAGE_NAME: bc-shell steps: - add_ssh_keys: fingerprints: - "7e:93:fb:39:b3:21:f7:b6:48:bd:f7:0e:56:5c:ad:87" - checkout - restore_cache: keys: - v3-build-cache-{{ checksum "build.gradle.kts" }}-{{ checksum "gradle/libs.versions.toml" }}-{{ checksum "settings.gradle.kts" }} - attach_workspace: at: ~/workspace - setup_remote_docker - run: name: Setup Docker Buildx and Registry Login command: | echo "๐Ÿณ Setting up Docker buildx and logging into registry..." # Install QEMU for multi-platform builds docker run --rm --privileged tonistiigi/binfmt --install all # Create and use a new builder instance docker buildx create --name multiarch-builder --use || true docker buildx inspect --bootstrap # Login to GitHub Container Registry echo "$GH_GCR" | docker login ghcr.io -u "$DOCKER_USER" --password-stdin echo "โœ… Docker buildx setup complete" - run: name: Build and Push BC-SHELL command: | echo "๐Ÿ“ฆ Building and pushing bc-shell Docker image..." # Copy built artifacts to expected locations echo "๐Ÿ“‹ Copying built artifacts from workspace..." mkdir -p ~/project/jar-shell/build/libs/ cp ~/workspace/build-artifacts/jar-shell-*.jar ~/project/jar-shell/build/libs/ 2>/dev/null || echo "No jar-shell JAR found in workspace" # Verify JAR file exists echo "๐Ÿ” Checking for JAR file:" ls -la ~/project/jar-shell/build/libs/ || echo "No build/libs directory" # Build and push multi-platform image docker buildx build \ --platform linux/amd64,linux/arm64 \ --push \ --tag "ghcr.io/monowai/bc-shell:latest" \ --tag "ghcr.io/monowai/bc-shell:${STACK_VER}" \ ~/project/jar-shell/ echo "โœ… bc-shell image built and pushed successfully" package-data: executor: java-build environment: IMAGE_NAME: bc-data steps: - add_ssh_keys: fingerprints: - "7e:93:fb:39:b3:21:f7:b6:48:bd:f7:0e:56:5c:ad:87" - checkout - restore_cache: keys: - v3-build-cache-{{ checksum "build.gradle.kts" }}-{{ checksum "gradle/libs.versions.toml" }}-{{ checksum "settings.gradle.kts" }} - attach_workspace: at: ~/workspace - setup_remote_docker - run: name: Setup Docker Buildx and Registry Login command: | echo "๐Ÿณ Setting up Docker buildx and logging into registry..." # Install QEMU for multi-platform builds docker run --rm --privileged tonistiigi/binfmt --install all # Create and use a new builder instance docker buildx create --name multiarch-builder --use || true docker buildx inspect --bootstrap # Login to GitHub Container Registry echo "$GH_GCR" | docker login ghcr.io -u "$DOCKER_USER" --password-stdin echo "โœ… Docker buildx setup complete" - run: name: Build and Push BC-DATA command: | echo "๐Ÿ“ฆ Building and pushing bc-data Docker image..." # Copy built artifacts to expected locations echo "๐Ÿ“‹ Copying built artifacts from workspace..." mkdir -p ~/project/svc-data/build/libs/ cp ~/workspace/build-artifacts/svc-data-*.jar ~/project/svc-data/build/libs/ 2>/dev/null || echo "No svc-data JAR found in workspace" # Verify JAR file exists echo "๐Ÿ” Checking for JAR file:" ls -la ~/project/svc-data/build/libs/ || echo "No build/libs directory" # Build and push multi-platform image docker buildx build \ --platform linux/amd64,linux/arm64 \ --push \ --tag "ghcr.io/monowai/bc-data:latest" \ --tag "ghcr.io/monowai/bc-data:${STACK_VER}" \ ~/project/svc-data/ echo "โœ… bc-data image built and pushed successfully" package-position: executor: java-build environment: IMAGE_NAME: bc-position steps: - add_ssh_keys: fingerprints: - "7e:93:fb:39:b3:21:f7:b6:48:bd:f7:0e:56:5c:ad:87" - checkout - restore_cache: keys: - v3-build-cache-{{ checksum "build.gradle.kts" }}-{{ checksum "gradle/libs.versions.toml" }}-{{ checksum "settings.gradle.kts" }} - attach_workspace: at: ~/workspace - setup_remote_docker - run: name: Setup Docker Buildx and Registry Login command: | echo "๐Ÿณ Setting up Docker buildx and logging into registry..." # Install QEMU for multi-platform builds docker run --rm --privileged tonistiigi/binfmt --install all # Create and use a new builder instance docker buildx create --name multiarch-builder --use || true docker buildx inspect --bootstrap # Login to GitHub Container Registry echo "$GH_GCR" | docker login ghcr.io -u "$DOCKER_USER" --password-stdin echo "โœ… Docker buildx setup complete" - run: name: Build and Push BC-POSITION command: | echo "๐Ÿ“ฆ Building and pushing bc-position Docker image..." # Copy built artifacts to expected locations echo "๐Ÿ“‹ Copying built artifacts from workspace..." mkdir -p ~/project/svc-position/build/libs/ cp ~/workspace/build-artifacts/svc-position-*.jar ~/project/svc-position/build/libs/ 2>/dev/null || echo "No svc-position JAR found in workspace" # Verify JAR file exists echo "๐Ÿ” Checking for JAR file:" ls -la ~/project/svc-position/build/libs/ || echo "No build/libs directory" # Build and push multi-platform image docker buildx build \ --platform linux/amd64,linux/arm64 \ --push \ --tag "ghcr.io/monowai/bc-position:latest" \ --tag "ghcr.io/monowai/bc-position:${STACK_VER}" \ ~/project/svc-position/ echo "โœ… bc-position image built and pushed successfully" package-event: executor: java-build environment: IMAGE_NAME: bc-event steps: - add_ssh_keys: fingerprints: - "7e:93:fb:39:b3:21:f7:b6:48:bd:f7:0e:56:5c:ad:87" - checkout - restore_cache: keys: - v3-build-cache-{{ checksum "build.gradle.kts" }}-{{ checksum "gradle/libs.versions.toml" }}-{{ checksum "settings.gradle.kts" }} - attach_workspace: at: ~/workspace - setup_remote_docker - run: name: Setup Docker Buildx and Registry Login command: | echo "๐Ÿณ Setting up Docker buildx and logging into registry..." # Install QEMU for multi-platform builds docker run --rm --privileged tonistiigi/binfmt --install all # Create and use a new builder instance docker buildx create --name multiarch-builder --use || true docker buildx inspect --bootstrap # Login to GitHub Container Registry echo "$GH_GCR" | docker login ghcr.io -u "$DOCKER_USER" --password-stdin echo "โœ… Docker buildx setup complete" - run: name: Build and Push BC-EVENT command: | echo "๐Ÿ“ฆ Building and pushing bc-event Docker image..." # Copy built artifacts to expected locations echo "๐Ÿ“‹ Copying built artifacts from workspace..." mkdir -p ~/project/svc-event/build/libs/ cp ~/workspace/build-artifacts/svc-event-*.jar ~/project/svc-event/build/libs/ 2>/dev/null || echo "No svc-event JAR found in workspace" # Verify JAR file exists echo "๐Ÿ” Checking for JAR file:" ls -la ~/project/svc-event/build/libs/ || echo "No build/libs directory" # Build and push multi-platform image docker buildx build \ --platform linux/amd64,linux/arm64 \ --push \ --tag "ghcr.io/monowai/bc-event:latest" \ --tag "ghcr.io/monowai/bc-event:${STACK_VER}" \ ~/project/svc-event/ echo "โœ… bc-event image built and pushed successfully" publish-coverage: docker: - image: circleci/buildpack-deps:stretch steps: - add_ssh_keys: fingerprints: - "7e:93:fb:39:b3:21:f7:b6:48:bd:f7:0e:56:5c:ad:87" - attach_workspace: at: ~/workspace - run: name: Codacy Coverage command: | cd ~/workspace bash <(curl -Ls https://coverage.codacy.com/get.sh) report -l Kotlin $(find -name 'jacoco*.xml' -printf '-r %p ') workflows: version: 2 build_and_stage: jobs: # Complete build and test (handles stub dependencies) - build-and-test # Docker packaging jobs (run concurrently after build completes) # All jobs start in parallel once build-and-test succeeds # Branch patterns can be configured via CircleCI environment variables - package-shell: filters: branches: only: - master - /^mike\/.*/ requires: - build-and-test - package-data: filters: branches: only: - master - /^mike\/.*/ requires: - build-and-test - package-position: filters: branches: only: - master - /^mike\/.*/ requires: - build-and-test - package-event: filters: branches: only: - master - /^mike\/.*/ requires: - build-and-test # Coverage publishing (runs concurrently with Docker jobs) - publish-coverage: filters: branches: only: - master - /^mike\/.*/ - /^codacy.*/ requires: - build-and-test