Skip to content

Commit 57ca8ca

Browse files
authored
Merge pull request #389 from hbelmiro/main-to-stable
Merge main into stable
2 parents 37f462e + 8f78ba4 commit 57ca8ca

586 files changed

Lines changed: 18428 additions & 2617 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/deploy/action.yml

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -145,17 +145,8 @@ runs:
145145
shell: bash
146146
if: ${{ inputs.skip_load_docker_images != 'true' }}
147147
run: |
148-
APPS=("apiserver" "scheduledworkflow" "persistenceagent" "frontend" "metadata-writer" "viewer-crd-controller" "visualization-server" "cache-deployer" "cache-server" "metadata-envoy")
149-
for app in "${APPS[@]}"; do
150-
docker image load -i ${{ inputs.image_path }}/$app/$app.tar
151-
docker tag ${{ inputs.image_registry }}/$app:${{ inputs.image_tag }} localhost:5000/$app:${{ inputs.image_tag }}
152-
docker push localhost:5000/$app:${{ inputs.image_tag }}
153-
rm ${{ inputs.image_path }}/$app/$app.tar
154-
docker image rm ${{ inputs.image_registry }}/$app:${{ inputs.image_tag }}
155-
docker image rm localhost:5000/$app:${{ inputs.image_tag }}
156-
done
157-
RUNTIME_APPS=("driver" "launcher")
158-
for app in "${RUNTIME_APPS[@]}"; do
148+
ALL_APPS=("apiserver" "scheduledworkflow" "persistenceagent" "frontend" "metadata-writer" "viewer-crd-controller" "visualization-server" "cache-deployer" "cache-server" "metadata-envoy" "driver" "launcher")
149+
for app in "${ALL_APPS[@]}"; do
159150
docker image load -i ${{ inputs.image_path }}/$app/$app.tar
160151
docker tag ${{ inputs.image_registry }}/$app:${{ inputs.image_tag }} localhost:5000/$app:${{ inputs.image_tag }}
161152
docker tag ${{ inputs.image_registry }}/$app:${{ inputs.image_tag }} localhost:5000/$app:ci
@@ -179,9 +170,7 @@ runs:
179170
pip3 install pyyaml
180171
181172
- name: Set up Go
182-
uses: actions/setup-go@v4
183-
with:
184-
go-version: 'stable' # Uses latest stable Go version
173+
uses: ./.github/actions/setup-go
185174

186175
- name: Deploy Data Science Pipelines
187176
id: deploy-kfp
Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,30 @@
11
name: "Set up Go"
2-
description: "Sets up Go"
2+
description: "Installs Go from Red Hat go-toolset image (includes FIPS support)"
33
runs:
44
using: composite
55
steps:
6-
- name: Set up Go
7-
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c
6+
- name: Extract Go from go-toolset
7+
shell: bash
8+
env:
9+
GO_TOOLSET_IMAGE: "registry.access.redhat.com/ubi9/go-toolset:1.26.3@sha256:d36470d5258da00f618b7aca9bdaab8e05134aa938bd6c42d9bd17d50ed45e76"
10+
run: |
11+
set -euo pipefail
12+
docker rm -f go-toolset 2>/dev/null || true
13+
docker create --name go-toolset "$GO_TOOLSET_IMAGE"
14+
docker cp go-toolset:/usr/lib/golang $HOME/go-toolset
15+
docker rm go-toolset
16+
echo "GOROOT=$HOME/go-toolset" >> $GITHUB_ENV
17+
echo "$HOME/go-toolset/bin" >> $GITHUB_PATH
18+
echo "$HOME/go/bin" >> $GITHUB_PATH
19+
- name: Verify Go installation
20+
shell: bash
21+
run: go version
22+
- name: Cache Go modules and build cache
23+
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
824
with:
9-
go-version-file: go.mod
25+
path: |
26+
~/go/pkg/mod
27+
~/.cache/go-build
28+
key: go-${{ runner.os }}-${{ hashFiles('**/go.sum') }}
29+
restore-keys: |
30+
go-${{ runner.os }}-

