name: Deploy on: workflow_call: inputs: k8s_dir: description: "Override the default k8s directory path (k8s/)" required: false default: "k8s/" type: string helmfile_path: description: "Override the default helmfile path (hemfile.yaml)" required: false default: "helmfile.yaml" type: string skip_helm_deployment: description: "Skip Helm deployment even if helmfile.yaml exists" required: false default: false type: boolean skip_shared_secrets_deployment: description: "Skip shared secrets deployment (e.g. restic backup secret)" required: false default: false type: boolean helmfile_env: description: "Optional JSON object string of environment variables for Helmfile" required: false default: "{}" type: string outputs: has_k8s: description: "Whether Kubernetes manifests were detected" value: ${{ jobs.summary-data.outputs.has_k8s }} has_helmfile: description: "Whether helmfile.yaml was detected" value: ${{ jobs.summary-data.outputs.has_helmfile }} skip_helm_deployment: description: "Whether Helm deployment was manually skipped" value: ${{ jobs.summary-data.outputs.skip_helm_deployment }} service_type: description: "Service type inferred from repository contents" value: ${{ jobs.summary-data.outputs.service_type }} jobs: detect-service-type: runs-on: ubuntu-latest outputs: has_helmfile: ${{ steps.check-helmfile.outputs.exists }} has_k8s: ${{ steps.check-k8s.outputs.exists }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Check if helmfile.yaml exists id: check-helmfile run: | if [ -f "${{ inputs.helmfile_path }}" ]; then echo "exists=true" >> $GITHUB_OUTPUT echo "Found helmfile.yaml at ${{ inputs.helmfile_path }}" else echo "exists=false" >> $GITHUB_OUTPUT echo "No helmfile.yaml found at ${{ inputs.helmfile_path }}" fi - name: Check if k8s directory exists id: check-k8s run: | if [ -d "${{ inputs.k8s_dir }}" ]; then echo "exists=true" >> $GITHUB_OUTPUT echo "Found k8s directory at ${{ inputs.k8s_dir }}" else echo "exists=false" >> $GITHUB_OUTPUT echo "No k8s directory found at ${{ inputs.k8s_dir }}" fi deploy-shared-secrets: runs-on: ubuntu-latest needs: detect-service-type if: inputs.skip_shared_secrets_deployment != 'true' steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set restic backup secret uses: azure/k8s-create-secret@6e0ba8047235646753f2a3a3b359b4d0006ff218 # v5.0.1 with: namespace: ${{ steps.namespace.outputs.namespace }} secret-name: backupsidecar-secret secret-type: generic data: | { "restic_password": "${{ secrets.RESTIC_PASSWORD }}", "restic_rest_username": "${{ secrets.RESTIC_REST_USERNAME }}", "restic_rest_password": "${{ secrets.RESTIC_REST_PASSWORD }}", "gotify_token": "${{ secrets.GOTIFY_TOKEN }}" } deploy-k8s: runs-on: ubuntu-latest needs: detect-service-type if: needs.detect-service-type.outputs.has_k8s == 'true' steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: https://gitea.t000-n.de/t.behrendt/k_deploy_actions/.gitea/actions/extract-namespace-from-repo-name@0.0.1 id: namespace with: repo: ${{ github.repository }} - uses: azure/setup-kubectl@829323503d1be3d00ca8346e5391ca0b07a9ab0d # v5.1.0 - uses: azure/k8s-set-context@89b837d75b40a7bd2ddafde837473c212db8b313 # v5.0.0 with: method: kubeconfig kubeconfig: ${{ secrets.KUBECONFIG }} - name: Deploy Kubernetes manifests uses: azure/k8s-deploy@c7ebd0d5f39477a23f1b5dea0f52e6db04adf28e # v6.0.0 with: action: deploy manifests: "${{ inputs.k8s_dir }}" strategy: basic namespace: ${{ steps.namespace.outputs.namespace }} deploy-helm: runs-on: ubuntu-latest needs: detect-service-type if: | needs.detect-service-type.outputs.has_helmfile == 'true' && needs.detect-service-type.outputs.has_k8s == 'true' && inputs.skip_helm_deployment != 'true' steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: https://gitea.t000-n.de/t.behrendt/k_deploy_actions/.gitea/actions/extract-namespace-from-repo-name@0.0.1 id: namespace with: repo: ${{ github.repository }} - uses: azure/setup-kubectl@829323503d1be3d00ca8346e5391ca0b07a9ab0d # v5.1.0 - uses: azure/setup-helm@dda3372f752e03dde6b3237bc9431cdc2f7a02a2 # v5 - uses: azure/k8s-set-context@89b837d75b40a7bd2ddafde837473c212db8b313 # v5.0.0 with: method: kubeconfig kubeconfig: ${{ secrets.KUBECONFIG }} - name: Deploy Helm uses: helmfile/helmfile-action@02671705b1dda1dc4b0a4ddd4f9f1ea8f4568c6f # v2.4.3 with: helmfile-args: apply env: ${{ fromJSON(inputs.helmfile_env) }} summary-data: runs-on: ubuntu-latest needs: [detect-service-type, deploy-k8s, deploy-helm] if: always() outputs: has_k8s: ${{ steps.export.outputs.has_k8s }} has_helmfile: ${{ steps.export.outputs.has_helmfile }} skip_helm_deployment: ${{ steps.export.outputs.skip_helm_deployment }} service_type: ${{ steps.export.outputs.service_type }} steps: - name: Export summary data id: export run: | has_k8s="${{ needs.detect-service-type.outputs.has_k8s }}" has_helmfile="${{ needs.detect-service-type.outputs.has_helmfile }}" skip_helm_deployment="${{ inputs.skip_helm_deployment }}" if [ "$has_helmfile" = "true" ]; then service_type="Helm + Kubernetes" else service_type="Kubernetes Only" fi echo "has_k8s=$has_k8s" >> "$GITHUB_OUTPUT" echo "has_helmfile=$has_helmfile" >> "$GITHUB_OUTPUT" echo "skip_helm_deployment=$skip_helm_deployment" >> "$GITHUB_OUTPUT" echo "service_type=$service_type" >> "$GITHUB_OUTPUT"