210 lines
6.7 KiB
YAML
210 lines
6.7 KiB
YAML
name: Deploy
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- dev
|
|
- develop
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
deploy-dev:
|
|
if: ${{ github.event_name == 'push' }}
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
volumes:
|
|
- /docker/FlockPal-dev:/docker/FlockPal-dev
|
|
steps:
|
|
- name: Update dev checkout
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal-dev
|
|
git fetch --all --prune
|
|
git reset --hard "origin/${{ github.ref_name }}"
|
|
git clean -fd
|
|
|
|
- name: Validate backend
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal-dev
|
|
docker run --rm -v "$PWD/backend:/src:ro" -w /tmp/app node:22-alpine sh -lc "cp -a /src/. /tmp/app && npm ci && npm run build && npm test"
|
|
|
|
- name: Validate frontend
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal-dev
|
|
docker run --rm -v "$PWD/frontend:/src:ro" -w /tmp/app node:22-alpine sh -lc "cp -a /src/. /tmp/app && npm ci && npm run build"
|
|
|
|
- name: Validate dev compose config
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal-dev
|
|
docker compose -f docker-compose.dev.yaml config --quiet
|
|
|
|
- name: Deploy dev
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal-dev
|
|
docker compose -f docker-compose.dev.yaml up -d --build
|
|
|
|
- name: Notify Discord
|
|
if: always()
|
|
env:
|
|
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
|
JOB_STATUS: ${{ job.status }}
|
|
run: |
|
|
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
|
|
echo "DISCORD_WEBHOOK_URL is not configured; skipping Discord notification."
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$JOB_STATUS" = "success" ]; then
|
|
STATUS_TITLE="Deploy succeeded"
|
|
COLOR=65280
|
|
else
|
|
STATUS_TITLE="Deploy failed"
|
|
COLOR=16711680
|
|
fi
|
|
RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
|
AVATAR_URL="${{ vars.DISCORD_AVATAR_URL }}"
|
|
AVATAR_URL="${AVATAR_URL:-https://www.flockpal.app/FlockPal-Paint.png}"
|
|
COMMIT_MESSAGE="$(git -C /docker/FlockPal-dev log -1 --pretty=%s 2>/dev/null || printf '%s' '${{ github.sha }}')"
|
|
json_escape() {
|
|
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
|
|
}
|
|
BRANCH="$(json_escape '${{ github.ref_name }}')"
|
|
MESSAGE="$(json_escape "$COMMIT_MESSAGE")"
|
|
AVATAR_URL="$(json_escape "$AVATAR_URL")"
|
|
|
|
cat > /tmp/discord-payload.json <<EOF
|
|
{
|
|
"username": "FlockPal Build",
|
|
"avatar_url": "${AVATAR_URL}",
|
|
"embeds": [
|
|
{
|
|
"title": "${STATUS_TITLE}",
|
|
"url": "${RUN_URL}",
|
|
"description": "FlockPal dev deploy",
|
|
"color": ${COLOR},
|
|
"fields": [
|
|
{
|
|
"name": "Branch",
|
|
"value": "${BRANCH}",
|
|
"inline": true
|
|
},
|
|
{
|
|
"name": "Message",
|
|
"value": "${MESSAGE}",
|
|
"inline": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
EOF
|
|
|
|
curl --fail --show-error --silent \
|
|
-H "Content-Type: application/json" \
|
|
-d @/tmp/discord-payload.json \
|
|
"$DISCORD_WEBHOOK_URL" || echo "Discord notification failed."
|
|
|
|
deploy-prod:
|
|
if: ${{ github.event_name == 'workflow_dispatch' }}
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
volumes:
|
|
- /docker/FlockPal:/docker/FlockPal
|
|
steps:
|
|
- name: Update prod checkout
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal
|
|
git fetch --all --prune
|
|
git reset --hard "origin/${{ github.ref_name }}"
|
|
git clean -fd
|
|
|
|
- name: Validate backend
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal
|
|
docker run --rm -v "$PWD/backend:/src:ro" -w /tmp/app node:22-alpine sh -lc "cp -a /src/. /tmp/app && npm ci && npm run build && npm test"
|
|
|
|
- name: Validate frontend
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal
|
|
docker run --rm -v "$PWD/frontend:/src:ro" -w /tmp/app node:22-alpine sh -lc "cp -a /src/. /tmp/app && npm ci && npm run build"
|
|
|
|
- name: Validate prod compose config
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal
|
|
docker compose -f docker-compose.prod.yml config --quiet
|
|
|
|
- name: Deploy prod
|
|
run: |
|
|
set -e
|
|
cd /docker/FlockPal
|
|
docker compose -f docker-compose.prod.yml up -d --build
|
|
|
|
- name: Notify Discord
|
|
if: always()
|
|
env:
|
|
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
|
JOB_STATUS: ${{ job.status }}
|
|
run: |
|
|
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
|
|
echo "DISCORD_WEBHOOK_URL is not configured; skipping Discord notification."
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$JOB_STATUS" = "success" ]; then
|
|
STATUS_TITLE="Deploy succeeded"
|
|
COLOR=65280
|
|
else
|
|
STATUS_TITLE="Deploy failed"
|
|
COLOR=16711680
|
|
fi
|
|
RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
|
AVATAR_URL="${{ vars.DISCORD_AVATAR_URL }}"
|
|
AVATAR_URL="${AVATAR_URL:-https://www.flockpal.app/FlockPal-Paint.png}"
|
|
COMMIT_MESSAGE="$(git -C /docker/FlockPal log -1 --pretty=%s 2>/dev/null || printf '%s' '${{ github.sha }}')"
|
|
json_escape() {
|
|
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
|
|
}
|
|
BRANCH="$(json_escape '${{ github.ref_name }}')"
|
|
MESSAGE="$(json_escape "$COMMIT_MESSAGE")"
|
|
AVATAR_URL="$(json_escape "$AVATAR_URL")"
|
|
|
|
cat > /tmp/discord-payload.json <<EOF
|
|
{
|
|
"username": "FlockPal Build",
|
|
"avatar_url": "${AVATAR_URL}",
|
|
"embeds": [
|
|
{
|
|
"title": "${STATUS_TITLE}",
|
|
"url": "${RUN_URL}",
|
|
"description": "FlockPal production deploy",
|
|
"color": ${COLOR},
|
|
"fields": [
|
|
{
|
|
"name": "Branch",
|
|
"value": "${BRANCH}",
|
|
"inline": true
|
|
},
|
|
{
|
|
"name": "Message",
|
|
"value": "${MESSAGE}",
|
|
"inline": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
EOF
|
|
|
|
curl --fail --show-error --silent \
|
|
-H "Content-Type: application/json" \
|
|
-d @/tmp/discord-payload.json \
|
|
"$DISCORD_WEBHOOK_URL" || echo "Discord notification failed."
|