.github/actions/test-and-report/action.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ inputs:
100100
description: "Skip API access configuration and token generation (for tests that do not need a cluster)"
101101
required: false
102102
default: 'false'
103+
mlflow_enabled:
104+
description: "Whether MLflow is deployed and available for integration tests"
105+
required: false
106+
default: 'false'
103107

104108

105109
runs:
@@ -280,7 +284,7 @@ runs:
280284
DISABLE_TLS_CHECK='false'
281285
fi
282286
283-
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
287+
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
284288
continue-on-error: true
285289

286290
- name: Collect Pod logs in case of Test Failures
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#!/bin/bash
2+
# Copyright 2026 The Kubeflow Authors
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# https://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
# Purpose:
17+
# This script configures KFP to use an already-deployed MLflow instance for
18+
# MLflow E2E tests.
19+
#
20+
# CI helper: patch the KFP API server with plugins.mlflow, roll it out, and
21+
# port-forward the API server and MLflow so E2E tests can reach both.
22+
# It also exports workspace/auth variables used by MLflow test helpers.
23+
#
24+
# Usage: configure-mlflow.sh <KFP_NAMESPACE> <MLFLOW_NAMESPACE> <CONFIG_JSON_PATH>
25+
26+
set -e
27+
28+
KFP_NAMESPACE="${1:?KFP namespace required}"
29+
MLFLOW_NAMESPACE="${2:?MLflow namespace required}"
30+
CONFIG_JSON_PATH="${3:?Path to source config.json required}"
31+
32+
echo "Services in ${MLFLOW_NAMESPACE} namespace:"
33+
kubectl get svc -n "$MLFLOW_NAMESPACE" --no-headers
34+
MLFLOW_SVC=$(kubectl get svc -n "$MLFLOW_NAMESPACE" --no-headers -o custom-columns=":metadata.name" | grep -i mlflow | head -1)
35+
if [ -z "$MLFLOW_SVC" ]; then
36+
echo "ERROR: No service matching 'mlflow' found in namespace $MLFLOW_NAMESPACE"
37+
exit 1
38+
fi
39+
MLFLOW_PORT=$(kubectl get svc -n "$MLFLOW_NAMESPACE" "$MLFLOW_SVC" -o jsonpath='{.spec.ports[0].port}')
40+
MLFLOW_HOST="${MLFLOW_SVC}.${MLFLOW_NAMESPACE}.svc.cluster.local"
41+
MLFLOW_STATIC_PREFIX="/mlflow"
42+
MLFLOW_ENDPOINT="https://${MLFLOW_HOST}:${MLFLOW_PORT}${MLFLOW_STATIC_PREFIX}"
43+
echo "MLflow service: $MLFLOW_SVC port=$MLFLOW_PORT endpoint=$MLFLOW_ENDPOINT"
44+
45+
MLFLOW_PATCH=$(jq -n --arg endpoint "$MLFLOW_ENDPOINT" '{
46+
endpoint: $endpoint,
47+
tls: { insecureSkipVerify: true },
48+
settings: { workspacesEnabled: true }
49+
}')
50+
51+
jq --argjson mlflow "$MLFLOW_PATCH" '. + { plugins: { mlflow: $mlflow } }' \
52+
"$CONFIG_JSON_PATH" > /tmp/kfp-config.json
53+
54+
echo "Patched config.json plugins.mlflow:"
55+
jq '.plugins.mlflow' /tmp/kfp-config.json
56+
57+
kubectl create configmap kfp-mlflow-config -n "$KFP_NAMESPACE" \
58+
--from-file=config.json=/tmp/kfp-config.json --dry-run=client -o yaml | kubectl apply -f -
59+
kubectl patch deployment ml-pipeline -n "$KFP_NAMESPACE" --type=strategic -p \
60+
'{"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"}]}]}}}}'
61+
kubectl rollout status deployment/ml-pipeline -n "$KFP_NAMESPACE" --timeout=180s
62+
63+
pkill -f "kubectl port-forward.*ml-pipeline.*8888" || true
64+
sleep 2
65+
66+
C_DIR="${BASH_SOURCE%/*}"
67+
"${C_DIR}/forward-port.sh" "$KFP_NAMESPACE" ml-pipeline 8888 8888
68+
69+
for i in $(seq 1 12); do
70+
if curl -sf http://localhost:8888/apis/v1beta1/healthz > /dev/null 2>&1; then
71+
echo "API server is healthy on localhost:8888"
72+
break
73+
fi
74+
echo "Waiting for API server to become healthy... ($i/12)"
75+
sleep 5
76+
done
77+
curl -sf http://localhost:8888/apis/v1beta1/healthz > /dev/null 2>&1 || {
78+
echo "ERROR: API server not reachable at localhost:8888"
79+
exit 1
80+
}
81+
82+
SA_TOKEN=$(kubectl create token ml-pipeline -n "$KFP_NAMESPACE" --duration=1h 2>/dev/null || true)
83+
if [ -n "${GITHUB_ENV:-}" ]; then
84+
echo "MLFLOW_WORKSPACE=$KFP_NAMESPACE" >> "$GITHUB_ENV"
85+
# Later workflow steps need these to re-establish port-forward: background jobs from this step
86+
# are terminated when the step exits, so test-and-report starts kubectl port-forward again.
87+
echo "MLFLOW_PORT_FORWARD_NS=$MLFLOW_NAMESPACE" >> "$GITHUB_ENV"
88+
echo "MLFLOW_PORT_FORWARD_SVC=$MLFLOW_SVC" >> "$GITHUB_ENV"
89+
echo "MLFLOW_PORT_FORWARD_REMOTE_PORT=$MLFLOW_PORT" >> "$GITHUB_ENV"
90+
if [ -n "$SA_TOKEN" ]; then
91+
echo "MLFLOW_BEARER_TOKEN=$SA_TOKEN" >> "$GITHUB_ENV"
92+
echo "Exported MLFLOW_BEARER_TOKEN and MLFLOW_WORKSPACE for test helpers"
93+
else
94+
echo "WARNING: Could not create SA token; MLflow requests may be unauthenticated"
95+
echo "Exported MLFLOW_WORKSPACE only"
96+
fi
97+
fi
98+
99+
kubectl port-forward -n "$MLFLOW_NAMESPACE" "svc/$MLFLOW_SVC" "8080:$MLFLOW_PORT" &
100+
sleep 3
101+
102+
HEALTH_URL="https://localhost:8080${MLFLOW_STATIC_PREFIX}/health"
103+
CURL_HEADERS=(-H "X-MLflow-Workspace: $KFP_NAMESPACE")
104+
[ -n "$SA_TOKEN" ] && CURL_HEADERS+=(-H "Authorization: Bearer $SA_TOKEN")
105+
106+
STATUS=000
107+
for i in $(seq 1 30); do
108+
STATUS=$(curl -sk -o /dev/null -w '%{http_code}' --connect-timeout 5 --max-time 10 \
109+
"${CURL_HEADERS[@]}" "$HEALTH_URL" 2>/dev/null || echo "000")
110+
if [ "$STATUS" != "000" ] && [ "$STATUS" -lt 500 ] 2>/dev/null; then
111+
echo "MLflow backend is healthy on localhost:8080 (HTTPS, status=$STATUS)"
112+
break
113+
fi
114+
echo "Waiting for MLflow backend... ($i/30, status=$STATUS)"
115+
sleep 5
116+
done
117+
if [ "$STATUS" = "000" ] || { [ "$STATUS" -ge 500 ] 2>/dev/null; }; then
118+
echo "ERROR: MLflow backend not healthy after 30 attempts (last status=$STATUS)"
119+
exit 1
120+
fi

