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]