Create a new Fleet database migration with timestamp naming, Up function, init registration, and test file.
Create a migration for: $ARGUMENTS
Use make migration name=CamelCaseName if available, or generate manually:
date +%Y%m%d%H%M%S
The migration name should be descriptive CamelCase (e.g., AddRecoveryLockAutoRotateAt, CreateTableSoftwareInstallers).
Location: server/datastore/mysql/migrations/tables/{TIMESTAMP}_{Name}.go
package tables
import "database/sql"
func init() {
MigrationClient.AddMigration(Up_{TIMESTAMP}, Down_{TIMESTAMP})
}
func Up_{TIMESTAMP}(tx *sql.Tx) error {
_, err := tx.Exec(`
-- SQL statement here
`)
return err
}
func Down_{TIMESTAMP}(tx *sql.Tx) error {
return nil
}
Location: server/datastore/mysql/migrations/tables/{TIMESTAMP}_{Name}_test.go
package tables
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestUp_{TIMESTAMP}(t *testing.T) {
db := applyUpToPrev(t)
// Set up test data before migration if needed
applyNext(t, db)
// Verify migration applied correctly
// e.g., check table exists, columns added, data migrated
}
go build ./server/datastore/mysql/migrations/... to check compilationMYSQL_TEST=1 go test -run TestUp_{TIMESTAMP} ./server/datastore/mysql/migrations/tables/ to test the migrationreturn nil) — Fleet doesn't use rollback migrationsdata/ subdirectory