mirror of
https://github.com/Azure/k8s-deploy.git
synced 2026-06-26 22:59:27 +08:00
Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| de2e93acbf | |||
| 5dfb05d024 | |||
| 68cb22352a | |||
| 67def0664b | |||
| 76046dd320 | |||
| 8b4e45d97b | |||
| 2c1455e4a0 | |||
| c53a656438 | |||
| 312cb89665 | |||
| c171eee779 | |||
| adfb4aae0b | |||
| 0a30921563 | |||
| 3fc12aea57 | |||
| 8e9d5d375a | |||
| 824feb5b2b | |||
| c51f8ea3d8 | |||
| 6c8a34f5c5 | |||
| 74f99ab42e | |||
| 09a8725f44 | |||
| d9f52cdb50 | |||
| bc5b13e4ce | |||
| 291044bf75 | |||
| 059e5441ef | |||
| bb318e252f | |||
| 3d107b044d | |||
| d1acc1a47b | |||
| bf768b3109 | |||
| d3b3950a9c | |||
| 4b49af4189 | |||
| 0c838316d4 | |||
| e5725dfe9f | |||
| b34f3e7f18 | |||
| 10d196d204 |
@@ -0,0 +1,18 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
groups:
|
||||||
|
actions:
|
||||||
|
patterns:
|
||||||
|
- '*'
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: .github/workflows
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
groups:
|
||||||
|
actions:
|
||||||
|
patterns:
|
||||||
|
- '*'
|
||||||
@@ -16,7 +16,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 #v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
|
||||||
with:
|
with:
|
||||||
# We must fetch at least the immediate parents so that if this is
|
# We must fetch at least the immediate parents so that if this is
|
||||||
# a pull request then we can checkout the head.
|
# a pull request then we can checkout the head.
|
||||||
@@ -24,7 +24,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@05963f47d870e2cb19a537396c1f668a348c7d8f #v3.24.8
|
uses: github/codeql-action/init@45775bd8235c68ba998cffa5171334d58593da47 #v3.28.15
|
||||||
# Override language selection by uncommenting this and choosing your languages
|
# Override language selection by uncommenting this and choosing your languages
|
||||||
# with:
|
# with:
|
||||||
# languages: go, javascript, csharp, python, cpp, java
|
# languages: go, javascript, csharp, python, cpp, java
|
||||||
@@ -32,7 +32,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@05963f47d870e2cb19a537396c1f668a348c7d8f #v3.24.8
|
uses: github/codeql-action/autobuild@45775bd8235c68ba998cffa5171334d58593da47 #v3.28.15
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 https://git.io/JvXDl
|
# 📚 https://git.io/JvXDl
|
||||||
@@ -46,4 +46,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@05963f47d870e2cb19a537396c1f668a348c7d8f #v3.24.8
|
uses: github/codeql-action/analyze@45775bd8235c68ba998cffa5171334d58593da47 #v3.28.15
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ jobs:
|
|||||||
|
|
||||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v3
|
- uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
|
||||||
name: Setting issue as idle
|
name: Setting issue as idle
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -24,7 +24,7 @@ jobs:
|
|||||||
operations-per-run: 100
|
operations-per-run: 100
|
||||||
exempt-issue-labels: 'backlog'
|
exempt-issue-labels: 'backlog'
|
||||||
|
|
||||||
- uses: actions/stale@v3
|
- uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
|
||||||
name: Setting PR as idle
|
name: Setting PR as idle
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
- name: install deps
|
||||||
|
run: npm install
|
||||||
|
|
||||||
- name: Enforce Prettier
|
- name: Enforce Prettier
|
||||||
uses: actionsx/prettier@v2
|
run: npm run format-check
|
||||||
with:
|
|
||||||
args: --check .
|
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-integration-test:
|
run-integration-test:
|
||||||
name: Run Minikube Integration Tests
|
name: Run Minikube Integration Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
KUBECONFIG: /home/runner/.kube/config
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
NAMESPACE: test-${{ github.run_id }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -31,22 +31,22 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: ncc build src/run.ts -o lib
|
run: ncc build src/run.ts -o lib
|
||||||
|
|
||||||
- uses: Azure/setup-kubectl@v3
|
- uses: Azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
|
||||||
name: Install Kubectl
|
name: Install Kubectl
|
||||||
|
|
||||||
- id: setup-minikube
|
- id: setup-minikube
|
||||||
name: Setup Minikube
|
name: Setup Minikube
|
||||||
uses: medyagh/setup-minikube@latest
|
uses: medyagh/setup-minikube@cea33675329b799adccc9526aa5daccc26cd5052 # v0.0.19
|
||||||
with:
|
with:
|
||||||
minikube-version: 1.24.0
|
minikube-version: 1.34.0
|
||||||
kubernetes-version: 1.22.3
|
kubernetes-version: 1.31.0
|
||||||
driver: 'none'
|
driver: 'none'
|
||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
|
|
||||||
- name: Create namespace to run tests
|
- name: Create namespace to run tests
|
||||||
run: kubectl create ns ${{ env.NAMESPACE }}
|
run: kubectl create ns ${{ env.NAMESPACE }}
|
||||||
|
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # 5.5.0
|
||||||
name: Install Python
|
name: Install Python
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
python-version: '3.x'
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-integration-test:
|
run-integration-test:
|
||||||
name: Run Minikube Integration Tests
|
name: Run Minikube Integration Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
KUBECONFIG: /home/runner/.kube/config
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
NAMESPACE: test-${{ github.run_id }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -31,22 +31,22 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: ncc build src/run.ts -o lib
|
run: ncc build src/run.ts -o lib
|
||||||
|
|
||||||
- uses: Azure/setup-kubectl@v3
|
- uses: Azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
|
||||||
name: Install Kubectl
|
name: Install Kubectl
|
||||||
|
|
||||||
- id: setup-minikube
|
- id: setup-minikube
|
||||||
name: Setup Minikube
|
name: Setup Minikube
|
||||||
uses: medyagh/setup-minikube@latest
|
uses: medyagh/setup-minikube@cea33675329b799adccc9526aa5daccc26cd5052 # v0.0.19
|
||||||
with:
|
with:
|
||||||
minikube-version: 1.31.2
|
minikube-version: 1.34.0
|
||||||
kubernetes-version: 1.22.3
|
kubernetes-version: 1.31.0
|
||||||
driver: 'none'
|
driver: 'none'
|
||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
|
|
||||||
- name: Create namespace to run tests
|
- name: Create namespace to run tests
|
||||||
run: kubectl create ns ${{ env.NAMESPACE }}
|
run: kubectl create ns ${{ env.NAMESPACE }}
|
||||||
|
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # 5.5.0
|
||||||
name: Install Python
|
name: Install Python
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
python-version: '3.x'
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-integration-test:
|
run-integration-test:
|
||||||
name: Run Minikube Integration Tests
|
name: Run Minikube Integration Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
KUBECONFIG: /home/runner/.kube/config
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
NAMESPACE: test-${{ github.run_id }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -31,22 +31,22 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: ncc build src/run.ts -o lib
|
run: ncc build src/run.ts -o lib
|
||||||
|
|
||||||
- uses: Azure/setup-kubectl@v3
|
- uses: Azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
|
||||||
name: Install Kubectl
|
name: Install Kubectl
|
||||||
|
|
||||||
- id: setup-minikube
|
- id: setup-minikube
|
||||||
name: Setup Minikube
|
name: Setup Minikube
|
||||||
uses: medyagh/setup-minikube@latest
|
uses: medyagh/setup-minikube@cea33675329b799adccc9526aa5daccc26cd5052 # v0.0.19
|
||||||
with:
|
with:
|
||||||
minikube-version: 1.31.2
|
minikube-version: 1.34.0
|
||||||
kubernetes-version: 1.22.3
|
kubernetes-version: 1.31.0
|
||||||
driver: 'none'
|
driver: 'none'
|
||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
|
|
||||||
- name: Create namespace to run tests
|
- name: Create namespace to run tests
|
||||||
run: kubectl create ns ${{ env.NAMESPACE }}
|
run: kubectl create ns ${{ env.NAMESPACE }}
|
||||||
|
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # 5.5.0
|
||||||
name: Install Python
|
name: Install Python
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
python-version: '3.x'
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-integration-test:
|
run-integration-test:
|
||||||
name: Run Minikube Integration Tests
|
name: Run Minikube Integration Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
KUBECONFIG: /home/runner/.kube/config
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
NAMESPACE: test-${{ github.run_id }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -31,23 +31,24 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: ncc build src/run.ts -o lib
|
run: ncc build src/run.ts -o lib
|
||||||
|
|
||||||
- uses: Azure/setup-kubectl@v3
|
- uses: Azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
|
||||||
name: Install Kubectl
|
name: Install Kubectl
|
||||||
|
|
||||||
- id: setup-minikube
|
- id: setup-minikube
|
||||||
name: Setup Minikube
|
name: Setup Minikube
|
||||||
uses: medyagh/setup-minikube@latest
|
uses: medyagh/setup-minikube@cea33675329b799adccc9526aa5daccc26cd5052 # v0.0.19
|
||||||
with:
|
with:
|
||||||
minikube-version: 1.24.0
|
minikube-version: 1.34.0
|
||||||
kubernetes-version: 1.22.3
|
kubernetes-version: 1.31.0
|
||||||
driver: 'none'
|
driver: 'none'
|
||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
|
|
||||||
- name: Install linkerd and add controlplane to cluster
|
- name: Install linkerd and add controlplane to cluster
|
||||||
run: |
|
run: |
|
||||||
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
|
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install-edge | sh
|
||||||
curl -sL https://linkerd.github.io/linkerd-smi/install | sh
|
|
||||||
export PATH=$PATH:/home/runner/.linkerd2/bin
|
export PATH=$PATH:/home/runner/.linkerd2/bin
|
||||||
|
curl -sL https://linkerd.github.io/linkerd-smi/install | sh
|
||||||
|
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
|
||||||
|
|
||||||
linkerd install --crds | kubectl apply -f -
|
linkerd install --crds | kubectl apply -f -
|
||||||
linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -
|
linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -
|
||||||
@@ -56,7 +57,7 @@ jobs:
|
|||||||
- name: Create namespace to run tests
|
- name: Create namespace to run tests
|
||||||
run: kubectl create ns ${{ env.NAMESPACE }}
|
run: kubectl create ns ${{ env.NAMESPACE }}
|
||||||
|
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # 5.5.0
|
||||||
name: Install Python
|
name: Install Python
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
python-version: '3.x'
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-integration-test:
|
run-integration-test:
|
||||||
name: Run Minikube Integration Tests
|
name: Run Minikube Integration Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
KUBECONFIG: /home/runner/.kube/config
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
NAMESPACE: test-${{ github.run_id }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -31,22 +31,22 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: ncc build src/run.ts -o lib
|
run: ncc build src/run.ts -o lib
|
||||||
|
|
||||||
- uses: Azure/setup-kubectl@v3
|
- uses: Azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
|
||||||
name: Install Kubectl
|
name: Install Kubectl
|
||||||
|
|
||||||
- id: setup-minikube
|
- id: setup-minikube
|
||||||
name: Setup Minikube
|
name: Setup Minikube
|
||||||
uses: medyagh/setup-minikube@latest
|
uses: medyagh/setup-minikube@cea33675329b799adccc9526aa5daccc26cd5052 # v0.0.19
|
||||||
with:
|
with:
|
||||||
minikube-version: 1.24.0
|
minikube-version: 1.34.0
|
||||||
kubernetes-version: 1.22.3
|
kubernetes-version: 1.31.0
|
||||||
driver: 'none'
|
driver: 'none'
|
||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
|
|
||||||
- name: Create namespace to run tests
|
- name: Create namespace to run tests
|
||||||
run: kubectl create ns ${{ env.NAMESPACE }}
|
run: kubectl create ns ${{ env.NAMESPACE }}
|
||||||
|
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # 5.5.0
|
||||||
name: Install Python
|
name: Install Python
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
python-version: '3.x'
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-integration-test:
|
run-integration-test:
|
||||||
name: Run Minikube Integration Tests
|
name: Run Minikube Integration Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
KUBECONFIG: /home/runner/.kube/config
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
NAMESPACE: test-${{ github.run_id }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -31,23 +31,21 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: ncc build src/run.ts -o lib
|
run: ncc build src/run.ts -o lib
|
||||||
|
|
||||||
- uses: Azure/setup-kubectl@v3
|
- uses: Azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
|
||||||
name: Install Kubectl
|
name: Install Kubectl
|
||||||
|
|
||||||
- id: setup-minikube
|
- id: setup-minikube
|
||||||
name: Setup Minikube
|
name: Setup Minikube
|
||||||
uses: medyagh/setup-minikube@latest
|
uses: medyagh/setup-minikube@cea33675329b799adccc9526aa5daccc26cd5052 # v0.0.19
|
||||||
with:
|
with:
|
||||||
minikube-version: 1.24.0
|
minikube-version: 1.34.0
|
||||||
kubernetes-version: 1.22.3
|
kubernetes-version: 1.31.0
|
||||||
driver: 'none'
|
driver: 'none'
|
||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install-edge | sh
|
||||||
- name: Install linkerd and add controlplane to cluster
|
|
||||||
run: |
|
|
||||||
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
|
|
||||||
curl -sL https://linkerd.github.io/linkerd-smi/install | sh
|
|
||||||
export PATH=$PATH:/home/runner/.linkerd2/bin
|
export PATH=$PATH:/home/runner/.linkerd2/bin
|
||||||
|
curl -sL https://linkerd.github.io/linkerd-smi/install | sh
|
||||||
|
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
|
||||||
|
|
||||||
linkerd install --crds | kubectl apply -f -
|
linkerd install --crds | kubectl apply -f -
|
||||||
linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -
|
linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -
|
||||||
@@ -56,7 +54,7 @@ jobs:
|
|||||||
- name: Create namespace to run tests
|
- name: Create namespace to run tests
|
||||||
run: kubectl create ns ${{ env.NAMESPACE }}
|
run: kubectl create ns ${{ env.NAMESPACE }}
|
||||||
|
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # 5.5.0
|
||||||
name: Install Python
|
name: Install Python
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
python-version: '3.x'
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-integration-test:
|
run-integration-test:
|
||||||
name: Run Minikube Integration Tests
|
name: Run Minikube Integration Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
KUBECONFIG: /home/runner/.kube/config
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
NAMESPACE: test-${{ github.run_id }}
|
||||||
@@ -19,7 +19,7 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
id-token: write
|
id-token: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -30,13 +30,13 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: ncc build src/run.ts -o lib
|
run: ncc build src/run.ts -o lib
|
||||||
- name: Azure login
|
- name: Azure login
|
||||||
uses: azure/login@v1.4.3
|
uses: azure/login@v2.3.0
|
||||||
with:
|
with:
|
||||||
client-id: ${{ secrets.AZURE_CLIENT_ID }}
|
client-id: ${{ secrets.AZURE_CLIENT_ID }}
|
||||||
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
|
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
|
||||||
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
|
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
|
||||||
|
|
||||||
- uses: Azure/setup-kubectl@v3
|
- uses: Azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
|
||||||
name: Install Kubectl
|
name: Install Kubectl
|
||||||
|
|
||||||
- name: Create private AKS cluster and set context
|
- name: Create private AKS cluster and set context
|
||||||
@@ -51,7 +51,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
az aks command invoke --resource-group ${{ env.NAMESPACE }} --name ${{ env.NAMESPACE }} --command "kubectl create ns ${{ env.NAMESPACE }}"
|
az aks command invoke --resource-group ${{ env.NAMESPACE }} --name ${{ env.NAMESPACE }} --command "kubectl create ns ${{ env.NAMESPACE }}"
|
||||||
|
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # 5.5.0
|
||||||
name: Install Python
|
name: Install Python
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
python-version: '3.x'
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-integration-test:
|
run-integration-test:
|
||||||
name: Run Minikube Integration Tests
|
name: Run Minikube Integration Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
KUBECONFIG: /home/runner/.kube/config
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
NAMESPACE: test-${{ github.run_id }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -31,22 +31,22 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: ncc build src/run.ts -o lib
|
run: ncc build src/run.ts -o lib
|
||||||
|
|
||||||
- uses: Azure/setup-kubectl@v3
|
- uses: Azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
|
||||||
name: Install Kubectl
|
name: Install Kubectl
|
||||||
|
|
||||||
- id: setup-minikube
|
- id: setup-minikube
|
||||||
name: Setup Minikube
|
name: Setup Minikube
|
||||||
uses: medyagh/setup-minikube@latest
|
uses: medyagh/setup-minikube@cea33675329b799adccc9526aa5daccc26cd5052 # v0.0.19
|
||||||
with:
|
with:
|
||||||
minikube-version: 1.24.0
|
minikube-version: 1.34.0
|
||||||
kubernetes-version: 1.22.3
|
kubernetes-version: 1.31.0
|
||||||
driver: 'none'
|
driver: 'none'
|
||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
|
|
||||||
- name: Create namespace to run tests
|
- name: Create namespace to run tests
|
||||||
run: kubectl create ns ${{ env.NAMESPACE }}
|
run: kubectl create ns ${{ env.NAMESPACE }}
|
||||||
|
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # 5.5.0
|
||||||
name: Install Python
|
name: Install Python
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
python-version: '3.x'
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
name: Run Unit Tests
|
name: Run Unit Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
- run: |
|
- run: |
|
||||||
npm install
|
npm install
|
||||||
npm test
|
npm test
|
||||||
|
|||||||
@@ -2,6 +2,5 @@ node_modules
|
|||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.idea
|
.idea
|
||||||
lib/
|
|
||||||
|
|
||||||
coverage/
|
coverage/
|
||||||
@@ -1,5 +1,17 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [5.0.2] - 2025-04-15
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- #396 Update new resource-type input for action
|
||||||
|
|
||||||
|
## [5.0.1] - 2024-03-12
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- #356 Add fleet support
|
||||||
|
|
||||||
## [5.0.0] - 2024-03-12
|
## [5.0.0] - 2024-03-12
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
@@ -125,6 +125,10 @@ Following are the key capabilities of this action:
|
|||||||
<td>skip-tls-verify</br></br>(Optional)</td>
|
<td>skip-tls-verify</br></br>(Optional)</td>
|
||||||
<td>Acceptable values: true/false</br>Default value: false</br>True if the insecure-skip-tls-verify option should be used</td>
|
<td>Acceptable values: true/false</br>Default value: false</br>True if the insecure-skip-tls-verify option should be used</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>resource-type (Optional)</td>
|
||||||
|
<td>Acceptable values: `Microsoft.ContainerService/managedClusters` (default), 'Microsoft.ContainerService/fleets'</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
## Usage Examples
|
## Usage Examples
|
||||||
|
|||||||
@@ -80,6 +80,10 @@ inputs:
|
|||||||
skip-tls-verify:
|
skip-tls-verify:
|
||||||
description: True if the insecure-skip-tls-verify option should be used. Input should be 'true' or 'false'.
|
description: True if the insecure-skip-tls-verify option should be used. Input should be 'true' or 'false'.
|
||||||
default: false
|
default: false
|
||||||
|
resource-type:
|
||||||
|
description: Either Microsoft.ContainerService/managedClusters or Microsoft.ContainerService/fleets'.
|
||||||
|
required: false
|
||||||
|
default: 'Microsoft.ContainerService/managedClusters'
|
||||||
|
|
||||||
branding:
|
branding:
|
||||||
color: 'green'
|
color: 'green'
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
presets: [
|
||||||
|
['@babel/preset-env', {targets: {node: 'current'}}],
|
||||||
|
'@babel/preset-typescript'
|
||||||
|
]
|
||||||
|
}
|
||||||
+11
-2
@@ -1,11 +1,20 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
clearMocks: true,
|
|
||||||
moduleFileExtensions: ['js', 'ts'],
|
moduleFileExtensions: ['js', 'ts'],
|
||||||
testEnvironment: 'node',
|
testEnvironment: 'node',
|
||||||
testMatch: ['**/*.test.ts'],
|
testMatch: ['**/*.test.ts'],
|
||||||
transform: {
|
transform: {
|
||||||
'^.+\\.ts$': 'ts-jest'
|
'\\.[jt]sx?$': 'babel-jest'
|
||||||
},
|
},
|
||||||
|
transformIgnorePatterns: [
|
||||||
|
'node_modules/(?!' +
|
||||||
|
[
|
||||||
|
'@octokit',
|
||||||
|
'universal-user-agent',
|
||||||
|
'before-after-hook',
|
||||||
|
'minimist'
|
||||||
|
].join('|') +
|
||||||
|
')'
|
||||||
|
],
|
||||||
verbose: true,
|
verbose: true,
|
||||||
testTimeout: 9000
|
testTimeout: 9000
|
||||||
}
|
}
|
||||||
|
|||||||
+17984
File diff suppressed because it is too large
Load Diff
Generated
+2966
-1821
File diff suppressed because it is too large
Load Diff
+17
-14
@@ -12,24 +12,27 @@
|
|||||||
"format-check": "prettier --check ."
|
"format-check": "prettier --check ."
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.11.1",
|
||||||
"@actions/exec": "^1.0.0",
|
"@actions/exec": "^1.0.0",
|
||||||
"@actions/io": "^1.0.0",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "1.1.2",
|
"@actions/tool-cache": "2.0.2",
|
||||||
"@octokit/core": "^3.5.1",
|
"@babel/preset-env": "^7.26.9",
|
||||||
"@octokit/plugin-retry": "^3.0.9",
|
"@babel/preset-typescript": "^7.27.0",
|
||||||
"@types/minipass": "^3.1.2",
|
"@octokit/core": "^6.1.4",
|
||||||
"js-yaml": "3.13.1",
|
"@octokit/plugin-retry": "^7.2.0",
|
||||||
|
"@types/minipass": "^3.3.5",
|
||||||
|
"js-yaml": "4.1.0",
|
||||||
"minimist": "^1.2.8"
|
"minimist": "^1.2.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^26.0.0",
|
"@types/jest": "^29.5.14",
|
||||||
"@types/js-yaml": "^3.12.7",
|
"@types/js-yaml": "^4.0.9",
|
||||||
"@types/node": "^12.20.41",
|
"@types/minimist": "^1.2.5",
|
||||||
"@vercel/ncc": "^0.36.1",
|
"@types/node": "^22.14.0",
|
||||||
|
"@vercel/ncc": "^0.38.3",
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.7.0",
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^3.5.3",
|
||||||
"ts-jest": "^29.2.3",
|
"ts-jest": "^29.3.1",
|
||||||
"typescript": "5.5.4"
|
"typescript": "5.8.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-1
@@ -13,6 +13,12 @@ import {
|
|||||||
} from '../strategyHelpers/deploymentHelper'
|
} from '../strategyHelpers/deploymentHelper'
|
||||||
import {DeploymentStrategy} from '../types/deploymentStrategy'
|
import {DeploymentStrategy} from '../types/deploymentStrategy'
|
||||||
import {parseTrafficSplitMethod} from '../types/trafficSplitMethod'
|
import {parseTrafficSplitMethod} from '../types/trafficSplitMethod'
|
||||||
|
export const ResourceTypeManagedCluster =
|
||||||
|
'Microsoft.ContainerService/managedClusters'
|
||||||
|
export const ResourceTypeFleet = 'Microsoft.ContainerService/fleets'
|
||||||
|
export type ClusterType =
|
||||||
|
| typeof ResourceTypeManagedCluster
|
||||||
|
| typeof ResourceTypeFleet
|
||||||
|
|
||||||
export async function deploy(
|
export async function deploy(
|
||||||
kubectl: Kubectl,
|
kubectl: Kubectl,
|
||||||
@@ -39,13 +45,25 @@ export async function deploy(
|
|||||||
|
|
||||||
// check manifest stability
|
// check manifest stability
|
||||||
core.startGroup('Checking manifest stability')
|
core.startGroup('Checking manifest stability')
|
||||||
|
const resourceTypeInput =
|
||||||
|
core.getInput('resource-type') || ResourceTypeManagedCluster
|
||||||
const resourceTypes: Resource[] = getResources(
|
const resourceTypes: Resource[] = getResources(
|
||||||
deployedManifestFiles,
|
deployedManifestFiles,
|
||||||
models.DEPLOYMENT_TYPES.concat([
|
models.DEPLOYMENT_TYPES.concat([
|
||||||
KubernetesConstants.DiscoveryAndLoadBalancerResource.SERVICE
|
KubernetesConstants.DiscoveryAndLoadBalancerResource.SERVICE
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
await checkManifestStability(kubectl, resourceTypes)
|
|
||||||
|
if (
|
||||||
|
resourceTypeInput !== ResourceTypeManagedCluster &&
|
||||||
|
resourceTypeInput !== ResourceTypeFleet
|
||||||
|
) {
|
||||||
|
let errMsg = `Invalid resource type: ${resourceTypeInput}. Supported resource types are: ${ResourceTypeManagedCluster} (default), ${ResourceTypeFleet}`
|
||||||
|
core.setFailed(errMsg)
|
||||||
|
throw new Error(errMsg)
|
||||||
|
}
|
||||||
|
|
||||||
|
await checkManifestStability(kubectl, resourceTypes, resourceTypeInput)
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
|
|
||||||
// print ingresses
|
// print ingresses
|
||||||
|
|||||||
+16
-1
@@ -38,6 +38,7 @@ import {
|
|||||||
TrafficSplitMethod
|
TrafficSplitMethod
|
||||||
} from '../types/trafficSplitMethod'
|
} from '../types/trafficSplitMethod'
|
||||||
import {parseRouteStrategy, RouteStrategy} from '../types/routeStrategy'
|
import {parseRouteStrategy, RouteStrategy} from '../types/routeStrategy'
|
||||||
|
import {ResourceTypeFleet, ResourceTypeManagedCluster} from './deploy'
|
||||||
|
|
||||||
export async function promote(
|
export async function promote(
|
||||||
kubectl: Kubectl,
|
kubectl: Kubectl,
|
||||||
@@ -166,6 +167,8 @@ async function promoteBlueGreen(kubectl: Kubectl, manifests: string[]) {
|
|||||||
|
|
||||||
// checking stability of newly created deployments
|
// checking stability of newly created deployments
|
||||||
core.startGroup('Checking manifest stability')
|
core.startGroup('Checking manifest stability')
|
||||||
|
const resourceType =
|
||||||
|
core.getInput('resource-type') || ResourceTypeManagedCluster
|
||||||
const deployedManifestFiles = deployResult.manifestFiles
|
const deployedManifestFiles = deployResult.manifestFiles
|
||||||
const resources: Resource[] = getResources(
|
const resources: Resource[] = getResources(
|
||||||
deployedManifestFiles,
|
deployedManifestFiles,
|
||||||
@@ -173,7 +176,19 @@ async function promoteBlueGreen(kubectl: Kubectl, manifests: string[]) {
|
|||||||
models.DiscoveryAndLoadBalancerResource.SERVICE
|
models.DiscoveryAndLoadBalancerResource.SERVICE
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
await KubernetesManifestUtility.checkManifestStability(kubectl, resources)
|
if (
|
||||||
|
resourceType !== ResourceTypeManagedCluster &&
|
||||||
|
resourceType !== ResourceTypeFleet
|
||||||
|
) {
|
||||||
|
const errMsg = `Invalid resource type: ${resourceType}. Supported resource types are: ${ResourceTypeManagedCluster} (default), fleet`
|
||||||
|
core.setFailed(errMsg)
|
||||||
|
throw new Error(errMsg)
|
||||||
|
}
|
||||||
|
await KubernetesManifestUtility.checkManifestStability(
|
||||||
|
kubectl,
|
||||||
|
resources,
|
||||||
|
resourceType
|
||||||
|
)
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
|
|
||||||
core.startGroup(
|
core.startGroup(
|
||||||
|
|||||||
+2
-3
@@ -26,9 +26,8 @@ export async function run() {
|
|||||||
.map((manifest) => manifest.trim()) // remove surrounding whitespace
|
.map((manifest) => manifest.trim()) // remove surrounding whitespace
|
||||||
.filter((manifest) => manifest.length > 0) // remove any blanks
|
.filter((manifest) => manifest.length > 0) // remove any blanks
|
||||||
|
|
||||||
const fullManifestFilePaths = await getFilesFromDirectoriesAndURLs(
|
const fullManifestFilePaths =
|
||||||
manifestFilePaths
|
await getFilesFromDirectoriesAndURLs(manifestFilePaths)
|
||||||
)
|
|
||||||
const kubectlPath = await getKubectlPath()
|
const kubectlPath = await getKubectlPath()
|
||||||
const namespace = core.getInput('namespace') || 'default'
|
const namespace = core.getInput('namespace') || 'default'
|
||||||
const isPrivateCluster =
|
const isPrivateCluster =
|
||||||
|
|||||||
@@ -77,11 +77,11 @@ export function getManifestObjects(filePaths: string[]): BlueGreenManifests {
|
|||||||
// Manifest objects per type. All resources should be parsed and
|
// Manifest objects per type. All resources should be parsed and
|
||||||
// organized before we can check if services are “routed” or not.
|
// organized before we can check if services are “routed” or not.
|
||||||
filePaths.forEach((filePath: string) => {
|
filePaths.forEach((filePath: string) => {
|
||||||
|
try {
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
const fileContents = fs.readFileSync(filePath).toString()
|
||||||
yaml.safeLoadAll(fileContents, (inputObject) => {
|
yaml.loadAll(fileContents, (inputObject: any) => {
|
||||||
if (!!inputObject) {
|
if (!!inputObject) {
|
||||||
const kind = inputObject.kind
|
const kind = inputObject.kind
|
||||||
|
|
||||||
if (isDeploymentEntity(kind)) {
|
if (isDeploymentEntity(kind)) {
|
||||||
deploymentEntityList.push(inputObject)
|
deploymentEntityList.push(inputObject)
|
||||||
} else if (isServiceEntity(kind)) {
|
} else if (isServiceEntity(kind)) {
|
||||||
@@ -93,6 +93,10 @@ export function getManifestObjects(filePaths: string[]): BlueGreenManifests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.error(`Error processing file ${filePath}: ${error.message}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
serviceEntityList.forEach((inputObject: any) => {
|
serviceEntityList.forEach((inputObject: any) => {
|
||||||
|
|||||||
@@ -77,9 +77,8 @@ export async function createTrafficSplitObject(
|
|||||||
): Promise<TrafficSplitObject> {
|
): Promise<TrafficSplitObject> {
|
||||||
// cache traffic split api version
|
// cache traffic split api version
|
||||||
if (!trafficSplitAPIVersion)
|
if (!trafficSplitAPIVersion)
|
||||||
trafficSplitAPIVersion = await kubectlUtils.getTrafficSplitAPIVersion(
|
trafficSplitAPIVersion =
|
||||||
kubectl
|
await kubectlUtils.getTrafficSplitAPIVersion(kubectl)
|
||||||
)
|
|
||||||
|
|
||||||
// retrieve annotations for TS object
|
// retrieve annotations for TS object
|
||||||
const annotations = inputAnnotations
|
const annotations = inputAnnotations
|
||||||
|
|||||||
@@ -211,13 +211,15 @@ async function cleanUpCanary(
|
|||||||
const deletedFiles: string[] = []
|
const deletedFiles: string[] = []
|
||||||
|
|
||||||
for (const filePath of files) {
|
for (const filePath of files) {
|
||||||
|
try {
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
const fileContents = fs.readFileSync(filePath).toString()
|
||||||
|
|
||||||
const parsedYaml = yaml.safeLoadAll(fileContents)
|
const parsedYaml: any[] = yaml.loadAll(fileContents)
|
||||||
for (const inputObject of parsedYaml) {
|
for (const inputObject of parsedYaml) {
|
||||||
const name = inputObject.metadata.name
|
const name = inputObject.metadata.name
|
||||||
const kind = inputObject.kind
|
const kind = inputObject.kind
|
||||||
const namespace: string | undefined = inputObject?.metadata?.namespace
|
const namespace: string | undefined =
|
||||||
|
inputObject?.metadata?.namespace
|
||||||
|
|
||||||
if (
|
if (
|
||||||
isDeploymentEntity(kind) ||
|
isDeploymentEntity(kind) ||
|
||||||
@@ -231,6 +233,10 @@ async function cleanUpCanary(
|
|||||||
await deleteObject(kind, baselineObjectName, namespace)
|
await deleteObject(kind, baselineObjectName, namespace)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
core.error(`Failed to process file ${filePath}: ${error.message}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return deletedFiles
|
return deletedFiles
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import * as canaryDeploymentHelper from './canaryHelper'
|
|||||||
import {isDeploymentEntity} from '../../types/kubernetesTypes'
|
import {isDeploymentEntity} from '../../types/kubernetesTypes'
|
||||||
import {getReplicaCount} from '../../utilities/manifestUpdateUtils'
|
import {getReplicaCount} from '../../utilities/manifestUpdateUtils'
|
||||||
import {DeployResult} from '../../types/deployResult'
|
import {DeployResult} from '../../types/deployResult'
|
||||||
|
import {K8sObject} from '../../types/k8sObject'
|
||||||
|
|
||||||
export async function deployPodCanary(
|
export async function deployPodCanary(
|
||||||
filePaths: string[],
|
filePaths: string[],
|
||||||
@@ -21,28 +22,43 @@ export async function deployPodCanary(
|
|||||||
throw Error('Percentage must be between 0 and 100')
|
throw Error('Percentage must be between 0 and 100')
|
||||||
|
|
||||||
for (const filePath of filePaths) {
|
for (const filePath of filePaths) {
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
try {
|
||||||
const parsedYaml = yaml.safeLoadAll(fileContents)
|
const fileContents = fs.readFileSync(filePath, 'utf8')
|
||||||
|
const parsedYaml = yaml.loadAll(fileContents)
|
||||||
for (const inputObject of parsedYaml) {
|
for (const inputObject of parsedYaml) {
|
||||||
const name = inputObject.metadata.name
|
if (
|
||||||
const kind = inputObject.kind
|
inputObject &&
|
||||||
|
typeof inputObject === 'object' &&
|
||||||
|
'metadata' in inputObject &&
|
||||||
|
'kind' in inputObject &&
|
||||||
|
'spec' in inputObject &&
|
||||||
|
typeof inputObject.metadata === 'object' &&
|
||||||
|
'name' in inputObject.metadata &&
|
||||||
|
typeof inputObject.metadata.name === 'string' &&
|
||||||
|
typeof inputObject.kind === 'string'
|
||||||
|
) {
|
||||||
|
const obj = inputObject as K8sObject
|
||||||
|
const name = obj.metadata.name
|
||||||
|
const kind = obj.kind
|
||||||
|
|
||||||
if (!onlyDeployStable && isDeploymentEntity(kind)) {
|
if (!onlyDeployStable && isDeploymentEntity(kind)) {
|
||||||
core.debug('Calculating replica count for canary')
|
core.debug('Calculating replica count for canary')
|
||||||
const canaryReplicaCount = calculateReplicaCountForCanary(
|
const canaryReplicaCount = calculateReplicaCountForCanary(
|
||||||
inputObject,
|
obj,
|
||||||
percentage
|
percentage
|
||||||
)
|
)
|
||||||
core.debug('Replica count is ' + canaryReplicaCount)
|
core.debug('Replica count is ' + canaryReplicaCount)
|
||||||
|
|
||||||
const newCanaryObject = canaryDeploymentHelper.getNewCanaryResource(
|
const newCanaryObject =
|
||||||
inputObject,
|
canaryDeploymentHelper.getNewCanaryResource(
|
||||||
|
obj,
|
||||||
canaryReplicaCount
|
canaryReplicaCount
|
||||||
)
|
)
|
||||||
newObjectsList.push(newCanaryObject)
|
newObjectsList.push(newCanaryObject)
|
||||||
|
|
||||||
// if there's already a stable object, deploy baseline as well
|
// if there's already a stable object, deploy baseline as well
|
||||||
const stableObject = await canaryDeploymentHelper.fetchResource(
|
const stableObject =
|
||||||
|
await canaryDeploymentHelper.fetchResource(
|
||||||
kubectl,
|
kubectl,
|
||||||
kind,
|
kind,
|
||||||
name
|
name
|
||||||
@@ -57,16 +73,24 @@ export async function deployPodCanary(
|
|||||||
canaryReplicaCount
|
canaryReplicaCount
|
||||||
)
|
)
|
||||||
core.debug(
|
core.debug(
|
||||||
'New baseline object: ' + JSON.stringify(newBaselineObject)
|
'New baseline object: ' +
|
||||||
|
JSON.stringify(newBaselineObject)
|
||||||
)
|
)
|
||||||
newObjectsList.push(newBaselineObject)
|
newObjectsList.push(newBaselineObject)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// deploy non deployment entity or regular deployments for promote as they are
|
// deploy non deployment entity or regular deployments for promote as they are
|
||||||
newObjectsList.push(inputObject)
|
newObjectsList.push(obj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
core.error(
|
||||||
|
`Failed to parse YAML file at ${filePath}: ${error.message}`
|
||||||
|
)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
core.debug('New objects list: ' + JSON.stringify(newObjectsList))
|
core.debug('New objects list: ' + JSON.stringify(newObjectsList))
|
||||||
const manifestFiles = fileHelper.writeObjectsToFile(newObjectsList)
|
const manifestFiles = fileHelper.writeObjectsToFile(newObjectsList)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import {isDeploymentEntity, isServiceEntity} from '../../types/kubernetesTypes'
|
|||||||
import {checkForErrors} from '../../utilities/kubectlUtils'
|
import {checkForErrors} from '../../utilities/kubectlUtils'
|
||||||
import {inputAnnotations} from '../../inputUtils'
|
import {inputAnnotations} from '../../inputUtils'
|
||||||
import {DeployResult} from '../../types/deployResult'
|
import {DeployResult} from '../../types/deployResult'
|
||||||
|
import {K8sObject} from '../../types/k8sObject'
|
||||||
|
|
||||||
const TRAFFIC_SPLIT_OBJECT_NAME_SUFFIX = '-workflow-rollout'
|
const TRAFFIC_SPLIT_OBJECT_NAME_SUFFIX = '-workflow-rollout'
|
||||||
const TRAFFIC_SPLIT_OBJECT = 'TrafficSplit'
|
const TRAFFIC_SPLIT_OBJECT = 'TrafficSplit'
|
||||||
@@ -36,8 +37,11 @@ export async function deploySMICanary(
|
|||||||
|
|
||||||
const newObjectsList = []
|
const newObjectsList = []
|
||||||
for await (const filePath of filePaths) {
|
for await (const filePath of filePaths) {
|
||||||
|
try {
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
const fileContents = fs.readFileSync(filePath).toString()
|
||||||
const inputObjects = yaml.safeLoadAll(fileContents)
|
const inputObjects: K8sObject[] = yaml.loadAll(
|
||||||
|
fileContents
|
||||||
|
) as K8sObject[]
|
||||||
for (const inputObject of inputObjects) {
|
for (const inputObject of inputObjects) {
|
||||||
const name = inputObject.metadata.name
|
const name = inputObject.metadata.name
|
||||||
const kind = inputObject.kind
|
const kind = inputObject.kind
|
||||||
@@ -57,7 +61,8 @@ export async function deploySMICanary(
|
|||||||
}
|
}
|
||||||
|
|
||||||
core.debug('Creating canary object')
|
core.debug('Creating canary object')
|
||||||
const newCanaryObject = canaryDeploymentHelper.getNewCanaryResource(
|
const newCanaryObject =
|
||||||
|
canaryDeploymentHelper.getNewCanaryResource(
|
||||||
inputObject,
|
inputObject,
|
||||||
canaryReplicaCount
|
canaryReplicaCount
|
||||||
)
|
)
|
||||||
@@ -91,6 +96,10 @@ export async function deploySMICanary(
|
|||||||
newObjectsList.push(inputObject)
|
newObjectsList.push(inputObject)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
core.error(`Failed to process file at ${filePath}: ${error.message}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
}
|
}
|
||||||
core.debug(
|
core.debug(
|
||||||
`deploying canary objects with SMI: \n ${JSON.stringify(newObjectsList)}`
|
`deploying canary objects with SMI: \n ${JSON.stringify(newObjectsList)}`
|
||||||
@@ -111,8 +120,12 @@ async function createCanaryService(
|
|||||||
const trafficObjectsList: string[] = []
|
const trafficObjectsList: string[] = []
|
||||||
|
|
||||||
for (const filePath of filePaths) {
|
for (const filePath of filePaths) {
|
||||||
|
try {
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
const fileContents = fs.readFileSync(filePath).toString()
|
||||||
const parsedYaml = yaml.safeLoadAll(fileContents)
|
const parsedYaml: K8sObject[] = yaml.loadAll(
|
||||||
|
fileContents
|
||||||
|
) as K8sObject[]
|
||||||
|
|
||||||
for (const inputObject of parsedYaml) {
|
for (const inputObject of parsedYaml) {
|
||||||
const name = inputObject.metadata.name
|
const name = inputObject.metadata.name
|
||||||
const kind = inputObject.kind
|
const kind = inputObject.kind
|
||||||
@@ -149,7 +162,8 @@ async function createCanaryService(
|
|||||||
trafficObjectsList.push(trafficObject)
|
trafficObjectsList.push(trafficObject)
|
||||||
} else {
|
} else {
|
||||||
let updateTrafficObject = true
|
let updateTrafficObject = true
|
||||||
const trafficObject = await canaryDeploymentHelper.fetchResource(
|
const trafficObject =
|
||||||
|
await canaryDeploymentHelper.fetchResource(
|
||||||
kubectl,
|
kubectl,
|
||||||
TRAFFIC_SPLIT_OBJECT,
|
TRAFFIC_SPLIT_OBJECT,
|
||||||
getTrafficSplitResourceName(name)
|
getTrafficSplitResourceName(name)
|
||||||
@@ -187,6 +201,10 @@ async function createCanaryService(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
core.error(`Failed to process file at ${filePath}: ${error.message}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const manifestFiles = fileHelper.writeObjectsToFile(newObjectsList)
|
const manifestFiles = fileHelper.writeObjectsToFile(newObjectsList)
|
||||||
@@ -224,8 +242,12 @@ async function adjustTraffic(
|
|||||||
|
|
||||||
const trafficSplitManifests = []
|
const trafficSplitManifests = []
|
||||||
for (const filePath of manifestFilePaths) {
|
for (const filePath of manifestFilePaths) {
|
||||||
|
try {
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
const fileContents = fs.readFileSync(filePath).toString()
|
||||||
const parsedYaml = yaml.safeLoadAll(fileContents)
|
const parsedYaml: K8sObject[] = yaml.loadAll(
|
||||||
|
fileContents
|
||||||
|
) as K8sObject[]
|
||||||
|
|
||||||
for (const inputObject of parsedYaml) {
|
for (const inputObject of parsedYaml) {
|
||||||
const name = inputObject.metadata.name
|
const name = inputObject.metadata.name
|
||||||
const kind = inputObject.kind
|
const kind = inputObject.kind
|
||||||
@@ -242,6 +264,10 @@ async function adjustTraffic(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
core.error(`Failed to process file at ${filePath}: ${error.message}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trafficSplitManifests.length <= 0) {
|
if (trafficSplitManifests.length <= 0) {
|
||||||
@@ -321,9 +347,8 @@ async function getTrafficSplitObject(
|
|||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
// cached version
|
// cached version
|
||||||
if (!trafficSplitAPIVersion) {
|
if (!trafficSplitAPIVersion) {
|
||||||
trafficSplitAPIVersion = await kubectlUtils.getTrafficSplitAPIVersion(
|
trafficSplitAPIVersion =
|
||||||
kubectl
|
await kubectlUtils.getTrafficSplitAPIVersion(kubectl)
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return JSON.stringify({
|
return JSON.stringify({
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import {
|
|||||||
} from '../utilities/githubUtils'
|
} from '../utilities/githubUtils'
|
||||||
import {getDeploymentConfig} from '../utilities/dockerUtils'
|
import {getDeploymentConfig} from '../utilities/dockerUtils'
|
||||||
import {DeployResult} from '../types/deployResult'
|
import {DeployResult} from '../types/deployResult'
|
||||||
|
import {ClusterType} from '../actions/deploy'
|
||||||
|
|
||||||
export async function deployManifests(
|
export async function deployManifests(
|
||||||
files: string[],
|
files: string[],
|
||||||
@@ -110,10 +111,11 @@ function appendStableVersionLabelToResource(files: string[]): string[] {
|
|||||||
const newObjectsList = []
|
const newObjectsList = []
|
||||||
|
|
||||||
files.forEach((filePath: string) => {
|
files.forEach((filePath: string) => {
|
||||||
|
try {
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
const fileContents = fs.readFileSync(filePath).toString()
|
||||||
|
|
||||||
yaml.safeLoadAll(fileContents, function (inputObject) {
|
yaml.loadAll(fileContents, function (inputObject) {
|
||||||
const {kind} = inputObject
|
const kind = (inputObject as {kind: string}).kind
|
||||||
|
|
||||||
if (isDeploymentEntity(kind)) {
|
if (isDeploymentEntity(kind)) {
|
||||||
const updatedObject =
|
const updatedObject =
|
||||||
@@ -123,6 +125,10 @@ function appendStableVersionLabelToResource(files: string[]): string[] {
|
|||||||
manifestFiles.push(filePath)
|
manifestFiles.push(filePath)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.error(`Failed to parse file at ${filePath}: ${error.message}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const updatedManifestFiles = fileHelper.writeObjectsToFile(newObjectsList)
|
const updatedManifestFiles = fileHelper.writeObjectsToFile(newObjectsList)
|
||||||
@@ -133,9 +139,14 @@ function appendStableVersionLabelToResource(files: string[]): string[] {
|
|||||||
|
|
||||||
export async function checkManifestStability(
|
export async function checkManifestStability(
|
||||||
kubectl: Kubectl,
|
kubectl: Kubectl,
|
||||||
resources: Resource[]
|
resources: Resource[],
|
||||||
|
resourceType: ClusterType
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
await KubernetesManifestUtility.checkManifestStability(kubectl, resources)
|
await KubernetesManifestUtility.checkManifestStability(
|
||||||
|
kubectl,
|
||||||
|
resources,
|
||||||
|
resourceType
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function annotateAndLabelResources(
|
export async function annotateAndLabelResources(
|
||||||
@@ -193,15 +204,20 @@ async function annotateResources(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (core.isDebug()) {
|
if (core.isDebug()) {
|
||||||
|
try {
|
||||||
core.debug(`files getting annotated are ${JSON.stringify(files)}`)
|
core.debug(`files getting annotated are ${JSON.stringify(files)}`)
|
||||||
for (const filePath of files) {
|
for (const filePath of files) {
|
||||||
core.debug('printing objects getting annotated...')
|
core.debug('printing objects getting annotated...')
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
const fileContents = fs.readFileSync(filePath).toString()
|
||||||
const inputObjects = yaml.safeLoadAll(fileContents)
|
const inputObjects = yaml.loadAll(fileContents)
|
||||||
for (const inputObject of inputObjects) {
|
for (const inputObject of inputObjects) {
|
||||||
core.debug(`object: ${JSON.stringify(inputObject)}`)
|
core.debug(`object: ${JSON.stringify(inputObject)}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
core.error(`Failed to load and parse files: ${error.message}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const annotationKeyValStr = `${annotationKey}=${getWorkflowAnnotations(
|
const annotationKeyValStr = `${annotationKey}=${getWorkflowAnnotations(
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as fileUtils from '../utilities/fileUtils'
|
import * as fileUtils from '../utilities/fileUtils'
|
||||||
import * as fs from 'fs'
|
import fs from 'node:fs'
|
||||||
import {
|
import {
|
||||||
PrivateKubectl,
|
PrivateKubectl,
|
||||||
extractFileNames,
|
extractFileNames,
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import {Kubectl} from './kubectl'
|
import {Kubectl} from './kubectl'
|
||||||
import * as minimist from 'minimist'
|
import minimist from 'minimist'
|
||||||
import {ExecOptions, ExecOutput, getExecOutput} from '@actions/exec'
|
import {ExecOptions, ExecOutput, getExecOutput} from '@actions/exec'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as os from 'os'
|
import fs from 'node:fs'
|
||||||
import * as fs from 'fs'
|
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import {getTempDirectory} from '../utilities/fileUtils'
|
import {getTempDirectory} from '../utilities/fileUtils'
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import * as fileUtils from './fileUtils'
|
import * as fileUtils from './fileUtils'
|
||||||
|
|
||||||
import * as yaml from 'js-yaml'
|
import * as yaml from 'js-yaml'
|
||||||
import * as fs from 'fs'
|
import fs from 'node:fs'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
|
import {K8sObject} from '../types/k8sObject'
|
||||||
|
|
||||||
const sampleYamlUrl =
|
const sampleYamlUrl =
|
||||||
'https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/controllers/nginx-deployment.yaml'
|
'https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/controllers/nginx-deployment.yaml'
|
||||||
@@ -10,7 +11,9 @@ describe('File utils', () => {
|
|||||||
test('correctly parses a yaml file from a URL', async () => {
|
test('correctly parses a yaml file from a URL', async () => {
|
||||||
const tempFile = await fileUtils.writeYamlFromURLToFile(sampleYamlUrl, 0)
|
const tempFile = await fileUtils.writeYamlFromURLToFile(sampleYamlUrl, 0)
|
||||||
const fileContents = fs.readFileSync(tempFile).toString()
|
const fileContents = fs.readFileSync(tempFile).toString()
|
||||||
const inputObjects = yaml.safeLoadAll(fileContents)
|
const inputObjects: K8sObject[] = yaml.loadAll(
|
||||||
|
fileContents
|
||||||
|
) as K8sObject[]
|
||||||
expect(inputObjects).toHaveLength(1)
|
expect(inputObjects).toHaveLength(1)
|
||||||
|
|
||||||
for (const obj of inputObjects) {
|
for (const obj of inputObjects) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import * as fs from 'fs'
|
import fs from 'node:fs'
|
||||||
import * as https from 'https'
|
import * as https from 'https'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
@@ -183,7 +183,7 @@ function verifyYaml(filepath: string, url: string): Errorable<K8sObject[]> {
|
|||||||
const fileContents = fs.readFileSync(filepath).toString()
|
const fileContents = fs.readFileSync(filepath).toString()
|
||||||
let inputObjects
|
let inputObjects
|
||||||
try {
|
try {
|
||||||
inputObjects = yaml.safeLoadAll(fileContents)
|
inputObjects = yaml.loadAll(fileContents)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return {
|
return {
|
||||||
succeeded: false,
|
succeeded: false,
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
import * as manifestStabilityUtils from './manifestStabilityUtils'
|
||||||
|
import {Kubectl} from '../types/kubectl'
|
||||||
|
import {ResourceTypeFleet, ResourceTypeManagedCluster} from '../actions/deploy'
|
||||||
|
import {ExecOutput} from '@actions/exec'
|
||||||
|
import {exitCode, stdout} from 'process'
|
||||||
|
|
||||||
|
describe('manifestStabilityUtils', () => {
|
||||||
|
const kc = new Kubectl('')
|
||||||
|
const resources = [
|
||||||
|
{
|
||||||
|
type: 'deployment',
|
||||||
|
name: 'test',
|
||||||
|
namespace: 'default'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
it('should return immediately if the resource type is fleet', async () => {
|
||||||
|
const spy = jest.spyOn(manifestStabilityUtils, 'checkManifestStability')
|
||||||
|
const checkRolloutStatusSpy = jest.spyOn(kc, 'checkRolloutStatus')
|
||||||
|
await manifestStabilityUtils.checkManifestStability(
|
||||||
|
kc,
|
||||||
|
resources,
|
||||||
|
ResourceTypeFleet
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(checkRolloutStatusSpy).not.toHaveBeenCalled()
|
||||||
|
expect(spy).toHaveReturned()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should run fully if the resource type is managedCluster', async () => {
|
||||||
|
const spy = jest.spyOn(manifestStabilityUtils, 'checkManifestStability')
|
||||||
|
const checkRolloutStatusSpy = jest
|
||||||
|
.spyOn(kc, 'checkRolloutStatus')
|
||||||
|
.mockImplementation(() => {
|
||||||
|
return new Promise<ExecOutput>((resolve, reject) => {
|
||||||
|
resolve({
|
||||||
|
exitCode: 0,
|
||||||
|
stderr: '',
|
||||||
|
stdout: ''
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
await manifestStabilityUtils.checkManifestStability(
|
||||||
|
kc,
|
||||||
|
resources,
|
||||||
|
ResourceTypeManagedCluster
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(checkRolloutStatusSpy).toHaveBeenCalled()
|
||||||
|
expect(spy).toHaveReturned()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -3,14 +3,21 @@ import * as KubernetesConstants from '../types/kubernetesTypes'
|
|||||||
import {Kubectl, Resource} from '../types/kubectl'
|
import {Kubectl, Resource} from '../types/kubectl'
|
||||||
import {checkForErrors} from './kubectlUtils'
|
import {checkForErrors} from './kubectlUtils'
|
||||||
import {sleep} from './timeUtils'
|
import {sleep} from './timeUtils'
|
||||||
|
import {ClusterType, ResourceTypeFleet} from '../actions/deploy'
|
||||||
|
|
||||||
const IS_SILENT = false
|
const IS_SILENT = false
|
||||||
const POD = 'pod'
|
const POD = 'pod'
|
||||||
|
|
||||||
export async function checkManifestStability(
|
export async function checkManifestStability(
|
||||||
kubectl: Kubectl,
|
kubectl: Kubectl,
|
||||||
resources: Resource[]
|
resources: Resource[],
|
||||||
|
clusterTyper: ClusterType
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
|
// Skip if resource type is microsoft.containerservice/fleets
|
||||||
|
if (clusterTyper === ResourceTypeFleet) {
|
||||||
|
core.info(`Skipping checkManifestStability for ${ResourceTypeFleet}`)
|
||||||
|
return
|
||||||
|
}
|
||||||
let rolloutStatusHasErrors = false
|
let rolloutStatusHasErrors = false
|
||||||
for (let i = 0; i < resources.length; i++) {
|
for (let i = 0; i < resources.length; i++) {
|
||||||
const resource = resources[i]
|
const resource = resources[i]
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import {
|
|||||||
setImagePullSecrets
|
setImagePullSecrets
|
||||||
} from './manifestPullSecretUtils'
|
} from './manifestPullSecretUtils'
|
||||||
import {Resource} from '../types/kubectl'
|
import {Resource} from '../types/kubectl'
|
||||||
|
import {K8sObject} from '../types/k8sObject'
|
||||||
|
|
||||||
export function updateManifestFiles(manifestFilePaths: string[]) {
|
export function updateManifestFiles(manifestFilePaths: string[]) {
|
||||||
if (manifestFilePaths?.length === 0) {
|
if (manifestFilePaths?.length === 0) {
|
||||||
@@ -274,8 +275,12 @@ export function getResources(
|
|||||||
|
|
||||||
const resources: Resource[] = []
|
const resources: Resource[] = []
|
||||||
filePaths.forEach((filePath: string) => {
|
filePaths.forEach((filePath: string) => {
|
||||||
|
try {
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
const fileContents = fs.readFileSync(filePath).toString()
|
||||||
yaml.safeLoadAll(fileContents, (inputObject) => {
|
const inputObjects: K8sObject[] = yaml.loadAll(
|
||||||
|
fileContents
|
||||||
|
) as K8sObject[]
|
||||||
|
inputObjects.forEach((inputObject) => {
|
||||||
const inputObjectKind = inputObject?.kind || ''
|
const inputObjectKind = inputObject?.kind || ''
|
||||||
if (
|
if (
|
||||||
filterResourceTypes.filter(
|
filterResourceTypes.filter(
|
||||||
@@ -289,6 +294,10 @@ export function getResources(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.error(`Failed to process file at ${filePath}: ${error.message}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return resources
|
return resources
|
||||||
@@ -302,8 +311,9 @@ function updateImagePullSecretsInManifestFiles(
|
|||||||
|
|
||||||
const newObjectsList = []
|
const newObjectsList = []
|
||||||
filePaths.forEach((filePath: string) => {
|
filePaths.forEach((filePath: string) => {
|
||||||
|
try {
|
||||||
const fileContents = fs.readFileSync(filePath).toString()
|
const fileContents = fs.readFileSync(filePath).toString()
|
||||||
yaml.safeLoadAll(fileContents, (inputObject: any) => {
|
yaml.loadAll(fileContents, (inputObject: any) => {
|
||||||
if (inputObject?.kind) {
|
if (inputObject?.kind) {
|
||||||
const {kind} = inputObject
|
const {kind} = inputObject
|
||||||
if (isWorkloadEntity(kind)) {
|
if (isWorkloadEntity(kind)) {
|
||||||
@@ -312,6 +322,10 @@ function updateImagePullSecretsInManifestFiles(
|
|||||||
newObjectsList.push(inputObject)
|
newObjectsList.push(inputObject)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.error(`Failed to process file at ${filePath}: ${error.message}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return fileHelper.writeObjectsToFile(newObjectsList)
|
return fileHelper.writeObjectsToFile(newObjectsList)
|
||||||
|
|||||||
+2
-1
@@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ES6",
|
"target": "ES6",
|
||||||
"module": "commonjs"
|
"module": "commonjs",
|
||||||
|
"esModuleInterop": true
|
||||||
},
|
},
|
||||||
"exclude": ["node_modules", "test", "src/**/*.test.ts"]
|
"exclude": ["node_modules", "test", "src/**/*.test.ts"]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user