feat: deploy

This commit is contained in:
2026-05-19 18:40:20 +02:00
parent f8e1e89a83
commit c536dcb623
13 changed files with 399 additions and 228 deletions
+77 -62
View File
@@ -5,14 +5,9 @@ on:
branches: ["main"]
env:
REGISTRY: gitea.leonmorival.com
IMAGE_NAME: daily_meal/bemeal-api
KAMAL_IMAGE: ghcr.io/basecamp/kamal:v2.11.0
jobs:
# =========================
# TESTS
# =========================
test:
name: Tests Unitaires
runs-on: ubuntu-latest
@@ -31,13 +26,10 @@ jobs:
with:
args: >
bash -c "composer install --no-interaction --ignore-platform-req=ext-intl
&& php artisan test"
&& php artisan test --compact"
# =========================
# BUILD & PUSH
# =========================
build:
name: Build & Push Docker
deploy:
name: Deploy with Kamal
needs: test
runs-on: ubuntu-latest
@@ -45,61 +37,84 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
- name: Login to Gitea Registry
run: |
echo "${{ secrets.TOKEN_GITEA }}" \
| docker login $REGISTRY \
-u "${{ github.actor }}" \
--password-stdin
- name: Build & Push image
run: |
IMAGE=$REGISTRY/$IMAGE_NAME
docker build -t "$IMAGE:${{ github.sha }}" -t "$IMAGE:latest" .
docker push "$IMAGE:${{ github.sha }}"
docker push "$IMAGE:latest"
# =========================
# DEPLOY (SIMPLE)
# =========================
deploy:
name: Deploy
needs: build
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.3
- name: Prepare SSH agent
env:
IMAGE_TAG: ${{ github.sha }}
REGISTRY: gitea.leonmorival.com
IMAGE_NAME: daily_meal/bemeal-api
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: IMAGE_TAG,REGISTRY,IMAGE_NAME
script: |
set -eu
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
run: |
set -eu
APP_DIR="/opt/bemeal"
cd "$APP_DIR"
eval "$(ssh-agent -s)"
echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >> "$GITHUB_ENV"
COMPOSE="docker compose \
--project-directory $APP_DIR \
--env-file $APP_DIR/.env.prod \
-f $APP_DIR/docker-compose.prod.yml"
printf '%s\n' "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
IMAGE="$REGISTRY/$IMAGE_NAME:$IMAGE_TAG"
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keyscan -H "${SSH_HOST:-89.167.35.217}" >> ~/.ssh/known_hosts
echo "Pull image"
docker pull "$IMAGE"
- name: Prepare Kamal network
env:
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_USER: ${{ secrets.SSH_USER }}
run: |
set -eu
echo "Start infra services"
$COMPOSE up -d pgsql redis meilisearch
REMOTE_HOST="${SSH_HOST:-89.167.35.217}"
REMOTE_USER="${SSH_USER:-root}"
echo "Deploy API (blue/green handled by Caddy)"
IMAGE="$IMAGE" $COMPOSE up -d --no-deps --force-recreate bemeal-api-blue
IMAGE="$IMAGE" $COMPOSE up -d --no-deps --force-recreate bemeal-api-green
ssh "$REMOTE_USER@$REMOTE_HOST" <<'EOF'
set -eu
echo "Deployment done"
docker network inspect kamal >/dev/null 2>&1 || docker network create kamal
for container in bemeal-pgsql bemeal-redis bemeal-meilisearch bemeal-adminer; do
if docker inspect "$container" >/dev/null 2>&1; then
docker network connect kamal "$container" >/dev/null 2>&1 || true
fi
done
EOF
- name: Write Kamal secrets
run: |
set -eu
mkdir -p .kamal
cat > .kamal/secrets <<'EOF'
GITEA_TOKEN=$GITEA_TOKEN
APP_KEY=$APP_KEY
DB_DATABASE=$DB_DATABASE
DB_USERNAME=$DB_USERNAME
DB_PASSWORD=$DB_PASSWORD
MEILISEARCH_KEY=$MEILISEARCH_KEY
EOF
chmod 600 .kamal/secrets
- name: Deploy
env:
GITEA_TOKEN: ${{ secrets.TOKEN_GITEA }}
APP_KEY: ${{ secrets.APP_KEY }}
DB_DATABASE: ${{ secrets.DB_DATABASE }}
DB_USERNAME: ${{ secrets.DB_USERNAME }}
DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
MEILISEARCH_KEY: ${{ secrets.MEILISEARCH_KEY }}
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_USER: ${{ secrets.SSH_USER }}
run: |
set -eu
docker run --rm \
-v "$PWD:/workdir" \
-v "$SSH_AUTH_SOCK:/ssh-agent" \
-v "$HOME/.ssh:/root/.ssh:ro" \
-v /var/run/docker.sock:/var/run/docker.sock \
-e SSH_AUTH_SOCK=/ssh-agent \
-e GITEA_TOKEN \
-e APP_KEY \
-e DB_DATABASE \
-e DB_USERNAME \
-e DB_PASSWORD \
-e MEILISEARCH_KEY \
-e SSH_HOST \
-e SSH_USER \
"$KAMAL_IMAGE" deploy