name: Deploy to Kubernetes on: workflow_dispatch: inputs: image_tag: description: 'Docker image tag to deploy' required: true default: 'latest' type: string environment: description: 'Deployment environment' required: false default: 'production' type: string env: REGISTRY: ${{ secrets.CONTAINER_REGISTRY }} IMAGE_NAME: ${{ secrets.IMAGE_NAME }} APP_NAME: ${{ secrets.APP_NAME }} HOST: ${{ secrets.HOST }} NAMESPACE: ${{ secrets.K8S_NAMESPACE }} jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup kubectl uses: azure/setup-kubectl@v3 with: version: 'v1.28.0' - name: Configure kubectl run: | echo "${{ secrets.KUBECONFIG_BASE64 }}" | base64 -d > kubeconfig export KUBECONFIG=kubeconfig kubectl config current-context - name: Create namespace if not exists run: | export KUBECONFIG=kubeconfig kubectl create namespace ${{ env.NAMESPACE }} --dry-run=client -o yaml | kubectl apply -f - - name: Deploy to Kubernetes run: | export KUBECONFIG=kubeconfig # Replace variables in manifests and apply for manifest in k8s/*.yaml; do sed -e "s/\${APP_NAME}/${{ env.APP_NAME }}/g" \ -e "s/\${NAMESPACE}/${{ env.NAMESPACE }}/g" \ -e "s/\${REGISTRY}/${{ env.REGISTRY }}/g" \ -e "s/\${IMAGE_NAME}/${{ env.IMAGE_NAME }}/g" \ -e "s/\${IMAGE_TAG}/${{ inputs.image_tag }}/g" \ -e "s/\${HOST}/${{ env.HOST }}/g" \ "$manifest" | kubectl apply -f - done - name: Verify deployment run: | export KUBECONFIG=kubeconfig kubectl rollout status deployment/${{ env.APP_NAME }} -n ${{ env.NAMESPACE }} kubectl get pods -n ${{ env.NAMESPACE }} -l app=${{ env.APP_NAME }} - name: Cleanup if: always() run: | rm -f kubeconfig