Skip to content

Commit d8e6a2e

Browse files
ivanduplenskikhDmitrii Bobreshev (Akvelon INC)
and
Dmitrii Bobreshev (Akvelon INC)
authored
Add DockerComposeV1 task and refactoring DockerComposeV0 (#20085)
* Update task.loc messages * Add DockerComposeV1 * Add DockerComposeV1 to the CODEOWNERS * Set the docker compose v2 util as default for the DockerComposeV1 task * Add condition for COMPATIBILITY flag * Remove useDockerComposeV2 FF * Add DockerComposemV1 task to make-options * Remove buildConfig from DockerComposeV1 and add Node20 handler as default * Update DockerComposeV1 task version * Bump DockerComposeV0 task version * Changed if empty condition for docker which result * Build DockerComposeV0 * Update resjson manually * Update DockerComposeV1 * Update unit tests * Check in unit tests if docker cli exists * Update unit tests and deprecationMessage * Add unit tests * Update unit tests DockerComposeV1 * Remove compatibility answers * Update DockerComposeV1 resources.resjson * Update L0Linux * Show stdout & stderr in tests * Add console.log with composeCommand * Generated task * Enable system debug * Update * Change Node20 to Node20_1 --------- Co-authored-by: Dmitrii Bobreshev (Akvelon INC) <[email protected]>
1 parent fa50b3a commit d8e6a2e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+6500
-1156
lines changed

.github/CODEOWNERS

+2
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ Tasks/DockerV2/ @microsoft/release-management-task-team @manolerazvan
193193

194194
Tasks/DockerComposeV0/ @microsoft/release-management-task-team @manolerazvan
195195

196+
Tasks/DockerComposeV1/ @microsoft/release-management-task-team @manolerazvan
197+
196198
Tasks/DockerInstallerV0/ @microsoft/release-management-task-team @manolerazvan
197199

198200
Tasks/DotNetCoreCLIV2/ @microsoft/akvelon-build-task-team @DergachevE

Tasks/DockerComposeV0/Strings/resources.resjson/en-US/resources.resjson

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,5 @@
8282
"loc.messages.ImageNameWithoutTag": "Image name not specified with tag, pushing all tags of the image specified.",
8383
"loc.messages.WritingDockerConfigToTempFile": "Writing Docker config to temp file. File path: %s, Docker config: %s",
8484
"loc.messages.InvalidProjectName": "The project name \"%s\" must be a valid docker compose project name. Follow the link for more details: https://docs.docker.com/compose/project-name/#set-a-project-name",
85-
"loc.messages.MigrateToDockerComposeV2": "The task is utilizing Docker Compose V1, but there are plans to transition to Docker Compose V2. It's necessary to investigate how to adapt your project to Docker Compose V2. For guidance on this migration, you can refer to the official Docker Compose documentation at the provided link: https://docs.docker.com/compose/migrate/"
85+
"loc.messages.MigrateToDockerComposeV2": "The task is using Docker Compose V1, which is end-of-life and will be removed from Microsoft-hosted agents July 24. Pipelines running on Microsoft-hosted agents should be updated for Docker Compose v2 compatibility e.g. use compatible container names. For guidance on required updates, please refer to the official Docker Compose documentation at https://docs.docker.com/compose/migrate/"
8686
}

Tasks/DockerComposeV0/Tests/L0.ts

+310-340
Large diffs are not rendered by default.

Tasks/DockerComposeV0/Tests/L0Linux.ts

+22-22
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId";
3333
process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey";
3434
process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant";
3535
process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName";
36-
process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId";
37-
process.env["ENDPOINT_DATA_AzureRMSpn_SPNOBJECTID"] = "oId";
36+
process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId";
37+
process.env["ENDPOINT_DATA_AzureRMSpn_SPNOBJECTID"] = "oId";
3838
process.env['AGENT_HOMEDIRECTORY'] = '/tmp/tempdir/100/';
3939

