name: Build and Deploy Slices API on: workflow_dispatch: pull_request: branches: [main] paths: ["api/**", "crates/slices-lexicon/**"] push: branches: [main] paths: ["api/**", "crates/slicese-lexicon/**"] jobs: build: runs-on: ubuntu-latest defaults: run: working-directory: api steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Nix uses: DeterminateSystems/nix-installer-action@main with: logger: pretty - name: Setup Nix cache uses: DeterminateSystems/magic-nix-cache-action@main - name: Check flake run: nix flake check --refresh - name: Build Rust binary run: nix build .#slices - name: Build Docker image run: nix build .#slicesImg - name: Load Docker image run: docker load < result - name: Start PostgreSQL for testing run: | docker run -d --name postgres-test \ -e POSTGRES_DB=slice_test \ -e POSTGRES_USER=slice \ -e POSTGRES_PASSWORD=slice_test_password \ -p 5432:5432 \ postgres:15 # Wait for PostgreSQL to start sleep 10 - name: Test Docker image run: | # Check PostgreSQL is running echo "Checking PostgreSQL status..." docker ps | grep postgres-test docker logs postgres-test # Test PostgreSQL connection echo "Testing PostgreSQL connection..." docker exec postgres-test psql -U slice -d slice_test -c "SELECT version();" # Start the Slice container with PostgreSQL backend echo "Starting Slice container..." docker run -d --name slice-test -p 8080:8080 \ -e HTTP_PORT=8080 \ -e DATABASE_URL=postgresql://slice:slice_test_password@host.docker.internal:5432/slice_test \ --add-host host.docker.internal:host-gateway \ slices:latest # Wait for the service to start and show logs echo "Waiting for service to start..." sleep 10 echo "Checking all containers (including exited)..." docker ps -a | grep -E "(slice-test|postgres-test)" || true echo "Checking Slice container status..." docker ps | grep slice-test || echo "Slice container not running!" echo "Slice container logs:" docker logs slice-test 2>&1 || echo "Failed to get logs" echo "Checking if slice container exited:" docker inspect slice-test --format='{{.State.Status}}' || echo "Container not found" docker inspect slice-test --format='{{.State.ExitCode}}' || echo "No exit code" # Additional wait sleep 10 echo "Final Slice container logs:" docker logs slice-test 2>&1 || echo "Failed to get final logs" # Test the root endpoint with verbose output echo "Testing root endpoint..." curl -v -f http://localhost:8080 || { echo "Curl failed, showing final logs:" docker logs slice-test docker logs postgres-test exit 1 } # Stop test containers docker stop slice-test postgres-test docker rm slice-test postgres-test - name: Save Docker image as artifact run: docker save slices:latest | gzip > slice-image.tar.gz - name: Upload Docker image artifact uses: actions/upload-artifact@v4 with: name: slice-docker-image path: api/slice-image.tar.gz retention-days: 1 deploy: # if: github.ref == 'refs/heads/main' needs: build runs-on: ubuntu-latest defaults: run: working-directory: api steps: - name: Checkout code uses: actions/checkout@v4 - name: Download Docker image artifact uses: actions/download-artifact@v4 with: name: slice-docker-image path: api/ - name: Load Docker image run: docker load < slice-image.tar.gz - name: Tag for Fly.io run: docker tag slices:latest registry.fly.io/slices-api:latest - name: Setup Fly CLI uses: superfly/flyctl-actions/setup-flyctl@master - name: Login to Fly.io registry run: flyctl auth docker env: FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} - name: Push to Fly.io registry run: docker push registry.fly.io/slices-api:latest - name: Deploy to Fly.io run: flyctl deploy --image registry.fly.io/slices-api:latest env: FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}