diff --git a/atlasaction/comments/bitbucket.md b/atlasaction/comments/bitbucket.md new file mode 100644 index 00000000..2b12039a --- /dev/null +++ b/atlasaction/comments/bitbucket.md @@ -0,0 +1,42 @@ +{{- define "migrate-lint/md" -}} +`atlas migrate lint` on **{{ if eq .Env.Dir "." }}working directory{{ else }}{{ .Env.Dir }}{{ end }}** + +| Status | Step | Result | +| :----: | :--- | :----- | +| {{ template "lint-check/md" "success.svg" }} | {{ filesDetected .Files }} | {{ join (fileNames .Files) "
" }} | +{{ template "lint-report/md" . }} +{{- end -}} +{{- define "schema-plan/md" -}} +### Atlas detected changes to the desired schema + +{{ with .File -}} +#### Migration Plan {{- with .Link }} ([View on Atlas Cloud]({{- . -}})){{ end }} +{{- with .Migration -}}{{- codeblock "sql" . -}}{{- end }} +{{- end -}} +#### Atlas lint results + +| Status | Step | Result | +| :----: | :--- | :----- | +| {{ template "lint-check/md" "success.svg" }} | {{ with .File }}Detect schema changes | {{ stmtsDetected . }}{{ else -}} | {{ end }} | +{{ template "lint-report/md" .Lint -}} +{{- with .File }} + +--- + +##### 📝 Steps to edit this migration plan + +{{ template "plan-modify/md" . }} +{{- end -}} +{{- end -}} +{{- define "lint-report/md" -}} +{{- with .URL -}} +| {{ template "lint-check/md" "success.svg" }} | ERD and visual diff generated | [View Visualization]({{- printf "%s#erd" . -}}) | +{{ end }} +{{- with (.Steps | filterIssues) -}} +{{ range $step := . -}} +| {{ template "lint-check/md" (or (and ($step | stepIsError) "error.svg") "warning.svg") }} | {{ stepSummary $step | nl2br }} | {{ stepDetails $step | nl2br }} | +{{ end -}} +{{- else -}} +| {{ template "lint-check/md" "success.svg" }} | No issues found | {{ with .URL -}}[View Report]({{- . -}}){{- end }} | +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/atlasaction/comments/commons.md b/atlasaction/comments/commons.md index 371db08b..798a8fff 100644 --- a/atlasaction/comments/commons.md +++ b/atlasaction/comments/commons.md @@ -12,6 +12,9 @@ the database with the desired state. Otherwise, Atlas will report a schema drift atlas schema plan push --pending --file {{ .Name }}.plan.hcl ``` {{- end -}} +{{- define "lint-check/md" -}} +![]({{- assetsImage . }}) +{{- end -}} {{- define "lint-check" -}} {{- assetsImage . | image "20px" -}} {{- end -}} diff --git a/atlasaction/testdata/templates/migrate-lint-md.txtar b/atlasaction/testdata/templates/migrate-lint-md.txtar new file mode 100644 index 00000000..e54880e1 --- /dev/null +++ b/atlasaction/testdata/templates/migrate-lint-md.txtar @@ -0,0 +1,71 @@ +# no errors +render-lint migrate-lint/md data-0.json +cmp stdout golden-0.md + +# file with 2 issues +render-lint migrate-lint/md data-1.json +cmp stdout golden-1.md + +# 2 files, 1 with error, 1 with issue +render-lint migrate-lint/md data-2.json +cmp stdout golden-2.md + +# 1 checksum error +render-lint migrate-lint/md data-3.json +cmp stdout golden-3.md + +# non linear history error +render-lint migrate-lint/md data-4.json +cmp stdout golden-4.md + +-- data-0.json -- +{"URL":"https://migration-lint-report-url","Env":{"Dir":"testdata/migrations"},"Schema":{},"Steps":[{"Name":"Migration Integrity Check","Text":"File atlas.sum is valid"},{"Name":"Detect New Migration Files","Text":"Found 1 new migration files (from 1 total)"}],"Files":[{"Name":"20230925192914.sql"}]} +-- golden-0.md -- +`atlas migrate lint` on **testdata/migrations** + +| Status | Step | Result | +| :----: | :--- | :----- | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | 1 new migration file detected | 20230925192914.sql | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | ERD and visual diff generated | [View Visualization](https://migration-lint-report-url#erd) | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | No issues found | [View Report](https://migration-lint-report-url) | +-- data-1.json -- +{"URL":"https://migration-lint-report-url","Env":{"Dir":"."},"Schema":{},"Steps":[{"Name":"Migration Integrity Check","Text":"File atlas.sum is valid"},{"Name":"Detect New Migration Files","Text":"Found 1 new migration files (from 1 total)"},{"Name":"Analyze 20230925192914.sql","Text":"2 reports were found in analysis","Result":{"Name":"20230925192914.sql","Text":"CREATE UNIQUE INDEX idx_unique_fullname ON Persons (FirstName, LastName);\nALTER TABLE Persons ADD City varchar(255) NOT NULL;\n","Reports":[{"Text":"data dependent changes detected","Diagnostics":[{"Pos":0,"Text":"Adding a unique index \"idx_unique_fullname\" on table \"Persons\" might fail in case columns \"FirstName\", \"LastName\" contain duplicate entries","Code":"MF101"},{"Pos":0,"Text":"Adding a non-nullable \"varchar\" column \"City\" on table \"Persons\" without a default value implicitly sets existing rows with \"\"","Code":"MY101"}]}]}}],"Files":[{"Name":"20230925192914.sql","Reports":[{"Text":"","Diagnostics":[{"Pos":0,"Text":"Add unique index to existing column","Code":"MF101"},{"Pos":0,"Text":"Adding a non-nullable column to a table without a DEFAULT","Code":"MY101"}]}]}]} +-- golden-1.md -- +`atlas migrate lint` on **working directory** + +| Status | Step | Result | +| :----: | :--- | :----- | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | 1 new migration file detected | 20230925192914.sql | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | ERD and visual diff generated | [View Visualization](https://migration-lint-report-url#erd) | +| ![](https://release.ariga.io/images/assets/warning.svg?v=1) | Analyze 20230925192914.sql
2 reports were found in analysis | **Data dependent changes detected**
Adding a unique index "idx_unique_fullname" on table "Persons" might fail in case columns "FirstName", "LastName" contain duplicate entries [(MF101)](https://atlasgo.io/lint/analyzers#MF101)
Adding a non-nullable "varchar" column "City" on table "Persons" without a default value implicitly sets existing rows with "" [(MY101)](https://atlasgo.io/lint/analyzers#MY101) | +-- data-2.json -- +{"URL":"https://migration-lint-report-url","Env":{"Dir":"testdata/migrations"},"Schema":{},"Steps":[{"Name":"Migration Integrity Check","Text":"File atlas.sum is valid"},{"Name":"Detect New Migration Files","Text":"Found 1 new migration files (from 1 total)"},{"Name":"Analyze 20230925192914.sql","Text":"1 reports were found in analysis","Result":{"Name":"20230925192914.sql","Text":"CREATE UNIQUE INDEX idx_unique_fullname ON Persons (FirstName, LastName);","Reports":[{"Text":"data dependent changes detected","Diagnostics":[{"Pos":0,"Text":"Adding a unique index \"idx_unique_fullname\" on table \"Persons\" might fail in case columns \"FirstName\", \"LastName\" contain duplicate entries","Code":"MF101"}]}]}},{"Name":"Analyze 20240625104520_destructive.sql","Text":"1 reports were found in analysis","Result":{"Name":"20240625104520_destructive.sql","Text":"DROP TABLE Persons;\n\n","Reports":[{"Text":"destructive changes detected","Diagnostics":[{"Pos":0,"Text":"Dropping table \"Persons\"","Code":"DS102"}]}],"Error":"Destructive changes detected"}}],"Files":[{"Name":"20230925192914.sql","Error":"Destructive changes detected"},{"Name":"20230925192915.sql","Reports":[{"Text":"","Diagnostics":[{"Pos":0,"Text":"Missing the CONCURRENTLY in index creation","Code":"PG101"}]}]}]} +-- golden-2.md -- +`atlas migrate lint` on **testdata/migrations** + +| Status | Step | Result | +| :----: | :--- | :----- | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | 2 new migration files detected | 20230925192914.sql
20230925192915.sql | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | ERD and visual diff generated | [View Visualization](https://migration-lint-report-url#erd) | +| ![](https://release.ariga.io/images/assets/warning.svg?v=1) | Analyze 20230925192914.sql
1 reports were found in analysis | **Data dependent changes detected**
Adding a unique index "idx_unique_fullname" on table "Persons" might fail in case columns "FirstName", "LastName" contain duplicate entries [(MF101)](https://atlasgo.io/lint/analyzers#MF101) | +| ![](https://release.ariga.io/images/assets/error.svg?v=1) | Analyze 20240625104520_destructive.sql
1 reports were found in analysis | **Destructive changes detected**
Dropping table "Persons" [(DS102)](https://atlasgo.io/lint/analyzers#DS102) | +-- data-3.json -- +{"URL":"https://migration-lint-report-url","Env":{"Dir":"testdata/migrations"},"Schema":{},"Steps":[{"Name":"Migration Integrity Check","Text":"File atlas.sum is invalid","Error":"checksum mismatch"}],"Files":[{"Name":"20230925192914.sql","Error":"checksum mismatch"}]} +-- golden-3.md -- +`atlas migrate lint` on **testdata/migrations** + +| Status | Step | Result | +| :----: | :--- | :----- | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | 1 new migration file detected | 20230925192914.sql | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | ERD and visual diff generated | [View Visualization](https://migration-lint-report-url#erd) | +| ![](https://release.ariga.io/images/assets/error.svg?v=1) | Migration Integrity Check
File atlas.sum is invalid | checksum mismatch | +-- data-4.json -- +{"URL":"https://migration-lint-report-url","Env":{"Dir":"testdata/migrations"},"Schema":{},"Steps":[{"Name":"Migration Integrity Check","Text":"File atlas.sum is valid"},{"Name":"Detected 1 non-additive change","Text":"Pulling the the latest git changes might fix this warning","Result":{"Reports":[{"Text":"","Diagnostics":[{"Pos":0,"Text":"File 20240613102407.sql is missing or has been removed. Changes that have already been applied will not be reverted","Code":""}]}]}}]} +-- golden-4.md -- +`atlas migrate lint` on **testdata/migrations** + +| Status | Step | Result | +| :----: | :--- | :----- | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | No migration files detected | | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | ERD and visual diff generated | [View Visualization](https://migration-lint-report-url#erd) | +| ![](https://release.ariga.io/images/assets/warning.svg?v=1) | Detected 1 non-additive change
Pulling the the latest git changes might fix this warning | File 20240613102407.sql is missing or has been removed. Changes that have already been applied will not be reverted | diff --git a/atlasaction/testdata/templates/schema-plan-md.txtar b/atlasaction/testdata/templates/schema-plan-md.txtar new file mode 100644 index 00000000..9855fc57 --- /dev/null +++ b/atlasaction/testdata/templates/schema-plan-md.txtar @@ -0,0 +1,92 @@ +render-schema-plan schema-plan/md data-1.json +cmp stdout golden-1.md + +render-schema-plan schema-plan/md data-2.json +cmp stdout golden-2.md + +render-schema-plan schema-plan/md data-3.json +cmp stdout golden-3.md +-- data-1.json -- +{"Env":{"Driver":"sqlserver","URL":{"Scheme":"sqlserver","Opaque":"","User":{},"Host":"host.docker.internal:39445","Path":"","RawPath":"","OmitHost":false,"ForceQuery":false,"RawQuery":"database=master\u0026mode=database","Fragment":"","RawFragment":"","Schema":""}},"Repo":"bitbucket-e2e","Lint":{"Env":{"Driver":"sqlserver","URL":{"Scheme":"sqlserver","Opaque":"","User":{},"Host":"host.docker.internal:39445","Path":"","RawPath":"","OmitHost":false,"ForceQuery":false,"RawQuery":"database=master\u0026mode=database","Fragment":"","RawFragment":"","Schema":""}},"Schema":{},"Steps":[{"Name":"Analyze pr-1-VwDs28An.sql","Text":"0 reports were found in analysis","Result":{"Name":"pr-1-VwDs28An.sql","Text":"-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] ADD [StorageKey] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL;\n"}}],"Files":[{"Name":"pr-1-VwDs28An.sql","Text":"-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] ADD [StorageKey] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL;\n"}]},"File":{"Name":"pr-1-VwDs28An","FromHash":"VwDs28An8dyAzzfEHiqF9k9XiotM5uDQxXSXp0mKWFA=","ToHash":"ae2Xr0Ir2B5ztK//Jdtg7x/CvffsebUWBZL25wdE4dc=","Migration":"-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] ADD [StorageKey] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL;\n","Stmts":[{"Pos":24,"Text":"ALTER TABLE [MySchema].[Image] ADD [StorageKey] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL;","Comments":["-- Modify \"Image\" table\n"]}],"URL":"atlas://bitbucket-e2e/plans/pr-1-VwDs28An","Link":"https://ariga-atlas.atlasgo.cloud/schemas/141733923334/plans/210453398560","Status":"PENDING"}} +-- golden-1.md -- +### Atlas detected changes to the desired schema + +#### Migration Plan ([View on Atlas Cloud](https://ariga-atlas.atlasgo.cloud/schemas/141733923334/plans/210453398560)) + +```sql +-- Modify "Image" table +ALTER TABLE [MySchema].[Image] ADD [StorageKey] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL; +``` + +#### Atlas lint results + +| Status | Step | Result | +| :----: | :--- | :----- | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | Detect schema changes | 1 new statement detected | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | No issues found | | + +--- + +##### 📝 Steps to edit this migration plan + +1\. Run the following command to pull the generated plan to your local workstation: +```bash +atlas schema plan pull --url "atlas://bitbucket-e2e/plans/pr-1-VwDs28An" > pr-1-VwDs28An.plan.hcl +``` + +2\. Open `pr-1-VwDs28An` in your editor and modify it as needed. Note that the result of the plan should align +the database with the desired state. Otherwise, Atlas will report a schema drift. + +3\. Push the updated plan to the registry using the following command: +```bash +atlas schema plan push --pending --file pr-1-VwDs28An.plan.hcl +``` +-- data-2.json -- +{"Env":{"Driver":"sqlserver","URL":{"Scheme":"sqlserver","Opaque":"","User":{},"Host":"host.docker.internal:39445","Path":"","RawPath":"","OmitHost":false,"ForceQuery":false,"RawQuery":"database=master\u0026mode=database","Fragment":"","RawFragment":"","Schema":""}},"Repo":"bitbucket-e2e","Lint":{"Env":{"Driver":"sqlserver","URL":{"Scheme":"sqlserver","Opaque":"","User":{},"Host":"host.docker.internal:39445","Path":"","RawPath":"","OmitHost":false,"ForceQuery":false,"RawQuery":"database=master\u0026mode=database","Fragment":"","RawFragment":"","Schema":""}},"Schema":{},"Steps":[{"Name":"Analyze pr-1-VwDs28An.sql","Text":"0 reports were found in analysis","Result":{"Name":"pr-1-VwDs28An.sql","Text":"-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] ADD [StorageKey] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL;\n"}}],"Files":[{"Name":"pr-1-VwDs28An.sql","Text":"-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] ADD [StorageKey] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL;\n"}]},"File":null} +-- golden-2.md -- +### Atlas detected changes to the desired schema + +#### Atlas lint results + +| Status | Step | Result | +| :----: | :--- | :----- | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | | | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | No issues found | | +-- data-3.json -- +{"Env":{"Driver":"sqlserver","URL":{"Scheme":"sqlserver","Opaque":"","User":{},"Host":"host.docker.internal:35283","Path":"","RawPath":"","OmitHost":false,"ForceQuery":false,"RawQuery":"database=master\u0026mode=database","Fragment":"","RawFragment":"","Schema":""}},"Repo":"bitbucket-e2e","Lint":{"Env":{"Driver":"sqlserver","URL":{"Scheme":"sqlserver","Opaque":"","User":{},"Host":"host.docker.internal:35283","Path":"","RawPath":"","OmitHost":false,"ForceQuery":false,"RawQuery":"database=master\u0026mode=database","Fragment":"","RawFragment":"","Schema":""}},"Schema":{},"Steps":[{"Name":"Analyze pr-3-ae2Xr0Ir.sql","Text":"1 reports were found in analysis","Result":{"Name":"pr-3-ae2Xr0Ir.sql","Text":"-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] DROP COLUMN [Description];\n-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] DROP COLUMN [StorageKey];\n","Reports":[{"Text":"destructive changes detected","Diagnostics":[{"Pos":24,"Text":"Dropping non-virtual column \"Description\"","Code":"DS103","SuggestedFixes":[{"Message":"Add a pre-migration check to ensure column \"Description\" is NULL before dropping it"}]},{"Pos":106,"Text":"Dropping non-virtual column \"StorageKey\"","Code":"DS103","SuggestedFixes":[{"Message":"Add a pre-migration check to ensure column \"StorageKey\" is NULL before dropping it"}]}]}],"Error":"destructive changes detected"}}],"Files":[{"Name":"pr-3-ae2Xr0Ir.sql","Text":"-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] DROP COLUMN [Description];\n-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] DROP COLUMN [StorageKey];\n","Reports":[{"Text":"destructive changes detected","Diagnostics":[{"Pos":24,"Text":"Dropping non-virtual column \"Description\"","Code":"DS103","SuggestedFixes":[{"Message":"Add a pre-migration check to ensure column \"Description\" is NULL before dropping it"}]},{"Pos":106,"Text":"Dropping non-virtual column \"StorageKey\"","Code":"DS103","SuggestedFixes":[{"Message":"Add a pre-migration check to ensure column \"StorageKey\" is NULL before dropping it"}]}]}],"Error":"destructive changes detected"}]},"File":{"Name":"pr-3-ae2Xr0Ir","FromHash":"ae2Xr0Ir2B5ztK//Jdtg7x/CvffsebUWBZL25wdE4dc=","ToHash":"DntscM4aNcMzI+ZL/0DLj29fGfIjTaYaUYydNFa4cqE=","Migration":"-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] DROP COLUMN [Description];\n-- Modify \"Image\" table\nALTER TABLE [MySchema].[Image] DROP COLUMN [StorageKey];\n","Stmts":[{"Pos":24,"Text":"ALTER TABLE [MySchema].[Image] DROP COLUMN [Description];","Comments":["-- Modify \"Image\" table\n"]},{"Pos":106,"Text":"ALTER TABLE [MySchema].[Image] DROP COLUMN [StorageKey];","Comments":["-- Modify \"Image\" table\n"]}],"URL":"atlas://bitbucket-e2e/plans/pr-3-ae2Xr0Ir","Link":"https://ariga-atlas.atlasgo.cloud/schemas/141733923334/plans/210453398623","Status":"PENDING"}} +-- golden-3.md -- +### Atlas detected changes to the desired schema + +#### Migration Plan ([View on Atlas Cloud](https://ariga-atlas.atlasgo.cloud/schemas/141733923334/plans/210453398623)) + +```sql +-- Modify "Image" table +ALTER TABLE [MySchema].[Image] DROP COLUMN [Description]; +-- Modify "Image" table +ALTER TABLE [MySchema].[Image] DROP COLUMN [StorageKey]; +``` + +#### Atlas lint results + +| Status | Step | Result | +| :----: | :--- | :----- | +| ![](https://release.ariga.io/images/assets/success.svg?v=1) | Detect schema changes | 2 new statements detected | +| ![](https://release.ariga.io/images/assets/error.svg?v=1) | Analyze pr-3-ae2Xr0Ir.sql
1 reports were found in analysis | **Destructive changes detected**
Dropping non-virtual column "Description" [(DS103)](https://atlasgo.io/lint/analyzers#DS103)
Dropping non-virtual column "StorageKey" [(DS103)](https://atlasgo.io/lint/analyzers#DS103) | + + +--- + +##### 📝 Steps to edit this migration plan + +1\. Run the following command to pull the generated plan to your local workstation: +```bash +atlas schema plan pull --url "atlas://bitbucket-e2e/plans/pr-3-ae2Xr0Ir" > pr-3-ae2Xr0Ir.plan.hcl +``` + +2\. Open `pr-3-ae2Xr0Ir` in your editor and modify it as needed. Note that the result of the plan should align +the database with the desired state. Otherwise, Atlas will report a schema drift. + +3\. Push the updated plan to the registry using the following command: +```bash +atlas schema plan push --pending --file pr-3-ae2Xr0Ir.plan.hcl +```