Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/deploy-vps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,6 @@ jobs:
port: ${{ env.VPS_SSH_PORT }}
script: |
cd ~/projects/DevImpact || cd /app || exit 1
git fetch origin main
git reset --hard origin/main
bash ops/deploy/deploy-leaderboard.sh
26 changes: 20 additions & 6 deletions ops/deploy/deploy-leaderboard.sh
Original file line number Diff line number Diff line change
@@ -1,39 +1,53 @@
#!/usr/bin/env bash
set -euo pipefail

# Determine script directory and path to compose file
# Determine script directory, project root, and compose file
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
COMPOSE_FILE="${SCRIPT_DIR}/../docker/leaderboard-compose.yml"
ENV_FILE="${PROJECT_ROOT}/.env"

echo "=================================================="
echo " DevImpact Leaderboard Worker Deployment"
echo "=================================================="
echo "Project Root: ${PROJECT_ROOT}"
echo "Compose File: ${COMPOSE_FILE}"

if [ ! -f "${COMPOSE_FILE}" ]; then
echo "Error: Compose file not found at ${COMPOSE_FILE}" >&2
exit 1
fi

ENV_ARGS=()
if [ -f "${ENV_FILE}" ]; then
echo "Env File: ${ENV_FILE} (found)"
ENV_ARGS+=(--env-file "${ENV_FILE}")
else
echo "Warning: .env file not found at ${ENV_FILE}. Proceeding with system environment..." >&2
fi

echo "[1/3] Pulling latest GHCR image..."
docker compose -f "${COMPOSE_FILE}" pull
docker compose --project-directory "${PROJECT_ROOT}" "${ENV_ARGS[@]}" -f "${COMPOSE_FILE}" pull

# Check if worker container is running and an active calculation is in progress
# Check if worker container exists and an active calculation is in progress
CONTAINER_NAME="devimpact-leaderboard-cron"
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "[2/3] Checking for active leaderboard calculation..."
while docker exec "${CONTAINER_NAME}" pgrep -f "calculate-next-country" > /dev/null 2>&1 || \
docker exec "${CONTAINER_NAME}" sh -c 'ps aux | grep -v grep | grep -q "calculate-next-country"'; do
docker exec "${CONTAINER_NAME}" sh -c 'ps aux | grep -v grep | grep -q "calculate-next-country"' > /dev/null 2>&1; do
echo " >> A leaderboard calculation job is currently running. Waiting for it to finish..."
sleep 10
done
echo " >> No active calculation running (or active calculation completed)."
echo " >> Removing previous container to prevent name conflicts..."
docker stop "${CONTAINER_NAME}" > /dev/null 2>&1 || true
docker rm -f "${CONTAINER_NAME}" > /dev/null 2>&1 || true
else
echo "[2/3] Worker container is not running yet."
fi

echo "[3/3] Recreating leaderboard worker container with new image..."
docker compose -f "${COMPOSE_FILE}" up -d --remove-orphans
docker compose --project-directory "${PROJECT_ROOT}" "${ENV_ARGS[@]}" -f "${COMPOSE_FILE}" up -d --remove-orphans

echo "=================================================="
echo " Leaderboard Worker Deployed Successfully!"
Expand Down
18 changes: 2 additions & 16 deletions ops/docker/leaderboard-compose.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
name: devimpact-leaderboard

services:
leaderboard-cron:
image: ${LEADERBOARD_IMAGE:-ghcr.io/o2sa/devimpact-leaderboard:latest}
Expand All @@ -8,21 +10,5 @@ services:
- path: ${ENV_FILE:-../../.env}
required: false
environment:
GITHUB_TOKEN: ${GITHUB_TOKEN}
DATABASE_URL: ${DATABASE_URL}
REDIS_URL: ${REDIS_URL}
REDIS_ENABLED: ${REDIS_ENABLED:-false}
REDIS_PASSWORD: ${REDIS_PASSWORD}
REDIS_CACHE_NAMESPACE: ${REDIS_CACHE_NAMESPACE:-devimpact:v1}
REDIS_CACHE_TTL_SECONDS: ${REDIS_CACHE_TTL_SECONDS:-604800}
REDIS_CONNECT_TIMEOUT_MS: ${REDIS_CONNECT_TIMEOUT_MS:-1500}
LEADERBOARD_CRON_SCHEDULE: ${LEADERBOARD_CRON_SCHEDULE:-0 0 * * *}
LEADERBOARD_SOURCE_URL_TEMPLATE: ${LEADERBOARD_SOURCE_URL_TEMPLATE:-https://raw.githubusercontent.com/ashkulz/committers.top/gh-pages/_data/locations/{country}.yml}
LEADERBOARD_SEED_LIMIT: ${LEADERBOARD_SEED_LIMIT:-256}
LEADERBOARD_REFRESH_LIMIT: ${LEADERBOARD_REFRESH_LIMIT:-500}
LEADERBOARD_USER_STALE_DAYS: ${LEADERBOARD_USER_STALE_DAYS:-30}
GITHUB_USER_STALE_DAYS: ${GITHUB_USER_STALE_DAYS:-14}
GITHUB_REPO_COUNT: ${GITHUB_REPO_COUNT:-30}
GITHUB_PR_COUNT: ${GITHUB_PR_COUNT:-80}
GITHUB_ISSUE_COUNT: ${GITHUB_ISSUE_COUNT:-20}
GITHUB_DISCUSSION_COUNT: ${GITHUB_DISCUSSION_COUNT:-10}
Loading