diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 00000000..5c5a8086 --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,48 @@ +name: Build and Deploy + +on: [push, pull_request] + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.21 + + - name: Install dependencies + run: | + # Install kind + curl -sLo kind "$(curl -sL https://github.com/gitapi/repos/kubernetes-sigs/kind/releases/latest | jq -r '[.assets[] | select(.name == "kind-linux-amd64")] | first | .browser_download_url')" + chmod +x kind + sudo mv kind /bin/ + + # Install kubectl + curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl" + chmod +x kubectl + sudo mv kubectl /bin/ + + - name: Create Kubernetes cluster + run: | + kind create cluster + kind export kubeconfig + + - name: Load Docker image into kind cluster + run: | + make docker-build IMG=checkpoint-restore-operator:ci + kind load docker-image checkpoint-restore-operator:ci + + - name: Deploy to Kubernetes + run: | + make install + make deploy IMG=checkpoint-restore-operator:ci + + - name: Wait for deployments to be ready + run: ./test/wait_for_deployment.sh checkpoint-restore-operator-controller-manager + + - name: Check resources + run: kubectl get all -n checkpoint-restore-operator-system diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 6ebb481c..1bd15f0c 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -13,6 +13,12 @@ jobs: with: go-version: '1.21' + - name: Install ShellCheck and shfmt + run: | + sudo apt update + sudo apt install -y shellcheck + go install mvdan.cc/sh/v3/cmd/shfmt@latest + - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: @@ -26,6 +32,11 @@ jobs: uses: codespell-project/actions-codespell@v2 with: skip: vendor,*.svg + + - name: ShellCheck and shfmt + run: | + shellcheck ./test/*.sh + shfmt -d ./test/*.sh gomod: runs-on: ubuntu-latest diff --git a/test/wait_for_deployment.sh b/test/wait_for_deployment.sh new file mode 100755 index 00000000..9b72d28d --- /dev/null +++ b/test/wait_for_deployment.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +wait_for_deployment() { + local deployment_name="$1" + timeout=60 # 5 minutes (60 * 5 sec) + i=1 + echo "Checking if the ${deployment_name} deployment is ready" + until kubectl -n checkpoint-restore-operator-system get deployment "${deployment_name}" -o jsonpath='{.status.conditions[?(@.status=="True")].type}' | grep "Available" 2>/dev/null; do + ((i++)) + if [[ ${i} -gt ${timeout} ]]; then + echo "The ${deployment_name} deployment has not become ready before the timeout period" + echo "Fetching deployment status and describing pods for debugging:" + kubectl -n checkpoint-restore-operator-system get deployment "${deployment_name}" + kubectl -n checkpoint-restore-operator-system describe deployment "${deployment_name}" + kubectl -n checkpoint-restore-operator-system get pods + kubectl -n checkpoint-restore-operator-system describe pods + exit 1 + fi + echo "Waiting for ${deployment_name} deployment to report a ready status" + sleep 5 + done + echo "The ${deployment_name} deployment is ready" +} + +wait_for_deployment "$1"