Check / check (pull_request) Successful in 5m31s
Builds are tagged upaas-<app>:<short hash>, git's short form of the commit checked out, instead of the deployment number. The clone prints the short hash and fails without one. A redeploy of a commit gives the tag to the new image. The cleanup after a deploy now also finds the app's untagged images among those its deployments recorded, and removes them by ID once the app neither runs them nor would roll back to them. It keeps every image any app uses, since apps that build the same commit can share one. commit_sha is now saved on update so manual deploys keep the commit read from the clone. Model: opus-5-5
67 lines
1.8 KiB
Go
67 lines
1.8 KiB
Go
package deploy_test
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"sneak.berlin/go/upaas/internal/config"
|
|
"sneak.berlin/go/upaas/internal/service/deploy"
|
|
)
|
|
|
|
func TestCleanupCancelledDeploy_RemovesBuildDir(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tmpDir := t.TempDir()
|
|
cfg := &config.Config{DataDir: tmpDir}
|
|
|
|
svc := deploy.NewTestServiceWithConfig(slog.Default(), cfg, nil, nil)
|
|
|
|
// Create a fake build directory matching the deployment pattern
|
|
appName := "test-app"
|
|
buildDir := svc.GetBuildDirExported(appName)
|
|
require.NoError(t, os.MkdirAll(buildDir, 0o750))
|
|
|
|
// Create deployment-specific dir: <deploymentID>-<random>
|
|
deployDir := filepath.Join(buildDir, "42-abc123")
|
|
require.NoError(t, os.MkdirAll(deployDir, 0o750))
|
|
|
|
// Create a file inside to verify full removal
|
|
require.NoError(
|
|
t,
|
|
os.WriteFile(filepath.Join(deployDir, "work"), []byte("test"), 0o600),
|
|
)
|
|
|
|
// Also create a dir for a different deployment (should NOT be removed)
|
|
otherDir := filepath.Join(buildDir, "99-xyz789")
|
|
require.NoError(t, os.MkdirAll(otherDir, 0o750))
|
|
|
|
// Run cleanup for deployment 42
|
|
svc.CleanupCancelledDeploy(context.Background(), appName, 42, "")
|
|
|
|
// Deployment 42's dir should be gone
|
|
_, err := os.Stat(deployDir)
|
|
assert.True(t, os.IsNotExist(err), "deployment build dir should be removed")
|
|
|
|
// Deployment 99's dir should still exist
|
|
_, err = os.Stat(otherDir)
|
|
assert.NoError(t, err, "other deployment build dir should not be removed")
|
|
}
|
|
|
|
func TestCleanupCancelledDeploy_NoBuildDir(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tmpDir := t.TempDir()
|
|
cfg := &config.Config{DataDir: tmpDir}
|
|
|
|
svc := deploy.NewTestServiceWithConfig(slog.Default(), cfg, nil, nil)
|
|
|
|
// Should not panic when build dir doesn't exist
|
|
svc.CleanupCancelledDeploy(context.Background(), "nonexistent-app", 1, "")
|
|
}
|