4040
// provide answers for task mock
@@ -48,27 +48,27 @@ let a: any = <any>{
4848
"docker-compose": true
4949
},
5050
"exec": {
51-
"docker-compose -f /tmp/tempdir/100/docker-compose.yml build" :{
51+
"docker-compose -f /tmp/tempdir/100/docker-compose.yml build": {
5252
"code": 0,
5353
"stdout": "sucessfully built the service images"
5454
},
55-
"docker compose --compatibility -f /tmp/tempdir/100/docker-compose.yml build" :{
55+
"docker compose -f /tmp/tempdir/100/docker-compose.yml build": {
5656
"code": 0,
5757
"stdout": "sucessfully built the service images"
5858
},
59-
"docker-compose-userdefined -f /tmp/tempdir/100/docker-compose.yml build" :{
59+
"docker-compose-userdefined -f /tmp/tempdir/100/docker-compose.yml build": {
6060
"code": 0,
6161
"stdout": "sucessfully built the service images"
6262
},
63-
"docker-compose -f /tmp/tempdir/100/docker-compose.yml config" :{
63+
"docker-compose -f /tmp/tempdir/100/docker-compose.yml config": {
6464
"code": 0,
6565
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: /tmp/tempdir/100\n ports:\n - 5000:5000/tcp\n volumes:\n - /tmp/tempdir/100:/code:rw\nversion: '2.0'"
6666
},
67-
"docker compose --compatibility -f /tmp/tempdir/100/docker-compose.yml config" :{
67+
"docker compose -f /tmp/tempdir/100/docker-compose.yml config": {
6868
"code": 0,
6969
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: /tmp/tempdir/100\n ports:\n - 5000:5000/tcp\n volumes:\n - /tmp/tempdir/100:/code:rw\nversion: '2.0'"
7070
},
71-
"docker-compose-userdefined -f /tmp/tempdir/100/docker-compose.yml config" :{
71+
"docker-compose-userdefined -f /tmp/tempdir/100/docker-compose.yml config": {
7272
"code": 0,
7373
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: /tmp/tempdir/100\n ports:\n - 5000:5000/tcp\n volumes:\n - /tmp/tempdir/100:/code:rw\nversion: '2.0'"
7474
},
@@ -80,59 +80,59 @@ let a: any = <any>{
8080
"code": 0,
8181
"stdout": "sucessfully ran services"
8282
},
83-
"docker compose --compatibility -f /tmp/tempdir/100/docker-compose.yml up": {
83+
"docker compose -f /tmp/tempdir/100/docker-compose.yml up": {
8484
"code": 0,
8585
"stdout": "sucessfully ran services"
8686
},
87-
"docker push ajgtestacr1.azurecr.io/100_web":{
87+
"docker push ajgtestacr1.azurecr.io/100_web": {
8888
"code": 0,
8989
"stdout": "successfully pushed with qualified image"
9090
},
91-
"docker-compose -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/docker-compose.override.yml up -d":{
91+
"docker-compose -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/docker-compose.override.yml up -d": {
9292
"code": 0,
9393
"stdout": "successfully ran up command"
9494
},
95-
"docker compose --compatibility -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/docker-compose.override.yml up -d":{
95+
"docker compose -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/docker-compose.override.yml up -d": {
9696
"code": 0,
9797
"stdout": "successfully ran up command"
9898
},
99-
"docker-compose -f /tmp/tempdir/100/docker-compose.yml up -d":{
99+
"docker-compose -f /tmp/tempdir/100/docker-compose.yml up -d": {
100100
"code": 0,
101101
"stdout": "successfully ran up command"
102102
},
103-
"docker compose --compatibility -f /tmp/tempdir/100/docker-compose.yml up -d":{
103+
"docker compose -f /tmp/tempdir/100/docker-compose.yml up -d": {
104104
"code": 0,
105105
"stdout": "successfully ran up command"
106106
},
107-
"docker-compose -f /tmp/tempdir/100/docker-compose.yml build --pull --parallel" :{
107+
"docker-compose -f /tmp/tempdir/100/docker-compose.yml build --pull --parallel": {
108108
"code": 0,
109109
"stdout": "sucessfully built the service images"
110110
},
111-
"docker compose --compatibility -f /tmp/tempdir/100/docker-compose.yml build --pull --parallel" :{
111+
"docker compose -f /tmp/tempdir/100/docker-compose.yml build --pull --parallel": {
112112
"code": 0,
113113
"stdout": "sucessfully built the service images"
114114
},
115-
"docker-compose -f /tmp/tempdir/100/docker-compose.yml pull service1 service2" :{
115+
"docker-compose -f /tmp/tempdir/100/docker-compose.yml pull service1 service2": {
116116
"code": 0,
117117
"stdout": "successfully pulled the passed service images"
118118
},
119-
"docker compose --compatibility -f /tmp/tempdir/100/docker-compose.yml pull service1 service2" :{
119+
"docker compose -f /tmp/tempdir/100/docker-compose.yml pull service1 service2": {
120120
"code": 0,
121121
"stdout": "successfully pulled the passed service images"
122122
},
123-
"docker-compose -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/.docker-compose.12345.yml config":{
123+
"docker-compose -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/.docker-compose.12345.yml config": {
124124
"code": 0,
125125
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: /tmp/tempdir/100\n image: ajgtestacr1.azurecr.io/100_web\n ports:\n - 5000:5000/tcp\n volumes:\n - /tmp/tempdir/100:/code:rw\nversion: '2.0'"
126126
},
127-
"docker compose --compatibility -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/.docker-compose.12345.yml config":{
127+
"docker compose -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/.docker-compose.12345.yml config": {
128128
"code": 0,
129129
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: /tmp/tempdir/100\n image: ajgtestacr1.azurecr.io/100_web\n ports:\n - 5000:5000/tcp\n volumes:\n - /tmp/tempdir/100:/code:rw\nversion: '2.0'"
130130
},
131-
"docker-compose -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/docker-compose.override.yml config":{
131+
"docker-compose -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/docker-compose.override.yml config": {
132132
"code": 0,
133133
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: /tmp/tempdir/100\n image: ajgtestacr1.azurecr.io/100_web\n ports:\n - 5000:5000/tcp\n volumes:\n - /tmp/tempdir/100:/code:rw\nversion: '2.0'"
134134
},
135-
"docker compose --compatibility -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/docker-compose.override.yml config":{
135+
"docker compose -f /tmp/tempdir/100/docker-compose.yml -f /tmp/tempdir/100/docker-compose.override.yml config": {
136136
"code": 0,
137137
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: /tmp/tempdir/100\n image: ajgtestacr1.azurecr.io/100_web\n ports:\n - 5000:5000/tcp\n volumes:\n - /tmp/tempdir/100:/code:rw\nversion: '2.0'"
138138
}

Tasks/DockerComposeV0/Tests/L0Windows.ts

+12-8
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ let a: any = <any>{
5252
"code": 0,
5353
"stdout": "sucessfully built the service images"
5454
},
55-
"docker compose --compatibility -f F:\\dir2\\docker-compose.yml build" : {
55+
"docker compose -f F:\\dir2\\docker-compose.yml build" : {
5656
"code": 0,
5757
"stdout": "sucessfully built the service images"
5858
},
@@ -64,7 +64,7 @@ let a: any = <any>{
6464
"code": 0,
6565
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: C:\\docketest\n ports:\n - 5000:5000/tcp\n volumes:\n - C:\\docketest:/code:rw\nversion: '2.0'"
6666
},
67-
"docker compose --compatibility -f F:\\dir2\\docker-compose.yml config" : {
67+
"docker compose -f F:\\dir2\\docker-compose.yml config" : {
6868
"code": 0,
6969
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: C:\\docketest\n ports:\n - 5000:5000/tcp\n volumes:\n - C:\\docketest:/code:rw\nversion: '2.0'"
7070
},
@@ -80,19 +80,23 @@ let a: any = <any>{
8080
"code": 0,
8181
"stdout": "sucessfully ran services"
8282
},
83+
"docker compose -f F:\\dir2\\docker-compose.yml up": {
84+
"code": 0,
85+
"stdout": "sucessfully ran services"
86+
},
8387
"docker-compose -f F:\\dir2\\docker-compose.yml build --pull --parallel" : {
8488
"code": 0,
8589
"stdout": "sucessfully built the service images"
8690
},
87-
"docker compose --compatibility -f F:\\dir2\\docker-compose.yml build --pull --parallel" : {
91+
"docker compose -f F:\\dir2\\docker-compose.yml build --pull --parallel" : {
8892
"code": 0,
8993
"stdout": "sucessfully built the service images"
9094
},
9195
"docker-compose -f F:\\dir2\\docker-compose.yml -f F:\\dir2\\.docker-compose.12345.yml config": {
9296
"code": 0,
9397
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: F:\\dir2\n image: ajgtestacr1.azurecr.io/dir2_web\n ports:\n - 5000:5000/tcp\n volumes:\n - F:\\dir2:/code:rw\nversion: '2.0'"
9498
},
95-
"docker compose --compatibility -f F:\\dir2\\docker-compose.yml -f F:\\dir2\\.docker-compose.12345.yml config": {
99+
"docker compose -f F:\\dir2\\docker-compose.yml -f F:\\dir2\\.docker-compose.12345.yml config": {
96100
"code": 0,
97101
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: F:\\dir2\n image: ajgtestacr1.azurecr.io/dir2_web\n ports:\n - 5000:5000/tcp\n volumes:\n - F:\\dir2:/code:rw\nversion: '2.0'"
98102
},
@@ -104,31 +108,31 @@ let a: any = <any>{
104108
"code": 0,
105109
"stdout": "successfully ran up command"
106110
},
107-
"docker compose --compatibility -f F:\\dir2\\docker-compose.yml -f F:\\dir2\\docker-compose.override.yml up -d": {
111+
"docker compose -f F:\\dir2\\docker-compose.yml -f F:\\dir2\\docker-compose.override.yml up -d": {
108112
"code": 0,
109113
"stdout": "successfully ran up command"
110114
},
111115
"docker-compose -f F:\\dir2\\docker-compose.yml -f F:\\dir2\\docker-compose.override.yml config": {
112116
"code": 0,
113117
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: F:\\dir2\n image: ajgtestacr1.azurecr.io/dir2_web\n ports:\n - 5000:5000/tcp\n volumes:\n - F:\\dir2:/code:rw\nversion: '2.0'"
114118
},
115-
"docker compose --compatibility -f F:\\dir2\\docker-compose.yml -f F:\\dir2\\docker-compose.override.yml config": {
119+
"docker compose -f F:\\dir2\\docker-compose.yml -f F:\\dir2\\docker-compose.override.yml config": {
116120
"code": 0,
117121
"stdout": "services:\n redis:\n image: redis:alpine\n web:\n build:\n context: F:\\dir2\n image: ajgtestacr1.azurecr.io/dir2_web\n ports:\n - 5000:5000/tcp\n volumes:\n - F:\\dir2:/code:rw\nversion: '2.0'"
118122
},
119123
"docker-compose -f F:\\dir2\\docker-compose.yml up -d": {
120124
"code": 0,
121125
"stdout": "successfully ran up command"
122126
},
123-
"docker compose --compatibility -f F:\\dir2\\docker-compose.yml up -d": {
127+
"docker compose -f F:\\dir2\\docker-compose.yml up -d": {
124128
"code": 0,
125129
"stdout": "successfully ran up command"
126130
},
127131
"docker-compose -f F:\\dir2\\docker-compose.yml pull service1 service2" : {
128132
"code": 0,
129133
"stdout": "successfully pulled the passed service images"
130134
},
131-
"docker compose --compatibility -f F:\\dir2\\docker-compose.yml pull service1 service2" : {
135+
"docker compose -f F:\\dir2\\docker-compose.yml pull service1 service2" : {
132136
"code": 0,
133137
"stdout": "successfully pulled the passed service images"
134138
}

Tasks/DockerComposeV0/dockercomposeconnection.ts

+5-8
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,9 @@ export default class DockerComposeConnection extends ContainerConnection {
1919
private requireAdditionalDockerComposeFiles: boolean;
2020
private projectName: string;
2121
private finalComposeFile: string;
22-
private useDockerComposeV2: boolean;
2322

2423
constructor() {
2524
super();
26-
this.useDockerComposeV2 = tl.getBoolFeatureFlag("USE_DOCKER_COMPOSE_V2_COMPATIBLE_MODE");
2725
this.setDockerComposePath();
2826
this.dockerComposeFile = DockerComposeUtils.findDockerFile(tl.getInput("dockerComposeFile", true), tl.getInput("cwd"));
2927
if (!this.dockerComposeFile) {
@@ -95,7 +93,7 @@ export default class DockerComposeConnection extends ContainerConnection {
9593
public createComposeCommand(): tr.ToolRunner {
9694
var command = tl.tool(this.dockerComposePath);
9795

98-
if (this.useDockerComposeV2 && !tl.getInput('dockerComposePath')) {
96+
if (!tl.getInput('dockerComposePath')) {
9997
command.arg("compose");
10098
process.env["COMPOSE_COMPATIBILITY"] = "true";
10199
}
@@ -186,10 +184,9 @@ export default class DockerComposeConnection extends ContainerConnection {
186184
//Priority to docker-compose path provided by user
187185
this.dockerComposePath = tl.getInput('dockerComposePath');
188186
if (!this.dockerComposePath) {
189-
// If not use the docker-compose avilable on agent
190-
if (this.useDockerComposeV2) {
191-
this.dockerComposePath = tl.which("docker");
192-
} else {
187+
this.dockerComposePath = tl.which("docker");
188+
189+
if (!this.dockerComposePath) {
193190
this.dockerComposePath = tl.which("docker-compose");
194191
}
195192

@@ -204,7 +201,7 @@ export default class DockerComposeConnection extends ContainerConnection {
204201
private validateProjectNameDockerComposeV2() {
205202
tl.debug(`Start validating project name ${this.projectName}`);
206203

207-
if (this.dockerComposePath.includes("docker-compose") || !this.useDockerComposeV2) {
204+
if (this.dockerComposePath.includes("docker-compose")) {
208205
tl.warning(tl.loc("MigrateToDockerComposeV2"));
209206
return;
210207
}

Tasks/DockerComposeV0/task.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
"version": {
1515
"Major": 0,
1616
"Minor": 242,
17-
"Patch": 2
17+
"Patch": 4
1818
},
1919
"demands": [],
2020
"preview": "false",
21+
"deprecated": true,
22+
"deprecationMessage": "The DockerCompose@0 task is deprecated. The task uses docker-compose v1 which no longer receives update since July 2023. To use docker compose v2, use the DockerCompose@1 task.",
2123
"groups": [
2224
{
2325
"name": "advanced",
@@ -357,6 +359,6 @@
357359
"ImageNameWithoutTag": "Image name not specified with tag, pushing all tags of the image specified.",
358360
"WritingDockerConfigToTempFile": "Writing Docker config to temp file. File path: %s, Docker config: %s",
359361
"InvalidProjectName": "The project name \"%s\" must be a valid docker compose project name. Follow the link for more details: https://docs.docker.com/compose/project-name/#set-a-project-name",
360-
"MigrateToDockerComposeV2": "The task is utilizing Docker Compose V1, but there are plans to transition to Docker Compose V2. It's necessary to investigate how to adapt your project to Docker Compose V2. For guidance on this migration, you can refer to the official Docker Compose documentation at the provided link: https://docs.docker.com/compose/migrate/"
362+
"MigrateToDockerComposeV2": "The task is using Docker Compose V1, which is end-of-life and will be removed from Microsoft-hosted agents July 24. Pipelines running on Microsoft-hosted agents should be updated for Docker Compose v2 compatibility e.g. use compatible container names. For guidance on required updates, please refer to the official Docker Compose documentation at https://docs.docker.com/compose/migrate/"
361363
}
362364
}

Tasks/DockerComposeV0/task.loc.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
"version": {
1515
"Major": 0,
1616
"Minor": 242,
17-
"Patch": 2
17+
"Patch": 4
1818
},
1919
"demands": [],
2020
"preview": "false",
21+
"deprecated": true,
22+
"deprecationMessage": "The DockerCompose@0 task is deprecated. The task uses docker-compose v1 which no longer receives update since July 2023. To use docker compose v2, use the DockerCompose@1 task.",
2123
"groups": [
2224
{
2325
"name": "advanced",

0 commit comments

Comments
 (0)