diff --git a/.env.sample b/.env.sample index fa6a0fabaa..073cf6b0c2 100644 --- a/.env.sample +++ b/.env.sample @@ -104,4 +104,7 @@ MINIO_DATA_DIR= # this environment variable is for setting the environment variable for Image Upload size -IMAGE_SIZE_LIMIT_KB=3000 \ No newline at end of file +IMAGE_SIZE_LIMIT_KB=3000 + +# This environment variable is for setting the working directory when Docker is used +PWD=. \ No newline at end of file diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 44b5939049..1fac810783 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -295,7 +295,134 @@ jobs: with: path: './coverage/lcov.info' min_coverage: 95.0 - + + Docker-Check: + needs: Test-Application + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '22.x' + + - name: Cache Node.js dependencies + uses: actions/cache@v4 + with: + path: | + ~/.npm + node_modules + key: ${{ runner.os }}-docker-check-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-docker-check- + + - name: Install Docker Compose + run: | + sudo apt-get update + sudo apt-get install -y docker-compose + + - name: Check if Talawa API starts in Docker + run: | + # Ensure no containers are running + docker-compose -f docker-compose.dev.yaml down -v || true + + # Verify docker-compose file exists + if [ ! -f "docker-compose.dev.yaml" ]; then + echo "Error: docker-compose.dev.yaml not found" + docker-compose -f docker-compose.dev.yaml logs + exit 1 + fi + + # Start containers + if ! timeout 300 docker-compose -f docker-compose.dev.yaml up -d --build; then + echo "Failed to start containers" + docker-compose -f docker-compose.dev.yaml logs + exit 1 + fi + + # Wait for MongoDB and Redis to be ready + echo "Waiting for MongoDB..." + timeout=30 + until docker-compose -f docker-compose.dev.yaml exec -T mongodb mongosh --eval "db.runCommand({ ping: 1 }).ok">/dev/null 2>&1 || [ $timeout -eq 0 ]; do + echo "Waiting for MongoDB to be ready..." + sleep 1 + ((timeout--)) + done + if [ $timeout -eq 0 ]; then + echo "Error: MongoDB failed to start within timeout" + echo "Fetching MongoDB logs..." + docker-compose -f docker-compose.dev.yaml logs mongodb + echo "Shutting down MongoDB..." + docker-compose -f docker-compose.dev.yaml down -v + exit 1 + + else + echo "MongoDB is ready!" + fi + + echo "Waiting for Redis..." + timeout=30 + until docker-compose -f docker-compose.dev.yaml exec -T redis-stack-server redis-cli ping >/dev/null 2>&1 || [ $timeout -eq 0 ]; do + sleep 1 + ((timeout--)) + done + if [ $timeout -eq 0 ]; then + echo "Error: Redis failed to start within timeout" + echo "Fetching Redis logs..." + docker-compose -f docker-compose.dev.yaml logs redis-stack-server + echo "Shutting down Redis..." + docker-compose -f docker-compose.dev.yaml down -v + exit 1 + + else + echo "Redis is ready!" + fi + + # Wait for TALAWA API to be healthy + timeout=60 + until docker-compose -f docker-compose.dev.yaml exec -T talawa-api-dev curl -v -X OPTIONS "http://talawa-api-dev:4000/graphql" 2>&1 || [ $timeout -eq 0 ]; do + echo "Waiting for API to start... ($timeout seconds remaining)" + sleep 1 + ((timeout--)) + done + + if [ $timeout -eq 0 ]; then + echo "Error: API failed to start within timeout" + docker-compose -f docker-compose.dev.yaml logs + docker-compose -f docker-compose.dev.yaml down -v + exit 1 + fi + + echo "API started successfully" + + # Ensure cleanup runs even if the script fails + cleanup() { + local exit_code=$? + echo "Cleaning up containers..." + if ! docker-compose -f docker-compose.dev.yaml down -v; then + echo "Warning: Failed to cleanup containers" + fi + exit $exit_code + } + trap cleanup EXIT + env: + HEALTH_CHECK_URL: http://localhost:4000 + COMPOSE_PROJECT_NAME: pr-${{ github.event.pull_request.number }} + MONGO_DB_URL: mongodb://mongodb:27017/talawa-test-db + REDIS_HOST: redis-stack-server + REDIS_PORT: 6379 + ACCESS_TOKEN_SECRET: ${{ secrets.GITHUB_TOKEN }}_${{ github.run_id }}_${{ github.run_number }} + REFRESH_TOKEN_SECRET: ${{ secrets.GITHUB_TOKEN }}_${{ github.run_id }}_${{ github.run_attempt }} + LAST_RESORT_SUPERADMIN_EMAIL: "abc@gmail.com" + COLORIZE_LOGS: "true" + LOG_LEVEL: "info" + RECAPTCHA_SITE_KEY: ${{secrets.RECAPTCHA_SITE_KEY}} + RECAPTCHA_SECRET_KEY: ${{secrets.RECAPTCHA_SECRET_KEY}} + MAIL_USERNAME: ${{secrets.MAIL_USERNAME}} + MAIL_PASSWORD: ${{secrets.MAIL_PASSWORD}} + JSDocs: if: ${{ github.actor != 'dependabot[bot]' }} name: 'JSDocs comments and pipeline' diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index 12907723b7..99086d1f9d 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -1,5 +1,3 @@ -version: "3.8" - services: mongodb: image: mongo:latest @@ -37,6 +35,9 @@ services: build: context: . dockerfile: Dockerfile.dev + container_name: talawa-api-dev + ports: + - "4000:4000" volumes: - .:/usr/src/app - /usr/src/app/node_modules @@ -45,30 +46,17 @@ services: - redis-stack-server - minio environment: - - MONGO_DB_URL=mongodb://mongodb:27017 + - MONGO_DB_URL=mongodb://mongodb:27017/talawa-api - REDIS_HOST=redis-stack-server - REDIS_PORT=6379 - - caddy: - image: caddy/caddy:2.2.1-alpine - container_name: caddy-service - restart: unless-stopped - ports: - - "80:80" - - "443:443" - volumes: - - ./Caddyfile:/etc/caddy/Caddyfile - - $PWD/site:/srv - - caddy_data:/data - - caddy_config:/config + networks: + - talawa-network volumes: mongodb-data: redis-data: - caddy_data: - caddy_config: minio-data: networks: talawa-network: - driver: bridge + driver: bridge \ No newline at end of file diff --git a/setup.ts b/setup.ts index bad4b347bd..4e1a689055 100644 --- a/setup.ts +++ b/setup.ts @@ -1015,6 +1015,14 @@ async function main(): Promise { const REDIS_PASSWORD = ""; const MINIO_ENDPOINT = "http://minio:9000"; + const { pwdVariable } = await inquirer.prompt({ + type: "input", + name: "pwdVariable", + message: + "Please enter the value for PWD (working directory for Docker setup):", + default: ".", + }); + const config = dotenv.parse(fs.readFileSync(".env")); config.MONGO_DB_URL = DB_URL; @@ -1022,18 +1030,21 @@ async function main(): Promise { config.REDIS_PORT = REDIS_PORT; config.REDIS_PASSWORD = REDIS_PASSWORD; config.MINIO_ENDPOINT = MINIO_ENDPOINT; + config.PWD = pwdVariable; process.env.MONGO_DB_URL = DB_URL; process.env.REDIS_HOST = REDIS_HOST; process.env.REDIS_PORT = REDIS_PORT; process.env.REDIS_PASSWORD = REDIS_PASSWORD; process.env.MINIO_ENDPOINT = MINIO_ENDPOINT; + process.env.PWD = pwdVariable; updateEnvVariable(config); console.log(`Your MongoDB URL is:\n${process.env.MONGO_DB_URL}`); console.log(`Your Redis host is:\n${process.env.REDIS_HOST}`); console.log(`Your Redis port is:\n${process.env.REDIS_PORT}`); console.log(`Your MinIO endpoint is:\n${process.env.MINIO_ENDPOINT}`); + console.log(`Your PWD value is:\n${process.env.PWD}`); } if (!isDockerInstallation) { diff --git a/tests/helpers/volunteers.ts b/tests/helpers/volunteers.ts index 1b17d5d4d0..ada916a6a3 100644 --- a/tests/helpers/volunteers.ts +++ b/tests/helpers/volunteers.ts @@ -138,8 +138,6 @@ export const createVolunteerAndActions = async (): Promise< }); const today = new Date(); - const yesterday = new Date(today); - yesterday.setDate(today.getDate() - 1); const twoWeeksAgo = new Date(today); twoWeeksAgo.setDate(today.getDate() - 14); const twoMonthsAgo = new Date(today);