.github/workflows/add-ci-passed-label.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ permissions:
2121
pull-requests: write
2222
issues: write
2323

24+
2425
jobs:
2526
fetch_data:
2627
name: Fetch PR eligibility

.github/workflows/api-server-tests.yml

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ on:
5656
- '!**/OWNERS'
5757

5858
concurrency:
59-
group: api-tests-${{ github.event.pull_request.number || github.ref }}
59+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
6060
cancel-in-progress: true
6161

6262
jobs:
@@ -68,14 +68,23 @@ jobs:
6868
runs-on: ubuntu-latest
6969
strategy:
7070
matrix:
71-
k8s_version: [ "v1.34.0" ]
71+
k8s_version: [ "v1.35.0" ]
7272
cache_enabled: [ "true", "false" ]
7373
proxy: [ "false" ]
7474
argo_version: [ "v3.7.3", "v3.5.14", "v4.0.4" ]
7575
pipeline_store: [ "database" ]
7676
pod_to_pod_tls_enabled: [ "true" ]
7777
include:
78-
- k8s_version: "v1.29.2"
78+
- k8s_version: "v1.31.14"
79+
cache_enabled: "true"
80+
argo_version: "v3.7.3"
81+
- k8s_version: "v1.31.14"
82+
cache_enabled: "true"
83+
argo_version: "v3.5.14"
84+
- k8s_version: "v1.31.14"
85+
cache_enabled: "true"
86+
argo_version: "v4.0.4"
87+
- k8s_version: "v1.35.0"
7988
cache_enabled: "true"
8089
pod_to_pod_tls_enabled: "true"
8190
- k8s_version: "v1.29.2"
@@ -179,13 +188,13 @@ jobs:
179188
runs-on: ubuntu-latest
180189
strategy:
181190
matrix:
182-
k8s_version: [ "v1.34.0", "v1.29.2" ]
191+
k8s_version: [ "v1.35.0", "v1.31.14" ]
183192
cache_enabled: [ "true" ]
184193
uploadPipelinesWithKubernetesClient: [ "true", "false" ]
185194
pipeline_store: [ "kubernetes" ]
186195
pod_to_pod_tls_enabled: [ "true" ]
187196
include:
188-
- k8s_version: "v1.34.0"
197+
- k8s_version: "v1.35.0"
189198
cache_enabled: "true"
190199
pipeline_store: "kubernetes"
191200
pod_to_pod_tls_enabled: "false"
@@ -246,7 +255,7 @@ jobs:
246255
runs-on: ubuntu-latest
247256
strategy:
248257
matrix:
249-
k8s_version: [ "v1.34.0"]
258+
k8s_version: [ "v1.35.0"]
250259
cache_enabled: [ "true", "false" ]
251260
multi_user: [ "true" ]
252261
fail-fast: false # So that failure in 1 type of parameterized job does not cause other jobs to terminate prematurely

