Some checks failed
CD - Deploy Infrastructure / ci (push) Waiting to run
CD - Deploy Infrastructure / Deploy on pve1 (push) Blocked by required conditions
CD - Deploy Infrastructure / Deploy on pve2 (push) Blocked by required conditions
CD - Deploy Infrastructure / Deploy on pve3 (push) Blocked by required conditions
CD - Deploy Infrastructure / Validate K3s Cluster (push) Blocked by required conditions
CD - Deploy Infrastructure / Deployment Notification (push) Blocked by required conditions
CI - Validation / Terraform Validation (push) Failing after 1m4s
CI - Validation / Ansible Validation (push) Successful in 1m27s
CI - Validation / Kubernetes Validation (push) Successful in 8s
CI - Validation / Security Scan (push) Successful in 17s
Update all deployment jobs to use Ubuntu 24.04 LTS template and LINSTOR storage backend for improved reliability.
161 lines
5.8 KiB
YAML
161 lines
5.8 KiB
YAML
name: CD - Deploy Infrastructure
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
workflow_dispatch: # Allow manual trigger
|
|
|
|
jobs:
|
|
# Run CI first
|
|
ci:
|
|
uses: ./.forgejo/workflows/ci.yml
|
|
secrets: inherit
|
|
|
|
# Deploy infrastructure in parallel
|
|
deploy-pve1:
|
|
name: Deploy on pve1
|
|
runs-on: self-hosted
|
|
needs: ci
|
|
continue-on-error: true
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
- name: Terraform Apply on pve1
|
|
run: |
|
|
cd terraform/pve1
|
|
cat > terraform.tfvars <<EOF
|
|
proxmox_token_id = "${{ secrets.PROXMOX_TOKEN_ID }}"
|
|
proxmox_token_secret = "${{ secrets.PROXMOX_TOKEN_SECRET }}"
|
|
ssh_public_key = "${{ secrets.SSH_PUBLIC_KEY }}"
|
|
forgejo_token = "${{ secrets.FORGEJO_TOKEN }}"
|
|
forgejo_repo_url = "${{ secrets.FORGEJO_REPO_URL }}"
|
|
k3s_version = "v1.28.5+k3s1"
|
|
ubuntu_template = "ubuntu-2404-cloudinit"
|
|
storage_pool = "linstor_storage"
|
|
snippets_storage = "local"
|
|
k3s_network_bridge = "k3s"
|
|
k3s_gateway = "10.100.20.1"
|
|
k3s_dns = ["10.100.20.1", "1.1.1.1"]
|
|
k3s_server_1_config = { ip = "10.100.20.10/24", cores = 6, memory = 12288, disk_size = "100G" }
|
|
EOF
|
|
tofu init
|
|
tofu apply -auto-approve
|
|
|
|
deploy-pve2:
|
|
name: Deploy on pve2
|
|
runs-on: self-hosted
|
|
needs: ci
|
|
continue-on-error: true
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
- name: Terraform Apply on pve2
|
|
run: |
|
|
cd terraform/pve2
|
|
cat > terraform.tfvars <<EOF
|
|
proxmox_token_id = "${{ secrets.PROXMOX_TOKEN_ID }}"
|
|
proxmox_token_secret = "${{ secrets.PROXMOX_TOKEN_SECRET }}"
|
|
ssh_public_key = "${{ secrets.SSH_PUBLIC_KEY }}"
|
|
forgejo_token = "${{ secrets.FORGEJO_TOKEN }}"
|
|
forgejo_repo_url = "${{ secrets.FORGEJO_REPO_URL }}"
|
|
k3s_version = "v1.28.5+k3s1"
|
|
ubuntu_template = "ubuntu-2404-cloudinit"
|
|
storage_pool = "linstor_storage"
|
|
snippets_storage = "local"
|
|
k3s_network_bridge = "k3s"
|
|
k3s_gateway = "10.100.20.1"
|
|
k3s_dns = ["10.100.20.1", "1.1.1.1"]
|
|
k3s_server_2_config = { ip = "10.100.20.20/24", cores = 6, memory = 12288, disk_size = "100G" }
|
|
EOF
|
|
tofu init
|
|
tofu apply -auto-approve
|
|
|
|
deploy-pve3:
|
|
name: Deploy on pve3
|
|
runs-on: self-hosted
|
|
needs: ci
|
|
continue-on-error: true
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
- name: Terraform Apply on pve3
|
|
run: |
|
|
cd terraform/pve3
|
|
cat > terraform.tfvars <<EOF
|
|
proxmox_token_id = "${{ secrets.PROXMOX_TOKEN_ID }}"
|
|
proxmox_token_secret = "${{ secrets.PROXMOX_TOKEN_SECRET }}"
|
|
ssh_public_key = "${{ secrets.SSH_PUBLIC_KEY }}"
|
|
forgejo_token = "${{ secrets.FORGEJO_TOKEN }}"
|
|
forgejo_repo_url = "${{ secrets.FORGEJO_REPO_URL }}"
|
|
k3s_version = "v1.28.5+k3s1"
|
|
ubuntu_template = "ubuntu-2404-cloudinit"
|
|
storage_pool = "linstor_storage"
|
|
snippets_storage = "local"
|
|
k3s_network_bridge = "k3s"
|
|
k3s_gateway = "10.100.20.1"
|
|
k3s_dns = ["10.100.20.1", "1.1.1.1"]
|
|
etcd_witness_config = { ip = "10.100.20.30/24", cores = 2, memory = 2048, disk_size = "20G" }
|
|
EOF
|
|
tofu init
|
|
tofu apply -auto-approve
|
|
|
|
# Validate cluster after deployment
|
|
validate-cluster:
|
|
name: Validate K3s Cluster
|
|
runs-on: self-hosted
|
|
needs: [deploy-pve1, deploy-pve2, deploy-pve3]
|
|
if: |
|
|
always() &&
|
|
github.ref == 'refs/heads/main' &&
|
|
(
|
|
(needs.deploy-pve1.result == 'success' && needs.deploy-pve2.result == 'success') ||
|
|
(needs.deploy-pve1.result == 'success' && needs.deploy-pve3.result == 'success') ||
|
|
(needs.deploy-pve2.result == 'success' && needs.deploy-pve3.result == 'success')
|
|
)
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
- name: Wait for K3s cluster
|
|
run: |
|
|
echo "Waiting for K3s cluster to be ready..."
|
|
sleep 300 # Wait 5 minutes for ansible-pull to configure K3s
|
|
- name: Check cluster status (optional)
|
|
run: |
|
|
echo "Cluster validation completed"
|
|
continue-on-error: true
|
|
|
|
# Notify on completion
|
|
notify:
|
|
name: Deployment Notification
|
|
runs-on: self-hosted
|
|
needs: [deploy-pve1, deploy-pve2, deploy-pve3, validate-cluster]
|
|
if: always()
|
|
steps:
|
|
- name: Deployment Summary
|
|
run: |
|
|
echo "=== Deployment Summary ==="
|
|
echo "pve1 (k3s-server-1): ${{ needs.deploy-pve1.result }}"
|
|
echo "pve2 (k3s-server-2): ${{ needs.deploy-pve2.result }}"
|
|
echo "pve3 (etcd-witness): ${{ needs.deploy-pve3.result }}"
|
|
echo "Cluster validation: ${{ needs.validate-cluster.result }}"
|
|
echo ""
|
|
|
|
# Count successful deployments
|
|
success_count=0
|
|
[ "${{ needs.deploy-pve1.result }}" == "success" ] && ((success_count++))
|
|
[ "${{ needs.deploy-pve2.result }}" == "success" ] && ((success_count++))
|
|
[ "${{ needs.deploy-pve3.result }}" == "success" ] && ((success_count++))
|
|
|
|
echo "Nodes deployed: $success_count/3"
|
|
|
|
if [ $success_count -ge 2 ]; then
|
|
echo "SUCCESS: HA maintained - Quorum achieved ($success_count/3 nodes)"
|
|
exit 0
|
|
elif [ $success_count -eq 1 ]; then
|
|
echo "WARNING: Only 1 node deployed - No HA"
|
|
exit 1
|
|
else
|
|
echo "CRITICAL: No nodes deployed"
|
|
exit 1
|
|
fi
|