From e8eb3785410cea40303c3fd394ea286ec6acb020 Mon Sep 17 00:00:00 2001 From: Jose Henrique Date: Mon, 13 Jul 2026 21:03:08 -0300 Subject: [PATCH] add self-test workflow --- .gitea/workflows/test-build.yaml | 137 ++++++++++++++++++++++++++- tests/manifests/test-deployment.yaml | 19 ++++ tests/manifests/test-namespace.yaml | 4 + 3 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 tests/manifests/test-deployment.yaml create mode 100644 tests/manifests/test-namespace.yaml diff --git a/.gitea/workflows/test-build.yaml b/.gitea/workflows/test-build.yaml index c83283a..672a4d9 100644 --- a/.gitea/workflows/test-build.yaml +++ b/.gitea/workflows/test-build.yaml @@ -1,4 +1,4 @@ -name: Test build-and-push (self-test) +name: Test Actions (self-test) on: workflow_dispatch: {} @@ -7,17 +7,22 @@ on: - main paths: - build-and-push/** + - deploy-restart/** + - kubectl-apply/** + - ssh-deploy/** - .gitea/workflows/test-build.yaml + - tests/** env: IMAGE: git.ivanch.me/ivanch/pipeline-actions-selftest jobs: - test-build: + test-build-push: name: Build tiny multi-arch image runs-on: ubuntu-amd64 steps: - - uses: actions/checkout@v4 + - name: Check out repository + uses: actions/checkout@v4 - name: Generate a minimal Dockerfile shell: bash @@ -51,3 +56,129 @@ jobs: echo "${MANIFEST}" | grep -q "linux/amd64" || { echo "missing linux/amd64"; exit 1; } echo "${MANIFEST}" | grep -q "linux/arm64" || { echo "missing linux/arm64"; exit 1; } echo "self-test PASSED: multi-arch image built and pushed" + + test-k8s: + name: Test Kubernetes actions + runs-on: ubuntu-amd64 + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Apply test manifests + uses: https://git.ivanch.me/ivanch/pipeline-actions/kubectl-apply@main + with: + kube_config: ${{ secrets.KUBE_CONFIG }} + manifests: tests/manifests/test-namespace.yaml,tests/manifests/test-deployment.yaml + + - name: Restart test deployment + uses: https://git.ivanch.me/ivanch/pipeline-actions/deploy-restart@main + with: + kube_config: ${{ secrets.KUBE_CONFIG }} + deployment_name: pipeline-actions-test + namespace: pipeline-actions-test + + - name: Verify deployment rollout status + shell: bash + run: | + printf '%s' "${{ secrets.KUBE_CONFIG }}" | tr -d '\r' > kubeconfig.yaml + kubectl --kubeconfig=kubeconfig.yaml rollout status deployment/pipeline-actions-test -n pipeline-actions-test --timeout=60s + + - name: Clean up Kubernetes resources + if: always() + shell: bash + run: | + if [ -f kubeconfig.yaml ]; then + kubectl --kubeconfig=kubeconfig.yaml delete namespace pipeline-actions-test --ignore-not-found=true --timeout=30s + else + printf '%s' "${{ secrets.KUBE_CONFIG }}" | tr -d '\r' > kubeconfig.yaml + kubectl --kubeconfig=kubeconfig.yaml delete namespace pipeline-actions-test --ignore-not-found=true --timeout=30s + fi + + test-ssh: + name: Test SSH deploy action + runs-on: ubuntu-amd64 + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Install and configure SSH server + shell: bash + run: | + sudo apt-get update + sudo apt-get install -y openssh-server + + # Generate host keys if missing + sudo ssh-keygen -A + + # Start sshd on a custom port 2222 to avoid port conflicts on the runner host + sudo /usr/sbin/sshd -p 2222 -o "ListenAddress 127.0.0.1" -o "UsePAM yes" + + # Configure passwordless SSH login for current user + mkdir -p ~/.ssh + ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_test + cat ~/.ssh/id_test.pub >> ~/.ssh/authorized_keys + chmod 700 ~/.ssh + chmod 600 ~/.ssh/authorized_keys + + # Establish environment variables for subsequent steps + echo "SSH_USER=$(whoami)" >> "$GITHUB_ENV" + echo "TEST_REMOTE_DIR=$HOME/ssh_deploy_test" >> "$GITHUB_ENV" + + # Write the private key to GitHub/Gitea env securely using multiline syntax + echo "SSH_PRIVATE_KEY<> "$GITHUB_ENV" + cat ~/.ssh/id_test >> "$GITHUB_ENV" + echo "EOF" >> "$GITHUB_ENV" + + - name: Verify SSH localhost access + shell: bash + run: | + ssh -p 2222 -i ~/.ssh/id_test -o StrictHostKeyChecking=accept-new "${SSH_USER}@127.0.0.1" "echo 'Localhost SSH OK'" + + - name: Set up remote compose directory and files + shell: bash + run: | + mkdir -p "${TEST_REMOTE_DIR}" + # We write a compose file containing nginx:latest + cat > "${TEST_REMOTE_DIR}/docker-compose.yml" <<'EOF' + services: + test-nginx: + image: nginx:latest + container_name: pipeline-actions-ssh-test + restart: always + EOF + + - name: Deploy via composite action with image override + uses: https://git.ivanch.me/ivanch/pipeline-actions/ssh-deploy@main + with: + ssh_host: "127.0.0.1" + ssh_port: "2222" + ssh_username: ${{ env.SSH_USER }} + ssh_key: ${{ env.SSH_PRIVATE_KEY }} + remote_dir: ${{ env.TEST_REMOTE_DIR }} + image: "nginx" + image_tag: "alpine" + + - name: Verify container started and image pin succeeded + shell: bash + run: | + echo "Checking container status..." + docker ps -a + STATUS=$(docker ps --filter "name=pipeline-actions-ssh-test" --format "{{.Status}}") + echo "Container status: ${STATUS}" + echo "${STATUS}" | grep -q "Up" || { echo "Container is not running"; exit 1; } + + echo "Checking image pin..." + IMAGE_USED=$(docker inspect pipeline-actions-ssh-test --format '{{.Config.Image}}') + echo "Container is using image: ${IMAGE_USED}" + echo "${IMAGE_USED}" | grep -q "nginx:alpine" || { echo "Image pin failed"; exit 1; } + echo "self-test PASSED: container is running and using nginx:alpine" + + - name: Clean up SSH deployment resources + if: always() + shell: bash + run: | + if [ -d "${TEST_REMOTE_DIR}" ]; then + cd "${TEST_REMOTE_DIR}" + docker compose down || true + rm -rf "${TEST_REMOTE_DIR}" + fi diff --git a/tests/manifests/test-deployment.yaml b/tests/manifests/test-deployment.yaml new file mode 100644 index 0000000..f3fc80c --- /dev/null +++ b/tests/manifests/test-deployment.yaml @@ -0,0 +1,19 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: pipeline-actions-test + namespace: pipeline-actions-test +spec: + replicas: 1 + selector: + matchLabels: + app: pipeline-actions-test + template: + metadata: + labels: + app: pipeline-actions-test + spec: + containers: + - name: alpine + image: alpine:3.20 + command: ["sleep", "3600"] diff --git a/tests/manifests/test-namespace.yaml b/tests/manifests/test-namespace.yaml new file mode 100644 index 0000000..79ba8d3 --- /dev/null +++ b/tests/manifests/test-namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: pipeline-actions-test