.github/workflows/backend-visualization.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ on:
1616
- '!**/*.md'
1717
- '!**/OWNERS'
1818

19+
20+
concurrency:
21+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
22+
cancel-in-progress: true
23+
1924
jobs:
2025
backend-visualization-test:
2126
runs-on: ubuntu-latest

.github/workflows/ci-checks.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ on:
1111
types: [completed]
1212
branches: [stable]
1313

14+
15+
concurrency:
16+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
17+
cancel-in-progress: true
18+
1419
jobs:
1520
check_ci_status:
1621
runs-on: ubuntu-latest

.github/workflows/compiler-tests.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ on:
3939
- '!**/*.md'
4040
- '!**/OWNERS'
4141

42+
43+
concurrency:
44+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
45+
cancel-in-progress: true
46+
4247
jobs:
4348
compiler-tests:
4449
runs-on: ubuntu-latest

.github/workflows/e2e-test-frontend.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,22 @@ on:
2121
- '!**/*.md'
2222
- '!**/OWNERS'
2323

24+
25+
concurrency:
26+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
27+
cancel-in-progress: true
28+
2429
jobs:
2530
build:
2631
uses: ./.github/workflows/image-builds.yml
2732

2833
frontend-integration-test:
2934
runs-on: ubuntu-latest
35+
timeout-minutes: 60
3036
needs: build
3137
strategy:
3238
matrix:
33-
k8s_version: [ "v1.29.2", "v1.34.0" ]
39+
k8s_version: [ "v1.31.14", "v1.35.0" ]
3440
pod_to_pod_tls_enabled: [ "true", "false" ]
3541
name: Frontend Integration Tests - K8s ${{ matrix.k8s_version }} pod_to_pod_tls_enabled=${{ matrix.pod_to_pod_tls_enabled }}
3642
steps:

0 commit comments

Comments
 (0)