feat: deploy
This commit is contained in:
+77
-62
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user