From f276b6f6f09540b034be611409b69c43471b2678 Mon Sep 17 00:00:00 2001 From: lingniu Date: Wed, 1 Jul 2026 04:11:13 +0800 Subject: [PATCH] ci: consolidate active app image builds --- .../historyapp/WoodpeckerPipelineTest.java | 49 +++++ woodpecker.yml | 178 +++--------------- 2 files changed, 74 insertions(+), 153 deletions(-) create mode 100644 modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/WoodpeckerPipelineTest.java diff --git a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/WoodpeckerPipelineTest.java b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/WoodpeckerPipelineTest.java new file mode 100644 index 00000000..367b41a9 --- /dev/null +++ b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/WoodpeckerPipelineTest.java @@ -0,0 +1,49 @@ +package com.lingniu.ingest.historyapp; + +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThat; + +class WoodpeckerPipelineTest { + + @Test + void dockerPublishUsesOneProductionAppList() throws IOException { + String pipeline = Files.readString(repositoryRoot().resolve("woodpecker.yml")); + + assertThat(pipeline) + .contains("ACTIVE_APPS=\"gb32960-ingest-app jt808-ingest-app yutong-mqtt-app vehicle-history-app vehicle-analytics-app\"") + .contains("- name: docker-build-apps") + .doesNotContain("xinda-push-app") + .doesNotContain("KAFKA_TOPIC_XINDA_PUSH"); + + assertThat(countOccurrences(pipeline, "- name: docker-build-")).isEqualTo(1); + } + + private static int countOccurrences(String value, String needle) { + int count = 0; + int from = 0; + while (true) { + int next = value.indexOf(needle, from); + if (next < 0) { + return count; + } + count++; + from = next + needle.length(); + } + } + + private static Path repositoryRoot() { + Path current = Path.of(System.getProperty("user.dir")).toAbsolutePath(); + while (current != null) { + if (Files.exists(current.resolve("woodpecker.yml"))) { + return current; + } + current = current.getParent(); + } + throw new IllegalStateException("repository root not found"); + } +} diff --git a/woodpecker.yml b/woodpecker.yml index 6845bfd4..8281b34b 100644 --- a/woodpecker.yml +++ b/woodpecker.yml @@ -13,7 +13,17 @@ steps: commands: | cd $CI_WORKSPACE - mvn -B -ntp -am -pl :gb32960-ingest-app,:jt808-ingest-app,:yutong-mqtt-app,:vehicle-history-app,:vehicle-analytics-app package -DskipTests + ACTIVE_APPS="gb32960-ingest-app jt808-ingest-app yutong-mqtt-app vehicle-history-app vehicle-analytics-app" + ACTIVE_MODULES="" + for APP_NAME in $ACTIVE_APPS; do + if [ -z "$ACTIVE_MODULES" ]; then + ACTIVE_MODULES=":$APP_NAME" + else + ACTIVE_MODULES="$ACTIVE_MODULES,:$APP_NAME" + fi + done + + mvn -B -ntp -am -pl "$ACTIVE_MODULES" package -DskipTests BRANCH_NAME=$(echo ${CI_COMMIT_BRANCH:-local} | tr / -) PROJECT_VERSION=$(mvn -q -DforceStdout help:evaluate -Dexpression=project.version) @@ -24,7 +34,7 @@ steps: echo "Image version: $IMAGE_VERSION" echo "$IMAGE_VERSION" > $CI_WORKSPACE/project_version.txt - - name: docker-build-gb32960-ingest-app + - name: docker-build-apps image: docker:24.0.5-cli when: event: @@ -44,162 +54,24 @@ steps: from_secret: aliyun_acr_password commands: | cd $CI_WORKSPACE - APP_NAME=gb32960-ingest-app + ACTIVE_APPS="gb32960-ingest-app jt808-ingest-app yutong-mqtt-app vehicle-history-app vehicle-analytics-app" APP_VERSION=$(cat $CI_WORKSPACE/project_version.txt) - IMAGE=crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/$APP_NAME:$APP_VERSION - - docker build \ - --build-arg APP_NAME=$APP_NAME \ - --build-arg APP_VERSION=$APP_VERSION \ - -t $IMAGE . + REGISTRY=crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com + NAMESPACE=oneos printf '%s' "$ALIYUN_ACR_PASSWORD" | docker login \ --username "$ALIYUN_ACR_USERNAME" \ --password-stdin \ - crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com + "$REGISTRY" - docker push $IMAGE + for APP_NAME in $ACTIVE_APPS; do + IMAGE=$REGISTRY/$NAMESPACE/$APP_NAME:$APP_VERSION + echo "Building and pushing $IMAGE" - - name: docker-build-jt808-ingest-app - image: docker:24.0.5-cli - when: - event: - - push - - pull_request - - manual - branch: - - master - - develop - - main - volumes: - - /var/run/docker.sock:/var/run/docker.sock - environment: - ALIYUN_ACR_USERNAME: - from_secret: aliyun_acr_username - ALIYUN_ACR_PASSWORD: - from_secret: aliyun_acr_password - commands: | - cd $CI_WORKSPACE - APP_NAME=jt808-ingest-app - APP_VERSION=$(cat $CI_WORKSPACE/project_version.txt) - IMAGE=crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/$APP_NAME:$APP_VERSION + docker build \ + --build-arg APP_NAME=$APP_NAME \ + --build-arg APP_VERSION=$APP_VERSION \ + -t $IMAGE . - docker build \ - --build-arg APP_NAME=$APP_NAME \ - --build-arg APP_VERSION=$APP_VERSION \ - -t $IMAGE . - - printf '%s' "$ALIYUN_ACR_PASSWORD" | docker login \ - --username "$ALIYUN_ACR_USERNAME" \ - --password-stdin \ - crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com - - docker push $IMAGE - - - name: docker-build-vehicle-history-app - image: docker:24.0.5-cli - when: - event: - - push - - pull_request - - manual - branch: - - master - - develop - - main - volumes: - - /var/run/docker.sock:/var/run/docker.sock - environment: - ALIYUN_ACR_USERNAME: - from_secret: aliyun_acr_username - ALIYUN_ACR_PASSWORD: - from_secret: aliyun_acr_password - commands: | - cd $CI_WORKSPACE - APP_NAME=vehicle-history-app - APP_VERSION=$(cat $CI_WORKSPACE/project_version.txt) - IMAGE=crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/$APP_NAME:$APP_VERSION - - docker build \ - --build-arg APP_NAME=$APP_NAME \ - --build-arg APP_VERSION=$APP_VERSION \ - -t $IMAGE . - - printf '%s' "$ALIYUN_ACR_PASSWORD" | docker login \ - --username "$ALIYUN_ACR_USERNAME" \ - --password-stdin \ - crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com - - docker push $IMAGE - - - name: docker-build-yutong-mqtt-app - image: docker:24.0.5-cli - when: - event: - - push - - pull_request - - manual - branch: - - master - - develop - - main - volumes: - - /var/run/docker.sock:/var/run/docker.sock - environment: - ALIYUN_ACR_USERNAME: - from_secret: aliyun_acr_username - ALIYUN_ACR_PASSWORD: - from_secret: aliyun_acr_password - commands: | - cd $CI_WORKSPACE - APP_NAME=yutong-mqtt-app - APP_VERSION=$(cat $CI_WORKSPACE/project_version.txt) - IMAGE=crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/$APP_NAME:$APP_VERSION - - docker build \ - --build-arg APP_NAME=$APP_NAME \ - --build-arg APP_VERSION=$APP_VERSION \ - -t $IMAGE . - - printf '%s' "$ALIYUN_ACR_PASSWORD" | docker login \ - --username "$ALIYUN_ACR_USERNAME" \ - --password-stdin \ - crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com - - docker push $IMAGE - - - name: docker-build-vehicle-analytics-app - image: docker:24.0.5-cli - when: - event: - - push - - pull_request - - manual - branch: - - master - - develop - - main - volumes: - - /var/run/docker.sock:/var/run/docker.sock - environment: - ALIYUN_ACR_USERNAME: - from_secret: aliyun_acr_username - ALIYUN_ACR_PASSWORD: - from_secret: aliyun_acr_password - commands: | - cd $CI_WORKSPACE - APP_NAME=vehicle-analytics-app - APP_VERSION=$(cat $CI_WORKSPACE/project_version.txt) - IMAGE=crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/$APP_NAME:$APP_VERSION - - docker build \ - --build-arg APP_NAME=$APP_NAME \ - --build-arg APP_VERSION=$APP_VERSION \ - -t $IMAGE . - - printf '%s' "$ALIYUN_ACR_PASSWORD" | docker login \ - --username "$ALIYUN_ACR_USERNAME" \ - --password-stdin \ - crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com - - docker push $IMAGE + docker push $IMAGE + done