Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
8250f57
feat: add deployment MinReady strategy
Xio-Shark May 19, 2026
0f63830
fix: correct MinReady batch-ready semantics and feature-gate fallback
Xio-Shark May 29, 2026
fb501fa
fix: align MinReady implementation with proposal review
Xio-Shark Jun 7, 2026
9565a58
fix: write BatchReleaseControlAnnotation and clean up finalize labels
Xio-Shark Jun 10, 2026
5c36a0b
fix: address MinReady review findings and repo audit issues
Xio-Shark Jun 11, 2026
db836f0
fix: address MinReady review follow-ups
Xio-Shark Jun 14, 2026
5be167f
fix: clear rollingUpdate for deployment recreate patch
Xio-Shark Jun 14, 2026
418b730
test: improve minready coverage
Xio-Shark Jun 14, 2026
0e1e775
fix: refresh minready annotations on continuous release
Xio-Shark Jun 14, 2026
6ca3928
test: add minready continuous e2e
Xio-Shark Jun 14, 2026
9079581
ci: enable minready e2e feature gate
Xio-Shark Jun 14, 2026
590470c
test: stabilize minready e2e setup
Xio-Shark Jun 15, 2026
b824834
test: stabilize deployment minready e2e
Xio-Shark Jun 15, 2026
1e7fa97
test: fix race condition in minready e2e TC7
Xio-Shark Jun 15, 2026
c762f82
test: fix TC7 race and organize minready e2e sub-package
Xio-Shark Jun 15, 2026
79a05d9
fix: address MinReady review follow-ups on status and annotations
Xio-Shark Jun 15, 2026
eb6eda2
fix: heal maxUnavailable drift while batch release waits paused
Xio-Shark Jun 15, 2026
9485d09
ci: retrigger workflows; fix TC7 flake and DCO sign-off
Xio-Shark Jun 16, 2026
6eae7ff
feat: MinReady sliding window + review follow-ups (P0-3, P1-7, P1-8)
Xio-Shark Jun 20, 2026
6661336
test: update integration assertion for P0-3 sliding window (want 10 t…
Xio-Shark Jun 24, 2026
f7168a0
fix: address MinReady review feedback
Xio-Shark Jun 27, 2026
95e8e80
test: stabilize minready TC7 resume observation
Xio-Shark Jun 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 113 additions & 0 deletions .github/workflows/e2e-deployment-minready-1.24.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
name: E2E-Deployment-MinReady-1.24

on:
push:
branches:
- master
- release-*
pull_request: {}
workflow_dispatch: {}

# Declare default permissions as read only.
permissions: read-all

env:
# Common versions
GO_VERSION: '1.20'
KIND_CLUSTER_NAME: 'ci-testing'
KIND_VERSION: 'v0.14.0'
KIND_IMAGE: 'kindest/node:v1.24.6'

jobs:

rollout:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
submodules: true
- name: Setup Go
uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0
with:
go-version: ${{ env.GO_VERSION }}
- name: Setup Kind Cluster
uses: helm/kind-action@a1b0e391336a6ee6713a0583f8c6240d70863de3 # v1.12.0
with:
node_image: ${{ env.KIND_IMAGE }}
cluster_name: ${{ env.KIND_CLUSTER_NAME }}
config: ./test/kind-conf.yaml
version: ${{ env.KIND_VERSION }}
- name: Build image
run: |
export IMAGE="openkruise/kruise-rollout:e2e-${GITHUB_RUN_ID}"
docker build --pull --no-cache . -t $IMAGE
kind load docker-image --name=${KIND_CLUSTER_NAME} $IMAGE || { echo >&2 "kind not installed or error loading image: $IMAGE"; exit 1; }
- name: Install Kruise
run: |
set -ex
kubectl cluster-info
make helm
helm repo add openkruise https://openkruise.github.io/charts/
helm repo update
helm install kruise openkruise/kruise --version 1.7.0
for ((i=1;i<10;i++));
do
set +e
PODS=$(kubectl get pod -n kruise-system | grep '1/1' | grep kruise-controller-manager | wc -l)
set -e
if [ "$PODS" -eq "2" ]; then
break
fi
sleep 3
done
set +e
PODS=$(kubectl get pod -n kruise-system | grep '1/1' | grep kruise-controller-manager | wc -l)
set -e
if [ "$PODS" -eq "2" ]; then
echo "Wait for kruise-manager ready successfully"
else
echo "Timeout to wait for kruise-manager ready"
exit 1
fi
- name: Install Kruise Rollout
run: |
set -ex
kubectl cluster-info
IMG=openkruise/kruise-rollout:e2e-${GITHUB_RUN_ID} ./scripts/deploy_kind.sh
# Enable MinReadySecondsStrategy feature gate.
kubectl patch deployment kruise-rollout-controller-manager -n kruise-rollout --type='json' \
-p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args/1", "value": "--feature-gates=AdvancedDeployment=true,MinReadySecondsStrategy=true"}]'
kubectl rollout status deployment/kruise-rollout-controller-manager -n kruise-rollout --timeout=120s
for ((i=1;i<10;i++));
do
set +e
PODS=$(kubectl get pod -n kruise-rollout | grep '1/1' | wc -l)
set -e
if [ "$PODS" -eq "1" ]; then
break
fi
sleep 3
done
set +e
PODS=$(kubectl get pod -n kruise-rollout | grep '1/1' | wc -l)
kubectl get node -o yaml
kubectl get all -n kruise-rollout -o yaml
set -e
if [ "$PODS" -eq "1" ]; then
echo "Wait for kruise-rollout ready successfully"
else
echo "Timeout to wait for kruise-rollout ready"
exit 1
fi
- name: Run E2E Tests For Deployment MinReadySeconds
run: |
export KUBECONFIG=/home/runner/.kube/config
make ginkgo
set +e
./bin/ginkgo -timeout 60m -v test/e2e/minready
retVal=$?
if [ "${retVal}" -ne 0 ];then
echo "test fail, dump kruise-rollout logs"
kubectl get pod -n kruise-rollout --no-headers | grep manager | awk '{print $1}' | xargs kubectl logs -n kruise-rollout
fi
exit $retVal
113 changes: 113 additions & 0 deletions .github/workflows/e2e-deployment-minready-1.26.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
name: E2E-Deployment-MinReady-1.26

on:
push:
branches:
- master
- release-*
pull_request: {}
workflow_dispatch: {}

# Declare default permissions as read only.
permissions: read-all

env:
# Common versions
GO_VERSION: '1.20'
KIND_VERSION: 'v0.18.0'
KIND_IMAGE: 'kindest/node:v1.26.3'
KIND_CLUSTER_NAME: 'ci-testing'

jobs:

rollout:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
submodules: true
- name: Setup Go
uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0
with:
go-version: ${{ env.GO_VERSION }}
- name: Setup Kind Cluster
uses: helm/kind-action@a1b0e391336a6ee6713a0583f8c6240d70863de3 # v1.12.0
with:
node_image: ${{ env.KIND_IMAGE }}
cluster_name: ${{ env.KIND_CLUSTER_NAME }}
config: ./test/kind-conf.yaml
version: ${{ env.KIND_VERSION }}
- name: Build image
run: |
export IMAGE="openkruise/kruise-rollout:e2e-${GITHUB_RUN_ID}"
docker build --pull --no-cache . -t $IMAGE
kind load docker-image --name=${KIND_CLUSTER_NAME} $IMAGE || { echo >&2 "kind not installed or error loading image: $IMAGE"; exit 1; }
- name: Install Kruise
run: |
set -ex
kubectl cluster-info
make helm
helm repo add openkruise https://openkruise.github.io/charts/
helm repo update
helm install kruise openkruise/kruise --version 1.7.0
for ((i=1;i<10;i++));
do
set +e
PODS=$(kubectl get pod -n kruise-system | grep '1/1' | grep kruise-controller-manager | wc -l)
set -e
if [ "$PODS" -eq "2" ]; then
break
fi
sleep 3
done
set +e
PODS=$(kubectl get pod -n kruise-system | grep '1/1' | grep kruise-controller-manager | wc -l)
set -e
if [ "$PODS" -eq "2" ]; then
echo "Wait for kruise-manager ready successfully"
else
echo "Timeout to wait for kruise-manager ready"
exit 1
fi
- name: Install Kruise Rollout
run: |
set -ex
kubectl cluster-info
IMG=openkruise/kruise-rollout:e2e-${GITHUB_RUN_ID} ./scripts/deploy_kind.sh
# Enable MinReadySecondsStrategy feature gate.
kubectl patch deployment kruise-rollout-controller-manager -n kruise-rollout --type='json' \
-p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args/1", "value": "--feature-gates=AdvancedDeployment=true,MinReadySecondsStrategy=true"}]'
kubectl rollout status deployment/kruise-rollout-controller-manager -n kruise-rollout --timeout=120s
for ((i=1;i<10;i++));
do
set +e
PODS=$(kubectl get pod -n kruise-rollout | grep '1/1' | wc -l)
set -e
if [ "$PODS" -eq "1" ]; then
break
fi
sleep 3
done
set +e
PODS=$(kubectl get pod -n kruise-rollout | grep '1/1' | wc -l)
kubectl get node -o yaml
kubectl get all -n kruise-rollout -o yaml
set -e
if [ "$PODS" -eq "1" ]; then
echo "Wait for kruise-rollout ready successfully"
else
echo "Timeout to wait for kruise-rollout ready"
exit 1
fi
- name: Run E2E Tests For Deployment MinReadySeconds
run: |
export KUBECONFIG=/home/runner/.kube/config
make ginkgo
set +e
./bin/ginkgo -timeout 60m -v test/e2e/minready
retVal=$?
if [ "${retVal}" -ne 0 ];then
echo "test fail, dump kruise-rollout logs"
kubectl get pod -n kruise-rollout --no-headers | grep manager | awk '{print $1}' | xargs kubectl logs -n kruise-rollout
fi
exit $retVal
113 changes: 113 additions & 0 deletions .github/workflows/e2e-deployment-minready-1.28.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
name: E2E-Deployment-MinReady-1.28

on:
push:
branches:
- master
- release-*
pull_request: {}
workflow_dispatch: {}

# Declare default permissions as read only.
permissions: read-all

env:
# Common versions
GO_VERSION: '1.20'
KIND_VERSION: 'v0.22.0'
KIND_IMAGE: 'kindest/node:v1.28.7'
KIND_CLUSTER_NAME: 'ci-testing'

jobs:

rollout:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
submodules: true
- name: Setup Go
uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0
with:
go-version: ${{ env.GO_VERSION }}
- name: Setup Kind Cluster
uses: helm/kind-action@a1b0e391336a6ee6713a0583f8c6240d70863de3 # v1.12.0
with:
node_image: ${{ env.KIND_IMAGE }}
cluster_name: ${{ env.KIND_CLUSTER_NAME }}
config: ./test/kind-conf.yaml
version: ${{ env.KIND_VERSION }}
- name: Build image
run: |
export IMAGE="openkruise/kruise-rollout:e2e-${GITHUB_RUN_ID}"
docker build --pull --no-cache . -t $IMAGE
kind load docker-image --name=${KIND_CLUSTER_NAME} $IMAGE || { echo >&2 "kind not installed or error loading image: $IMAGE"; exit 1; }
- name: Install Kruise
run: |
set -ex
kubectl cluster-info
make helm
helm repo add openkruise https://openkruise.github.io/charts/
helm repo update
helm install kruise openkruise/kruise --version 1.7.0
for ((i=1;i<10;i++));
do
set +e
PODS=$(kubectl get pod -n kruise-system | grep '1/1' | grep kruise-controller-manager | wc -l)
set -e
if [ "$PODS" -eq "2" ]; then
break
fi
sleep 3
done
set +e
PODS=$(kubectl get pod -n kruise-system | grep '1/1' | grep kruise-controller-manager | wc -l)
set -e
if [ "$PODS" -eq "2" ]; then
echo "Wait for kruise-manager ready successfully"
else
echo "Timeout to wait for kruise-manager ready"
exit 1
fi
- name: Install Kruise Rollout
run: |
set -ex
kubectl cluster-info
IMG=openkruise/kruise-rollout:e2e-${GITHUB_RUN_ID} ./scripts/deploy_kind.sh
# Enable MinReadySecondsStrategy feature gate.
kubectl patch deployment kruise-rollout-controller-manager -n kruise-rollout --type='json' \
-p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args/1", "value": "--feature-gates=AdvancedDeployment=true,MinReadySecondsStrategy=true"}]'
kubectl rollout status deployment/kruise-rollout-controller-manager -n kruise-rollout --timeout=120s
for ((i=1;i<10;i++));
do
set +e
PODS=$(kubectl get pod -n kruise-rollout | grep '1/1' | wc -l)
set -e
if [ "$PODS" -eq "1" ]; then
break
fi
sleep 3
done
set +e
PODS=$(kubectl get pod -n kruise-rollout | grep '1/1' | wc -l)
kubectl get node -o yaml
kubectl get all -n kruise-rollout -o yaml
set -e
if [ "$PODS" -eq "1" ]; then
echo "Wait for kruise-rollout ready successfully"
else
echo "Timeout to wait for kruise-rollout ready"
exit 1
fi
- name: Run E2E Tests For Deployment MinReadySeconds
run: |
export KUBECONFIG=/home/runner/.kube/config
make ginkgo
set +e
./bin/ginkgo -timeout 60m -v test/e2e/minready
retVal=$?
if [ "${retVal}" -ne 0 ];then
echo "test fail, dump kruise-rollout logs"
kubectl get pod -n kruise-rollout --no-headers | grep manager | awk '{print $1}' | xargs kubectl logs -n kruise-rollout
fi
exit $retVal
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Change Log

## Unreleased
### Key Features:
- Added the alpha Deployment `MinReadySeconds` rollout strategy, including API fields, feature gate, controller routing, observability, documentation, and tests.

## v0.6.2
### Bugfix:
- Fixed issue where partition deployments got stuck. ([#307](https://github.com/openkruise/rollouts/pull/307),[@AiRanthem](https://github.com/AiRanthem))
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile_multiarch
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Build the manager binary
ARG BASE_IMAGE=alpine
ARG BASE_IMAGE_VERION=3.17
FROM --platform=$BUILDPLATFORM golang:1.19-alpine3.17 AS builder
ARG BASE_IMAGE_VERION=3.19
FROM --platform=$BUILDPLATFORM golang:1.20.14-alpine3.19 AS builder

WORKDIR /workspace

Expand Down
2 changes: 1 addition & 1 deletion api/v1alpha1/deployment_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ func SetDefaultDeploymentStrategy(strategy *DeploymentStrategy) {
if strategy.RollingUpdate.MaxSurge == nil {
// Set MaxSurge as 25% by default
maxSurge := intstr.FromString("25%")
strategy.RollingUpdate.MaxUnavailable = &maxSurge
strategy.RollingUpdate.MaxSurge = &maxSurge
}

// Cannot allow maxSurge==0 && MaxUnavailable==0, otherwise, no pod can be updated when rolling update.
Expand Down
Loading
Loading