You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在K8s中Spring Boot就绪后触发GitHub Actions或调用API执行E2E测试

解决方案

针对你的需求,这里提供几个可靠的方案,确保在Spring Boot应用的readinessProbe就绪后再触发GitHub Actions工作流:

方案1:改造ArgoCD PostSync Job,轮询应用就绪端点

直接修改你现有的PostSync Job脚本,替换固定sleep为循环检查应用的readinessProbe端点,直到返回成功状态再触发GitHub API。

修改后的Job配置:

apiVersion: batch/v1
kind: Job
metadata:
  name: api-test-trigger
  annotations:
    argocd.argoproj.io/hook: PostSync
    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation, HookSucceeded
spec:
  template:
    metadata:
      labels:
        name: api-test
    spec:
      securityContext:
        runAsNonRoot: true
        runAsUser: 100000
        runAsGroup: 100000
        fsGroup: 100000
      containers:
        - name: api-test
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - ALL
          resources:
            requests:
              memory: "64Mi"
              cpu: "250m"
            limits:
              memory: "128Mi"
              cpu: "500m"
          args:
            - /bin/sh
            - -ec
            - |
              # 轮询Spring Boot的就绪端点(替换为你的实际端点)
              until curl -f http://your-spring-boot-service:8080/actuator/health/readiness; do
                echo "Waiting for application to be ready..."
                sleep 2
              done
              # 触发GitHub Actions工作流
              curl -X POST \
                -H "Accept: application/vnd.github+json" \
                -H "Authorization: Bearer xxxxx" \
                https://api.github.com/repos/xxxx/xxxx/actions/workflows/run.yml/dispatches \
                -d '{"ref":"main"}'
          image: curlimages/curl
          imagePullPolicy: Always
      restartPolicy: Never

关键说明:

  • 替换http://your-spring-boot-service:8080/actuator/health/readiness为你的应用实际的就绪检查端点(Spring Boot默认启用Actuator的话,这个路径是标准的)
  • -f参数确保curl在HTTP状态码非200时返回失败,触发循环重试
  • 调整sleep 2的间隔可以平衡等待效率和资源消耗

方案2:利用Kubernetes Pod Ready状态触发(需ServiceAccount权限)

Kubernetes的Pod Ready状态本身就代表readinessProbe检查通过,你可以在PostSync Job中使用kubectl wait命令等待目标Pod进入Ready状态,再执行API调用。

步骤:

  1. 创建具有Pod读取权限的ServiceAccount和Role:
apiVersion: v1
kind: ServiceAccount
metadata:
  name: pod-wait-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-wait-binding
subjects:
- kind: ServiceAccount
  name: pod-wait-sa
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
  1. 修改PostSync Job使用该ServiceAccount,并调整脚本:
apiVersion: batch/v1
kind: Job
metadata:
  name: api-test-trigger
  annotations:
    argocd.argoproj.io/hook: PostSync
    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation, HookSucceeded
spec:
  template:
    metadata:
      labels:
        name: api-test
    spec:
      serviceAccountName: pod-wait-sa # 指定刚才创建的ServiceAccount
      securityContext:
        runAsNonRoot: true
        runAsUser: 100000
        runAsGroup: 100000
        fsGroup: 100000
      containers:
        - name: api-test
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - ALL
          resources:
            requests:
              memory: "64Mi"
              cpu: "250m"
            limits:
              memory: "128Mi"
              cpu: "500m"
          args:
            - /bin/sh
            - -ec
            - |
              # 等待所有匹配标签的Pod进入Ready状态(替换为你的应用Pod标签)
              kubectl wait pod -l app=your-spring-boot-app --for=condition=Ready --timeout=5m
              # 触发GitHub Actions工作流
              curl -X POST \
                -H "Accept: application/vnd.github+json" \
                -H "Authorization: Bearer xxxxx" \
                https://api.github.com/repos/xxxx/xxxx/actions/workflows/run.yml/dispatches \
                -d '{"ref":"main"}'
          image: bitnami/kubectl:latest # 用包含kubectl的镜像
          imagePullPolicy: Always
      restartPolicy: Never

关键说明:

  • 替换-l app=your-spring-boot-app为你的应用Pod实际使用的标签
  • --timeout=5m设置最大等待时间,避免无限阻塞
  • 使用bitnami/kubectl镜像确保容器内有kubectl工具

方案3:在Spring Boot应用内部触发(需修改代码)

如果允许修改应用代码,可以监听Spring Boot的ApplicationReadyEvent——这个事件会在应用完全启动(包括readinessProbe就绪)后触发,直接在事件处理中调用GitHub API。

示例代码:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationReadyEvent;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class WorkflowTriggerListener implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        // 从环境变量读取GitHub Token(避免硬编码)
        String githubToken = System.getenv("GITHUB_ACTIONS_TOKEN");
        if (githubToken == null || githubToken.isEmpty()) {
            System.err.println("GITHUB_ACTIONS_TOKEN environment variable not set");
            return;
        }

        // 构建请求头和体
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(java.util.Collections.singletonList(MediaType.APPLICATION_JSON));
        headers.set("Authorization", "Bearer " + githubToken);
        
        String requestBody = "{\"ref\":\"main\"}";
        HttpEntity<String> request = new HttpEntity<>(requestBody, headers);

        // 调用GitHub API触发工作流
        RestTemplate restTemplate = new RestTemplate();
        try {
            restTemplate.postForObject(
                "https://api.github.com/repos/xxxx/xxxx/actions/workflows/run.yml/dispatches",
                request,
                String.class
            );
            System.out.println("Successfully triggered GitHub Actions workflow");
        } catch (Exception e) {
            System.err.println("Failed to trigger workflow: " + e.getMessage());
        }
    }
}

关键说明:

  • 将GitHub Token通过环境变量注入Pod,不要硬编码在代码中
  • 确保应用的application.properties或application.yml中启用了Actuator(如果依赖readinessProbe的话)
  • 该方案最直接,无需额外的Kubernetes资源,但需要修改应用代码

内容的提问来源于stack exchange,提问作者John Snow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:35:22