From 23fe8280742d862e53faaea098133ba2e7aaa299 Mon Sep 17 00:00:00 2001 From: traveler Date: Sun, 11 Jan 2026 18:15:06 -0600 Subject: [PATCH] addied deploy for runner actions --- .forgejo/workflows/deploy.yml | 159 ++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 .forgejo/workflows/deploy.yml diff --git a/.forgejo/workflows/deploy.yml b/.forgejo/workflows/deploy.yml new file mode 100644 index 0000000..3b5afb2 --- /dev/null +++ b/.forgejo/workflows/deploy.yml @@ -0,0 +1,159 @@ + +name: Deploy on push + +on: + push: + branches: ["main"] + +jobs: + detect: + runs-on: docker2 + outputs: + swarm_files: ${{ steps.changes.outputs.swarm_files }} + compose_matrix: ${{ steps.changes.outputs.compose_matrix }} + steps: + - name: Checkout + uses: https://data.forgejo.org/actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Detect changed YAML deploy targets (YAML only) + id: changes + shell: bash + run: | + set -euo pipefail + + BASE="${{ github.event.before }}" + HEAD="${{ github.sha }}" + + if [ -z "${BASE}" ] || [ "${BASE}" = "0000000000000000000000000000000000000000" ]; then + BASE="$(git rev-parse "${HEAD}~1" || true)" + fi + if [ -z "${BASE}" ]; then + echo "No base commit found; deploying nothing." + echo "swarm_files=" >> "$GITHUB_OUTPUT" + echo 'compose_matrix={"include":[]}' >> "$GITHUB_OUTPUT" + exit 0 + fi + + CHANGED="$(git diff --name-only "$BASE" "$HEAD" || true)" + echo "$CHANGED" + + # Swarm: only changed stack YAMLs + SWARM_FILES="$(echo "$CHANGED" | grep -E '^services/swarm/stacks/.*\.ya?ml$' || true)" + SWARM_FILES_ONE_LINE="$(echo "$SWARM_FILES" | tr '\n' ' ' | xargs || true)" + echo "swarm_files=$SWARM_FILES_ONE_LINE" >> "$GITHUB_OUTPUT" + + # Compose: ONLY if compose YAML file changed inside a service dir + COMPOSE_FILES="$( + echo "$CHANGED" \ + | grep -E '^services/compose/[^/]+/[^/]+/(compose|docker-compose)\.ya?ml$' \ + | sort -u \ + || true + )" + + COMPOSE_DIRS="$( + echo "$COMPOSE_FILES" \ + | awk -F/ '{print $1"/"$2"/"$3"/"$4}' \ + | sort -u \ + || true + )" + + JSON='{"include":[' + FIRST=1 + while read -r DIR; do + [ -z "$DIR" ] && continue + HOST="$(echo "$DIR" | awk -F/ '{print $3}')" + if [ $FIRST -eq 1 ]; then + FIRST=0 + else + JSON+="," + fi + JSON+="{\"host\":\"$HOST\",\"dir\":\"$DIR\"}" + done <<< "$COMPOSE_DIRS" + JSON+=']}' + + echo "compose_matrix=$JSON" >> "$GITHUB_OUTPUT" + + deploy_swarm: + needs: detect + if: ${{ needs.detect.outputs.swarm_files != '' }} + runs-on: docker2 + steps: + - name: Checkout + uses: https://data.forgejo.org/actions/checkout@v4 + + - name: Pre-flight validate swarm stacks + shell: bash + run: | + set -euo pipefail + for f in ${{ needs.detect.outputs.swarm_files }}; do + echo "Validating swarm stack file: $f" + docker stack config -c "$f" > /dev/null + done + + - name: Deploy changed swarm stacks + shell: bash + run: | + set -euo pipefail + for f in ${{ needs.detect.outputs.swarm_files }}; do + echo "Deploying swarm stack file: $f" + STACK="$(basename "$f")" + STACK="${STACK%.yml}" + STACK="${STACK%.yaml}" + docker stack deploy -c "$f" "$STACK" + done + + deploy_compose: + needs: detect + if: ${{ needs.detect.outputs.compose_matrix != '' }} + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.detect.outputs.compose_matrix) }} + runs-on: ${{ matrix.host }} + steps: + - name: Checkout + uses: https://data.forgejo.org/actions/checkout@v4 + + - name: Pre-flight validate compose service + shell: bash + run: | + set -euo pipefail + + DIR="${{ matrix.dir }}" + if [ -f "$DIR/compose.yml" ]; then + F="$DIR/compose.yml" + elif [ -f "$DIR/compose.yaml" ]; then + F="$DIR/compose.yaml" + elif [ -f "$DIR/docker-compose.yml" ]; then + F="$DIR/docker-compose.yml" + elif [ -f "$DIR/docker-compose.yaml" ]; then + F="$DIR/docker-compose.yaml" + else + echo "No compose file found in $DIR" + exit 1 + fi + + docker compose -f "$F" config -q + + - name: Deploy compose service + shell: bash + run: | + set -euo pipefail + + DIR="${{ matrix.dir }}" + if [ -f "$DIR/compose.yml" ]; then + F="$DIR/compose.yml" + elif [ -f "$DIR/compose.yaml" ]; then + F="$DIR/compose.yaml" + elif [ -f "$DIR/docker-compose.yml" ]; then + F="$DIR/docker-compose.yml" + elif [ -f "$DIR/docker-compose.yaml" ]; then + F="$DIR/docker-compose.yaml" + else + echo "No compose file found in $DIR" + exit 1 + fi + + docker compose -f "$F" pull + docker compose -f "$F" up -d --remove-orphans