forked from
slices.network/slices
Highly ambitious ATProtocol AppView service and sdks
1name: Build and Deploy Slices API
2
3on:
4 workflow_dispatch:
5 pull_request:
6 branches: [main]
7 paths: ["api/**", "crates/slices-lexicon/**"]
8 push:
9 branches: [main]
10 paths: ["api/**", "crates/slicese-lexicon/**"]
11
12jobs:
13 build:
14 runs-on: ubuntu-latest
15 defaults:
16 run:
17 working-directory: api
18
19 steps:
20 - name: Checkout code
21 uses: actions/checkout@v4
22
23 - name: Install Nix
24 uses: DeterminateSystems/nix-installer-action@main
25 with:
26 logger: pretty
27
28 - name: Setup Nix cache
29 uses: DeterminateSystems/magic-nix-cache-action@main
30
31 - name: Check flake
32 run: nix flake check --refresh
33
34 - name: Build Rust binary
35 run: nix build .#slices
36
37 - name: Build Docker image
38 run: nix build .#slicesImg
39
40 - name: Load Docker image
41 run: docker load < result
42
43 - name: Start PostgreSQL for testing
44 run: |
45 docker run -d --name postgres-test \
46 -e POSTGRES_DB=slice_test \
47 -e POSTGRES_USER=slice \
48 -e POSTGRES_PASSWORD=slice_test_password \
49 -p 5432:5432 \
50 postgres:15
51
52 # Wait for PostgreSQL to start
53 sleep 10
54
55 - name: Test Docker image
56 run: |
57 # Check PostgreSQL is running
58 echo "Checking PostgreSQL status..."
59 docker ps | grep postgres-test
60 docker logs postgres-test
61
62 # Test PostgreSQL connection
63 echo "Testing PostgreSQL connection..."
64 docker exec postgres-test psql -U slice -d slice_test -c "SELECT version();"
65
66 # Start the Slice container with PostgreSQL backend
67 echo "Starting Slice container..."
68 docker run -d --name slice-test -p 8080:8080 \
69 -e HTTP_PORT=8080 \
70 -e DATABASE_URL=postgresql://slice:slice_test_password@host.docker.internal:5432/slice_test \
71 --add-host host.docker.internal:host-gateway \
72 slices:latest
73
74 # Wait for the service to start and show logs
75 echo "Waiting for service to start..."
76 sleep 10
77
78 echo "Checking all containers (including exited)..."
79 docker ps -a | grep -E "(slice-test|postgres-test)" || true
80
81 echo "Checking Slice container status..."
82 docker ps | grep slice-test || echo "Slice container not running!"
83
84 echo "Slice container logs:"
85 docker logs slice-test 2>&1 || echo "Failed to get logs"
86
87 echo "Checking if slice container exited:"
88 docker inspect slice-test --format='{{.State.Status}}' || echo "Container not found"
89 docker inspect slice-test --format='{{.State.ExitCode}}' || echo "No exit code"
90
91 # Additional wait
92 sleep 10
93
94 echo "Final Slice container logs:"
95 docker logs slice-test 2>&1 || echo "Failed to get final logs"
96
97 # Test the root endpoint with verbose output
98 echo "Testing root endpoint..."
99 curl -v -f http://localhost:8080 || {
100 echo "Curl failed, showing final logs:"
101 docker logs slice-test
102 docker logs postgres-test
103 exit 1
104 }
105
106 # Stop test containers
107 docker stop slice-test postgres-test
108 docker rm slice-test postgres-test
109
110 - name: Save Docker image as artifact
111 run: docker save slices:latest | gzip > slice-image.tar.gz
112
113 - name: Upload Docker image artifact
114 uses: actions/upload-artifact@v4
115 with:
116 name: slice-docker-image
117 path: api/slice-image.tar.gz
118 retention-days: 1
119
120 deploy:
121 # if: github.ref == 'refs/heads/main'
122 needs: build
123 runs-on: ubuntu-latest
124 defaults:
125 run:
126 working-directory: api
127
128 steps:
129 - name: Checkout code
130 uses: actions/checkout@v4
131
132 - name: Download Docker image artifact
133 uses: actions/download-artifact@v4
134 with:
135 name: slice-docker-image
136 path: api/
137
138 - name: Load Docker image
139 run: docker load < slice-image.tar.gz
140
141 - name: Tag for Fly.io
142 run: docker tag slices:latest registry.fly.io/slices-api:latest
143
144 - name: Setup Fly CLI
145 uses: superfly/flyctl-actions/setup-flyctl@master
146
147 - name: Login to Fly.io registry
148 run: flyctl auth docker
149 env:
150 FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
151
152 - name: Push to Fly.io registry
153 run: docker push registry.fly.io/slices-api:latest
154
155 - name: Deploy to Fly.io
156 run: flyctl deploy --image registry.fly.io/slices-api:latest
157 env:
158 FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}