name: dnode deploy description: Deploy a compose stack or systemd unit with dnode, pulling the newest images, and notify via ntfy. inputs: stack: description: Stack or unit to deploy (e.g. goodwe, nats) required: true nodes: description: > 'all' for every configured node, or the node names separated by spaces, deployed one at a time in that order (e.g. 'hp1 hp2') default: all rollout: description: With nodes 'all', deploy one node at a time and wait for health in between default: 'true' pull: description: Pull the newest images before starting default: 'true' dnode_config: description: dnode nodes.yaml (vars.DNODE_CONFIG) required: true dnode_ssh_key: description: SSH private key for the nodes (secrets.DNODE_SSH_KEY) required: true dnode_known_hosts: description: known_hosts for the nodes (vars.DNODE_KNOWN_HOSTS) required: true deploy_tag: description: What was deployed, for the notification (e.g. master) default: '' ntfy_topic: description: ntfy topic for the success notification; none when empty default: '' ntfy_token: description: ntfy token default: '' ntfy_failure_topic: description: ntfy topic for the failure notification (defaults to ntfy_topic) default: '' runs: using: composite steps: - name: Configure dnode shell: bash env: DNODE_CONFIG_CONTENT: ${{ inputs.dnode_config }} DNODE_SSH_KEY_CONTENT: ${{ inputs.dnode_ssh_key }} DNODE_KNOWN_HOSTS_CONTENT: ${{ inputs.dnode_known_hosts }} run: | mkdir -p ~/.config/dnode ~/.ssh printf '%s\n' "$DNODE_CONFIG_CONTENT" > ~/.config/dnode/nodes.yaml printf '%s\n' "$DNODE_SSH_KEY_CONTENT" > ~/.ssh/dnode_deploy_key printf '%s\n' "$DNODE_KNOWN_HOSTS_CONTENT" > ~/.ssh/known_hosts chmod 600 ~/.config/dnode/nodes.yaml ~/.ssh/dnode_deploy_key ~/.ssh/known_hosts - name: Deploy shell: bash env: STACK: ${{ inputs.stack }} NODES: ${{ inputs.nodes }} ROLLOUT: ${{ inputs.rollout }} PULL: ${{ inputs.pull }} run: | set -euo pipefail export DNODE_SSH_KEY="$HOME/.ssh/dnode_deploy_key" flags=() [ "$PULL" = "true" ] && flags+=(--pull) dnode nodes if [ "$NODES" = "all" ]; then [ "$ROLLOUT" = "true" ] && flags+=(--rollout) dnode deploy "$STACK" --all "${flags[@]}" else for node in $NODES; do echo "::group::$node" dnode deploy "$node" "$STACK" "${flags[@]}" echo "::endgroup::" done fi - name: Notify Success if: success() && inputs.ntfy_topic != '' uses: https://lab.zlymeda.dynu.net/actions/ntfy-notify@main with: ntfy_topic: ${{ inputs.ntfy_topic }} ntfy_token: ${{ inputs.ntfy_token }} status: success message: 🚀 ${{ inputs.stack }} deployed to ${{ inputs.nodes }}${{ inputs.deploy_tag && format(' ({0})', inputs.deploy_tag) || '' }} - name: Notify Failure if: failure() && (inputs.ntfy_failure_topic != '' || inputs.ntfy_topic != '') uses: https://lab.zlymeda.dynu.net/actions/ntfy-notify@main with: ntfy_topic: ${{ inputs.ntfy_failure_topic || inputs.ntfy_topic }} ntfy_token: ${{ inputs.ntfy_token }} status: failure message: Deploy failed (${{ inputs.stack }} to ${{ inputs.nodes }})${{ inputs.deploy_tag && format(' ({0})', inputs.deploy_tag) || '' }}