Compare commits
1 Commits
feature/de
...
1880626dbd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1880626dbd |
21
TODO.md
21
TODO.md
@@ -53,8 +53,8 @@
|
||||
- [x] Deployment logs storage
|
||||
- [x] View deployment history per app
|
||||
- [x] Container logs viewing
|
||||
- [ ] Deployment rollback to previous image
|
||||
- [ ] Deployment cancellation
|
||||
- [x] Deployment rollback to previous image
|
||||
- [x] Deployment cancellation
|
||||
|
||||
### Manual Container Controls
|
||||
- [x] Restart container
|
||||
@@ -116,10 +116,9 @@
|
||||
- [x] Deployment history page
|
||||
- [x] Login page
|
||||
- [x] Setup page
|
||||
- [ ] Container logs page
|
||||
- [x] Container logs page
|
||||
- [ ] Webhook event history page
|
||||
- [ ] Settings page (webhook secret, SSH public key)
|
||||
- [ ] Real-time deployment log streaming (WebSocket/SSE)
|
||||
|
||||
### Future Considerations
|
||||
- [ ] Multi-user support with roles
|
||||
@@ -201,18 +200,18 @@ Protected Routes (require auth):
|
||||
- Validate paths before saving
|
||||
|
||||
### 3.2 Deployment Rollback
|
||||
- [ ] Add `previous_image_id` column to apps table
|
||||
- [x] Add `previous_image_id` column to apps table
|
||||
- Store last successful image ID before new deploy
|
||||
- [ ] Add `POST /apps/:id/rollback` endpoint
|
||||
- [x] Add `POST /apps/:id/rollback` endpoint
|
||||
- Stop current container
|
||||
- Start container with previous image
|
||||
- Create deployment record for rollback
|
||||
- [ ] Update deploy service to save previous image before building new one
|
||||
- [x] Update deploy service to save previous image before building new one
|
||||
|
||||
### 3.3 Deployment Cancellation
|
||||
- [ ] Add cancellation context to deploy service
|
||||
- [ ] Add `POST /apps/:id/deployments/:id/cancel` endpoint
|
||||
- [ ] Handle cleanup of partial builds/containers
|
||||
- [x] Add cancellation context to deploy service
|
||||
- [x] Add `POST /apps/:id/deployments/:id/cancel` endpoint
|
||||
- [x] Handle cleanup of partial builds/containers
|
||||
|
||||
## Phase 4: Lower Priority (Nice to Have)
|
||||
|
||||
@@ -240,8 +239,6 @@ Protected Routes (require auth):
|
||||
- [ ] Add settings page
|
||||
- View/regenerate webhook secret
|
||||
- View SSH public key
|
||||
- [ ] Add real-time deployment log streaming
|
||||
- WebSocket or SSE for live build output
|
||||
|
||||
### 4.4 Observability
|
||||
- [ ] Add structured logging for all operations
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
package deploy_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"log/slog"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"git.eeqj.de/sneak/upaas/internal/models"
|
||||
"git.eeqj.de/sneak/upaas/internal/service/deploy"
|
||||
)
|
||||
|
||||
func TestRollback_NoPreviousImage(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
svc := deploy.NewTestService(slog.Default())
|
||||
app := &models.App{
|
||||
ID: "app-rollback-1",
|
||||
PreviousImageID: sql.NullString{},
|
||||
}
|
||||
|
||||
err := svc.Rollback(context.Background(), app)
|
||||
assert.ErrorIs(t, err, deploy.ErrNoPreviousImage)
|
||||
}
|
||||
|
||||
func TestRollback_EmptyPreviousImage(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
svc := deploy.NewTestService(slog.Default())
|
||||
app := &models.App{
|
||||
ID: "app-rollback-2",
|
||||
PreviousImageID: sql.NullString{String: "", Valid: true},
|
||||
}
|
||||
|
||||
err := svc.Rollback(context.Background(), app)
|
||||
assert.ErrorIs(t, err, deploy.ErrNoPreviousImage)
|
||||
}
|
||||
|
||||
func TestRollback_DeploymentLocked(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
svc := deploy.NewTestService(slog.Default())
|
||||
|
||||
// Simulate a deploy holding the lock
|
||||
assert.True(t, svc.TryLockApp("app-rollback-3"))
|
||||
defer svc.UnlockApp("app-rollback-3")
|
||||
|
||||
app := &models.App{
|
||||
ID: "app-rollback-3",
|
||||
PreviousImageID: sql.NullString{String: "sha256:abc123", Valid: true},
|
||||
}
|
||||
|
||||
err := svc.Rollback(context.Background(), app)
|
||||
assert.ErrorIs(t, err, deploy.ErrDeploymentInProgress)
|
||||
}
|
||||
|
||||
func TestRollback_LockedApp(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
svc := deploy.NewTestService(slog.Default())
|
||||
|
||||
assert.True(t, svc.TryLockApp("app-rollback-4"))
|
||||
defer svc.UnlockApp("app-rollback-4")
|
||||
|
||||
app := &models.App{
|
||||
ID: "app-rollback-4",
|
||||
PreviousImageID: sql.NullString{String: "sha256:abc123", Valid: true},
|
||||
}
|
||||
|
||||
err := svc.Rollback(context.Background(), app)
|
||||
assert.ErrorIs(t, err, deploy.ErrDeploymentInProgress)
|
||||
}
|
||||
Reference in New Issue
Block a user