Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
2b31449
test(frontend): flush small pipeline tests in act (#13368)
jeffspahr May 15, 2026
0abd736
test(frontend): flush MetricsVisualizations updates in act (#13367)
jeffspahr May 15, 2026
552997c
test(frontend): flush MetricsDropdown setup in act (#13366)
jeffspahr May 15, 2026
2582d6b
test(frontend): flush CompareV2 setup in act (#13360)
jeffspahr May 15, 2026
9af3b2a
fix(sdk): build local KFP package with pip wheel (#13398)
Copilot May 15, 2026
504d779
feat(backend): Remediate ADA-KUBEFL-01: Server-Side Request Forgery (…
JerT33 May 17, 2026
d05417b
test(frontend): flush Tensorboard updates in act (#13365)
jeffspahr May 19, 2026
f10a8cc
test(frontend): flush RunList setup in act (#13363)
jeffspahr May 19, 2026
aecc980
test(frontend): flush NewExperiment setup in act (#13364)
jeffspahr May 19, 2026
ff9c98f
test(frontend): flush Compare setup in act (#13362)
jeffspahr May 19, 2026
3004f97
test(frontend): flush CompareV1 setup in act (#13361)
jeffspahr May 19, 2026
4244448
fix(backend): apply recurring run service account unconditionally (#1…
neo99zhang May 20, 2026
2892678
chore: bump Go version to 1.26.2 (#13421)
hbelmiro May 20, 2026
fac668e
feat(sdk): Add set_debug_pause method to PipelineTask (#13396)
carlosdanielarroyo May 26, 2026
ad2a682
chore: refactor Go setup into reusable composite action (#13431)
hbelmiro May 26, 2026
de99710
fix(swf): Enforce V1 pipeline blocking with expanded test cases (#13434)
cbartram May 27, 2026
456c72a
fix(backend): resolve artifact OneOf outputs at runtime (#13436) (#13…
mprahl May 28, 2026
ff793f3
feat(frontend,backend): show actual retry start time for pipeline run…
Sridhar1030 May 29, 2026
56a9c39
Return to recurring runs after canceling creation (#13379)
jeffspahr May 29, 2026
c6dfd45
chore(deps): bump go.opentelemetry.io/otel/sdk from 1.41.0 to 1.43.0 …
dependabot[bot] May 29, 2026
c528fbd
chore(deps): bump github.com/aws/aws-sdk-go-v2/aws/protocol/eventstre…
dependabot[bot] May 29, 2026
52ffae5
chore(deps): bump github.com/go-jose/go-jose/v4 from 4.1.3 to 4.1.4 (…
dependabot[bot] May 29, 2026
ee397e5
chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlpmetric/…
dependabot[bot] May 31, 2026
c3c257d
fix(sdk): remove max duration limit on retries (#13452)
JerT33 Jun 1, 2026
a831e01
ci: stabilize SeaweedFS resource requests (#13454)
jeffspahr Jun 1, 2026
d098350
chore(ci): rotate tested Kubernetes versions (#13458)
jeffspahr Jun 1, 2026
7ebe15c
chore(deps): bump argo-workflows, s3, and spdystream (#13460)
droctothorpe Jun 1, 2026
d32f9c2
fix(backend): fix recurring runs with the latest pipeline version (#1…
jaewak Jun 1, 2026
32aaa7d
chore(deps): bump remaining backend Go builder images to golang:1.26.…
tolgatuncoglu Jun 1, 2026
55b11d8
fix(manifests): update shared SeaweedFS manifest (#13463)
danish9039 Jun 1, 2026
fd6752b
chore: Update Argo Workflows resources to v3.7.14 (#13467)
juliusvonkohout Jun 1, 2026
9ca1c0b
Merge mlflow-integration into master (#13441)
VaniHaripriya Jun 1, 2026
947074d
Merge remote-tracking branch 'upstream/master' into sync/upstream-mer…
dsp-developers Jun 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 5 additions & 1 deletion .github/actions/test-and-report/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ inputs:
description: "Skip API access configuration and token generation (for tests that do not need a cluster)"
required: false
default: 'false'
mlflow_enabled:
description: "Whether MLflow is deployed and available for integration tests"
required: false
default: 'false'


runs:
Expand Down Expand Up @@ -280,7 +284,7 @@ runs:
DISABLE_TLS_CHECK='false'
fi

go run github.com/onsi/ginkgo/v2/ginkgo -r -v --cover -p --keep-going --github-output=true --nodes=${{ inputs.num_parallel_nodes }} --label-filter=${{ inputs.test_label }} --silence-skips=true -- -namespace=${{ inputs.default_namespace }} -multiUserMode=$MULTI_USER -useProxy=$USE_PROXY -userNamespace=${{ inputs.user_namespace }} -uploadPipelinesWithKubernetes=${{ inputs.upload_pipelines_with_kubernetes_client}} -pipelineStoreKubernetes=$pipelineStoreKubernetes -disableTlsCheck=$DISABLE_TLS_CHECK -apiScheme=$API_SCHEME -tlsEnabled=$TLS_ENABLED -caCertPath=$CA_CERT_PATH -pullNumber=$PULL_NUMBER -repoName=$REPO_NAME -apiUrl="$API_URL" -authToken="$AUTH_TOKEN" -serviceAccountName="$SERVICE_ACCOUNT_NAME" $BASE_IMAGE_FLAG
go run github.com/onsi/ginkgo/v2/ginkgo -r -v --cover -p --keep-going --github-output=true --nodes=${{ inputs.num_parallel_nodes }} --label-filter=${{ inputs.test_label }} --silence-skips=true -- -namespace=${{ inputs.default_namespace }} -multiUserMode=$MULTI_USER -useProxy=$USE_PROXY -userNamespace=${{ inputs.user_namespace }} -uploadPipelinesWithKubernetes=${{ inputs.upload_pipelines_with_kubernetes_client}} -pipelineStoreKubernetes=$pipelineStoreKubernetes -disableTlsCheck=$DISABLE_TLS_CHECK -apiScheme=$API_SCHEME -tlsEnabled=$TLS_ENABLED -caCertPath=$CA_CERT_PATH -pullNumber=$PULL_NUMBER -repoName=$REPO_NAME -apiUrl="$API_URL" -authToken="$AUTH_TOKEN" -serviceAccountName="$SERVICE_ACCOUNT_NAME" -mlflowEnabled=${{ inputs.mlflow_enabled }} $BASE_IMAGE_FLAG
continue-on-error: true

- name: Collect Pod logs in case of Test Failures
Expand Down
120 changes: 120 additions & 0 deletions .github/resources/scripts/configure-mlflow.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
#!/bin/bash
# Copyright 2026 The Kubeflow Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Purpose:
# This script configures KFP to use an already-deployed MLflow instance for
# MLflow E2E tests.
#
# CI helper: patch the KFP API server with plugins.mlflow, roll it out, and
# port-forward the API server and MLflow so E2E tests can reach both.
# It also exports workspace/auth variables used by MLflow test helpers.
#
# Usage: configure-mlflow.sh <KFP_NAMESPACE> <MLFLOW_NAMESPACE> <CONFIG_JSON_PATH>

set -e

KFP_NAMESPACE="${1:?KFP namespace required}"
MLFLOW_NAMESPACE="${2:?MLflow namespace required}"
CONFIG_JSON_PATH="${3:?Path to source config.json required}"

echo "Services in ${MLFLOW_NAMESPACE} namespace:"
kubectl get svc -n "$MLFLOW_NAMESPACE" --no-headers
MLFLOW_SVC=$(kubectl get svc -n "$MLFLOW_NAMESPACE" --no-headers -o custom-columns=":metadata.name" | grep -i mlflow | head -1)
if [ -z "$MLFLOW_SVC" ]; then
echo "ERROR: No service matching 'mlflow' found in namespace $MLFLOW_NAMESPACE"
exit 1
fi
MLFLOW_PORT=$(kubectl get svc -n "$MLFLOW_NAMESPACE" "$MLFLOW_SVC" -o jsonpath='{.spec.ports[0].port}')
MLFLOW_HOST="${MLFLOW_SVC}.${MLFLOW_NAMESPACE}.svc.cluster.local"
MLFLOW_STATIC_PREFIX="/mlflow"
MLFLOW_ENDPOINT="https://${MLFLOW_HOST}:${MLFLOW_PORT}${MLFLOW_STATIC_PREFIX}"
echo "MLflow service: $MLFLOW_SVC port=$MLFLOW_PORT endpoint=$MLFLOW_ENDPOINT"

MLFLOW_PATCH=$(jq -n --arg endpoint "$MLFLOW_ENDPOINT" '{
endpoint: $endpoint,
tls: { insecureSkipVerify: true },
settings: { workspacesEnabled: true }
}')

jq --argjson mlflow "$MLFLOW_PATCH" '. + { plugins: { mlflow: $mlflow } }' \
"$CONFIG_JSON_PATH" > /tmp/kfp-config.json

echo "Patched config.json plugins.mlflow:"
jq '.plugins.mlflow' /tmp/kfp-config.json

kubectl create configmap kfp-mlflow-config -n "$KFP_NAMESPACE" \
--from-file=config.json=/tmp/kfp-config.json --dry-run=client -o yaml | kubectl apply -f -
kubectl patch deployment ml-pipeline -n "$KFP_NAMESPACE" --type=strategic -p \
'{"spec":{"template":{"spec":{"volumes":[{"name":"mlflow-cfg","configMap":{"name":"kfp-mlflow-config"}}],"containers":[{"name":"ml-pipeline-api-server","volumeMounts":[{"name":"mlflow-cfg","mountPath":"/config/config.json","subPath":"config.json"}]}]}}}}'
kubectl rollout status deployment/ml-pipeline -n "$KFP_NAMESPACE" --timeout=180s

pkill -f "kubectl port-forward.*ml-pipeline.*8888" || true
sleep 2

C_DIR="${BASH_SOURCE%/*}"
"${C_DIR}/forward-port.sh" "$KFP_NAMESPACE" ml-pipeline 8888 8888

for i in $(seq 1 12); do
if curl -sf http://localhost:8888/apis/v1beta1/healthz > /dev/null 2>&1; then
echo "API server is healthy on localhost:8888"
break
fi
echo "Waiting for API server to become healthy... ($i/12)"
sleep 5
done
curl -sf http://localhost:8888/apis/v1beta1/healthz > /dev/null 2>&1 || {
echo "ERROR: API server not reachable at localhost:8888"
exit 1
}

SA_TOKEN=$(kubectl create token ml-pipeline -n "$KFP_NAMESPACE" --duration=1h 2>/dev/null || true)
if [ -n "${GITHUB_ENV:-}" ]; then
echo "MLFLOW_WORKSPACE=$KFP_NAMESPACE" >> "$GITHUB_ENV"
# Later workflow steps need these to re-establish port-forward: background jobs from this step
# are terminated when the step exits, so test-and-report starts kubectl port-forward again.
echo "MLFLOW_PORT_FORWARD_NS=$MLFLOW_NAMESPACE" >> "$GITHUB_ENV"
echo "MLFLOW_PORT_FORWARD_SVC=$MLFLOW_SVC" >> "$GITHUB_ENV"
echo "MLFLOW_PORT_FORWARD_REMOTE_PORT=$MLFLOW_PORT" >> "$GITHUB_ENV"
if [ -n "$SA_TOKEN" ]; then
echo "MLFLOW_BEARER_TOKEN=$SA_TOKEN" >> "$GITHUB_ENV"
echo "Exported MLFLOW_BEARER_TOKEN and MLFLOW_WORKSPACE for test helpers"
else
echo "WARNING: Could not create SA token; MLflow requests may be unauthenticated"
echo "Exported MLFLOW_WORKSPACE only"
fi
fi

kubectl port-forward -n "$MLFLOW_NAMESPACE" "svc/$MLFLOW_SVC" "8080:$MLFLOW_PORT" &
sleep 3

HEALTH_URL="https://localhost:8080${MLFLOW_STATIC_PREFIX}/health"
CURL_HEADERS=(-H "X-MLflow-Workspace: $KFP_NAMESPACE")
[ -n "$SA_TOKEN" ] && CURL_HEADERS+=(-H "Authorization: Bearer $SA_TOKEN")

STATUS=000
for i in $(seq 1 30); do
STATUS=$(curl -sk -o /dev/null -w '%{http_code}' --connect-timeout 5 --max-time 10 \
"${CURL_HEADERS[@]}" "$HEALTH_URL" 2>/dev/null || echo "000")
if [ "$STATUS" != "000" ] && [ "$STATUS" -lt 500 ] 2>/dev/null; then
echo "MLflow backend is healthy on localhost:8080 (HTTPS, status=$STATUS)"
break
fi
echo "Waiting for MLflow backend... ($i/30, status=$STATUS)"
sleep 5
done
if [ "$STATUS" = "000" ] || { [ "$STATUS" -ge 500 ] 2>/dev/null; }; then
echo "ERROR: MLflow backend not healthy after 30 attempts (last status=$STATUS)"
exit 1
fi
22 changes: 17 additions & 5 deletions .github/workflows/api-server-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,27 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
k8s_version: [ "v1.34.0" ]
k8s_version: [ "v1.35.0" ]
cache_enabled: [ "true", "false" ]
proxy: [ "false" ]
argo_version: [ "v3.7.3", "v3.5.14", "v4.0.4" ]
pipeline_store: [ "database" ]
pod_to_pod_tls_enabled: [ "true" ]
include:
- k8s_version: "v1.29.2"
- k8s_version: "v1.31.14"
cache_enabled: "true"
<<<<<<< HEAD
=======
argo_version: "v3.7.3"
- k8s_version: "v1.31.14"
cache_enabled: "true"
argo_version: "v3.5.14"
- k8s_version: "v1.31.14"
cache_enabled: "true"
argo_version: "v4.0.4"
- k8s_version: "v1.35.0"
cache_enabled: "true"
>>>>>>> upstream/master
pod_to_pod_tls_enabled: "true"
- k8s_version: "v1.29.2"
cache_enabled: "true"
Expand Down Expand Up @@ -179,13 +191,13 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
k8s_version: [ "v1.34.0", "v1.29.2" ]
k8s_version: [ "v1.35.0", "v1.31.14" ]
cache_enabled: [ "true" ]
uploadPipelinesWithKubernetesClient: [ "true", "false" ]
pipeline_store: [ "kubernetes" ]
pod_to_pod_tls_enabled: [ "true" ]
include:
- k8s_version: "v1.34.0"
- k8s_version: "v1.35.0"
cache_enabled: "true"
pipeline_store: "kubernetes"
pod_to_pod_tls_enabled: "false"
Expand Down Expand Up @@ -246,7 +258,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
k8s_version: [ "v1.34.0"]
k8s_version: [ "v1.35.0"]
cache_enabled: [ "true", "false" ]
multi_user: [ "true" ]
fail-fast: false # So that failure in 1 type of parameterized job does not cause other jobs to terminate prematurely
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/e2e-test-frontend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
needs: build
strategy:
matrix:
k8s_version: [ "v1.29.2", "v1.34.0" ]
k8s_version: [ "v1.31.14", "v1.35.0" ]
pod_to_pod_tls_enabled: [ "true", "false" ]
name: Frontend Integration Tests - K8s ${{ matrix.k8s_version }} pod_to_pod_tls_enabled=${{ matrix.pod_to_pod_tls_enabled }}
steps:
Expand Down
Loading
Loading