This is an automated email from the ASF dual-hosted git repository.

jimin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-seata-samples.git


The following commit(s) were added to refs/heads/master by this push:
     new 5a26744b bugfix: fix e2e image problem (#722)
5a26744b is described below

commit 5a26744b50a6df00133f935571bcd61a0bcf5124
Author: Jingliu <[email protected]>
AuthorDate: Sun Jan 25 22:26:46 2026 +0800

    bugfix: fix e2e image problem (#722)
---
 .github/workflows/E2E.yml                          | 113 ++++++++++++++++++++-
 .../org/apache/seata/builder/ImageBuilder.java     |  24 ++++-
 .../resources/template/application-dockerFile.ftl  |   2 +-
 .../src/main/resources/template/jar-dockerFile.ftl |   2 +-
 .../seata/controller/SkyWalkingController.java     |  14 ++-
 5 files changed, 144 insertions(+), 11 deletions(-)

diff --git a/.github/workflows/E2E.yml b/.github/workflows/E2E.yml
index c81b4b04..276bf3b3 100644
--- a/.github/workflows/E2E.yml
+++ b/.github/workflows/E2E.yml
@@ -17,6 +17,8 @@ jobs:
   run_e2e:
     name: Run E2E Test ${{ matrix.java }}, ${{ matrix.os }}
     runs-on: ${{ matrix.os }}
+    env:
+      DEBIAN_FRONTEND: noninteractive
     strategy:
       matrix:
         os: [ ubuntu-latest ]
@@ -36,6 +38,23 @@ jobs:
       - name: Verify Docker Compose v1 installation
         run: docker-compose --version
 
+      # ========== 新增步骤1:Docker环境全量检查(关键) ==========
+      - name: Check Docker environment (debug)
+        run: |
+          # 检查Docker服务状态
+          sudo systemctl status docker || true
+          # 检查Docker版本和Compose版本
+          docker --version
+          docker-compose --version
+          # 检查磁盘空间(GitHub Runner空间不足会导致镜像/容器创建失败)
+          df -h
+          # 检查已有容器/镜像(清理残留)
+          docker ps -a
+          docker images
+          # 检查端口占用(排查Seata常用端口8091/7091等)
+          sudo lsof -i :8091 || true
+          sudo lsof -i :7091 || true
+
       - name: Check out code into
         uses: actions/checkout@v3
 
@@ -48,7 +67,7 @@ jobs:
           go-version: 1.18
         id: go
 
-      - name: Build e2e framework (use skywalking-infra-e2e v1.3.0)
+      - name: Build e2e framework (use skywalking-infra-e2e pr137)
         run: |
           cd skywalking-infra-e2e && git checkout 
1485ae03f0ad90496ad7626a5ae4a6a73a1f6296 && make linux
 
@@ -66,9 +85,95 @@ jobs:
           java-version: ${{ matrix.java }}
 
       - name: prepare e2e tests
-        run: | 
+        run: |
           cd e2e-test/scripts && sh prepare-test.sh
+          # ========== 新增:打印prepare阶段的Docker状态 ==========
+
+      - name: check docker resources after prepare-test.sh
+        run: |
+          echo "===== After prepare-test.sh: Docker containers status ====="
+          docker ps -a
+          echo "===== After prepare-test.sh: Docker images status ====="
+          docker images
+
+      # ========== 新增关键步骤:手动执行docker-compose up -d(抓原始错误) ==========
+      - name: Manual run docker-compose up -d (debug core error)
+        run: |
+          cd e2e-test/scripts
+          # 1. 先检查compose文件语法(关键!语法错会直接exit 1)
+          echo "===== Check docker-compose.yml syntax ====="
+          docker-compose config --verbose
+          # 2. 手动执行up -d,输出最详细日志,强制捕获错误
+          echo "===== Run docker-compose up -d with debug ====="
+          docker-compose up -d --verbose 2>&1 | tee docker-compose-up-debug.log
+          # 3. 检查执行结果,打印错误码
+          COMPOSE_EXIT_CODE=${PIPESTATUS[0]}
+          echo "===== Docker-compose exit code: $COMPOSE_EXIT_CODE ====="
+          # 4. 如果失败,立即打印容器状态和日志
+          if [ $COMPOSE_EXIT_CODE -ne 0 ]; then
+            echo "===== Docker containers status after failed up ====="
+            docker ps -a
+            echo "===== Docker-compose logs after failed up ====="
+            docker-compose logs
+            # 强制退出,让步骤失败(方便看日志)
+            exit $COMPOSE_EXIT_CODE
+          fi
+
+      # ========== 原有e2e测试步骤(保留,用于对比) ==========
+      - name: run e2e tests (auto answer [yN] prompt)
+        id: e2e_test
+        run: |
+          set -euo pipefail
+          cd e2e-test/scripts
+          # 核心:用echo y | 自动回答[yN]的交互提示(关键!)
+          # 原理:把y作为输入,直接传给test-run.sh执行的进程,绕过手动输入
+          sh test-run.sh 2>&1 | tee e2e-test-log.txt
+          # 捕获真实退出码(排除echo的干扰)
+          TEST_EXIT_CODE=${PIPESTATUS[1]}  # 注意:这里从0改成1,因为管道是echo y | sh 
...,PIPESTATUS[1]才是sh的退出码
+          exit $TEST_EXIT_CODE
+
+      # ========== 核心修正2:日志收集改为if: always()(无论成败都执行) ==========
+      - name: Collect debug logs
+        if: always()  # 替代failure(),无论上一步成功/失败都执行
+        run: |
+          echo "===== Docker version info ====="
+          docker --version
+          docker-compose --version
+          
+          echo "===== All Docker containers status ====="
+          docker ps -a
+          
+          echo "===== Docker compose logs ====="
+          # 进入e2e脚本目录,执行docker-compose logs(适配你的compose文件路径)
+          cd e2e-test/scripts
+          docker-compose logs || true
+          
+          echo "===== Seata container logs (if exists) ====="
+          # 查找Seata相关容器并打印日志(适配容器名)
+          SEATA_CONTAINER=$(docker ps -a | grep seata-server | awk '{print 
$1}')
+          if [ -n "$SEATA_CONTAINER" ]; then
+            docker logs $SEATA_CONTAINER || true
+          fi
+          
+          echo "===== E2E test script logs ====="
+          cat e2e-test-log.txt || true
+          
+          echo "===== Port usage ====="
+          sudo lsof -i -P -n | grep LISTEN || true
+
+      # ========== 核心修正3:日志上传也改为if: always() ==========
+      - name: Upload debug logs
+        if: always()  # 无论成败都上传日志(失败时必传,成功时可选)
+        uses: actions/upload-artifact@v4
+        with:
+          name: e2e-debug-logs-${{ matrix.java }}
+          path: |
+            e2e-test/scripts/e2e-test-log.txt
+            /var/log/docker.log || true
 
-      - name: run e2e tests
+      # ========== 核心修正4:手动标记Job失败(如果测试步骤失败) ==========
+      - name: Mark job as failed if test failed
+        if: steps.e2e_test.outcome == 'failure'
         run: |
-          cd e2e-test/scripts && sh test-run.sh
+          echo "E2E test failed, marking job as failed"
+          exit 1
\ No newline at end of file
diff --git 
a/e2e-test/e2e-test-builder/src/main/java/org/apache/seata/builder/ImageBuilder.java
 
b/e2e-test/e2e-test-builder/src/main/java/org/apache/seata/builder/ImageBuilder.java
index 27832635..2c1a83f4 100644
--- 
a/e2e-test/e2e-test-builder/src/main/java/org/apache/seata/builder/ImageBuilder.java
+++ 
b/e2e-test/e2e-test-builder/src/main/java/org/apache/seata/builder/ImageBuilder.java
@@ -145,16 +145,32 @@ public class ImageBuilder {
             modules.addAll(e2EConfig.getModules().getProviders());
         }
         for (Module module : modules) {
-            String moduleComposeDir = new File(composeDir, 
e2EConfig.getScene_name() + "-"
-                    + module.getName()).getAbsolutePath();
+            String imageTag = String.format("%s:%s", module.getName(), 
"0.0.1");
+            String moduleComposeDir = new File(composeDir, 
e2EConfig.getScene_name() + "-" + module.getName()).getAbsolutePath();
             ProcessBuilder builder = new ProcessBuilder();
             builder.directory(new File(moduleComposeDir));
-            builder.command("docker", "build", "-t", String.format("%s:%s", 
module.getName(), "0.0.1"), ".");
+            builder.command("docker", "build", "-t", imageTag, ".");
             Process process = builder.start();
             printProcessLog(LOGGER, process);
             int exitCode = process.waitFor();
             if (exitCode != 0) {
-                LOGGER.error(String.format("Docker image for module %s build 
failed with exit code %d", module.getName(), exitCode));
+                String stderr = new java.io.BufferedReader(new 
java.io.InputStreamReader(process.getErrorStream(), 
java.nio.charset.StandardCharsets.UTF_8))
+                        
.lines().collect(java.util.stream.Collectors.joining(System.lineSeparator()));
+                String stdout = new java.io.BufferedReader(new 
java.io.InputStreamReader(process.getInputStream(), 
java.nio.charset.StandardCharsets.UTF_8))
+                        
.lines().collect(java.util.stream.Collectors.joining(System.lineSeparator()));
+                LOGGER.error(String.format("Docker image for module %s build 
failed with exit code %d\nSTDOUT:\n%s\nSTDERR:\n%s",
+                        module.getName(), exitCode, stdout, stderr));
+                continue;
+            }
+            // 校验镜像是否存在且可用
+            ProcessBuilder inspectBuilder = new ProcessBuilder("docker", 
"image", "inspect", imageTag);
+            Process inspectProcess = inspectBuilder.start();
+            printProcessLog(LOGGER, inspectProcess);
+            int inspectExitCode = inspectProcess.waitFor();
+            if (inspectExitCode != 0) {
+                LOGGER.error(String.format("Docker image for module %s 
verification failed with exit code %d", module.getName(), inspectExitCode));
+            } else {
+                LOGGER.info(String.format("Docker image for module %s verified 
successfully: %s", module.getName(), imageTag));
             }
         }
     }
diff --git 
a/e2e-test/e2e-test-builder/src/main/resources/template/application-dockerFile.ftl
 
b/e2e-test/e2e-test-builder/src/main/resources/template/application-dockerFile.ftl
index c49483bc..8207af62 100644
--- 
a/e2e-test/e2e-test-builder/src/main/resources/template/application-dockerFile.ftl
+++ 
b/e2e-test/e2e-test-builder/src/main/resources/template/application-dockerFile.ftl
@@ -15,7 +15,7 @@
     limitations under the License.
 -->
 
-FROM openjdk:8-jdk-alpine
+FROM eclipse-temurin:8-jdk-alpine
 RUN apk --no-cache add curl
 COPY ${sourceJar} /app.jar
 ENTRYPOINT ["java","-jar","/app.jar"]
\ No newline at end of file
diff --git 
a/e2e-test/e2e-test-builder/src/main/resources/template/jar-dockerFile.ftl 
b/e2e-test/e2e-test-builder/src/main/resources/template/jar-dockerFile.ftl
index 5893d922..ff7ca87c 100644
--- a/e2e-test/e2e-test-builder/src/main/resources/template/jar-dockerFile.ftl
+++ b/e2e-test/e2e-test-builder/src/main/resources/template/jar-dockerFile.ftl
@@ -15,7 +15,7 @@
     limitations under the License.
 -->
 
-FROM openjdk:8-jdk-alpine
+FROM eclipse-temurin:8-jdk-alpine
 COPY ${sourceJar} /app.jar
 COPY entrypoint.sh /entrypoint.sh
 RUN chmod +x /entrypoint.sh
diff --git 
a/e2e-test/e2e-test-runner/src/main/java/org/apache/seata/controller/SkyWalkingController.java
 
b/e2e-test/e2e-test-runner/src/main/java/org/apache/seata/controller/SkyWalkingController.java
index 5b33c962..2e4d1729 100644
--- 
a/e2e-test/e2e-test-runner/src/main/java/org/apache/seata/controller/SkyWalkingController.java
+++ 
b/e2e-test/e2e-test-runner/src/main/java/org/apache/seata/controller/SkyWalkingController.java
@@ -97,10 +97,22 @@ public class SkyWalkingController {
         try {
             ProcessBuilder builder = new ProcessBuilder();
             builder.directory(file);
+            // 打印 `file` 目录下的文件列表
+            File[] children = file.listFiles();
+            if (children != null) {
+                LOGGER.info("Files under directory " + file.getAbsolutePath() 
+ ":");
+                for (File child : children) {
+                    LOGGER.info(" - " + child.getName() + (child.isDirectory() 
? "/" : ""));
+                }
+            } else {
+                LOGGER.info("Directory " + file.getAbsolutePath() + " is empty 
or not a directory.");
+            }
 //            builder.inheritIO();
-//            builder.command("docker-compose", "up", "--timeout", "120");
+//            builder.command("docker-compose", "up", "-d", "--build", 
"--force-recreate", "--timeout", "120");
             builder.command("e2e", "run");
+            // 启动进程
             Process process = builder.start();
+            // 打印进程日志
             printProcessLog(LOGGER, process);
             int exitCode = process.waitFor();
             if (exitCode != 0) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to