From 234ccc8f011fbb3e5f6332980960c050aed3c355 Mon Sep 17 00:00:00 2001 From: Emilien Escalle Date: Wed, 5 Oct 2022 09:32:01 +0200 Subject: [PATCH] feat: supports multiple compose files (#8) Co-authored-by: Emilien Escalle --- .github/workflows/main.yml | 8 ++++++++ README.md | 10 +++++++++- action.yml | 2 +- docker/docker-compose.ci.yml | 6 ++++++ main.js | 23 +++++++++++++---------- post.js | 12 ++++++------ utils.js | 17 +++++++++++++++++ 7 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 docker/docker-compose.ci.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b19f9f9..cddfbf5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,3 +25,11 @@ jobs: compose-file: "./docker/docker-compose.yml" compose-flags: "--profile profile-1" down-flags: "--volumes" + - uses: ./ + with: + compose-file: | + ./docker/docker-compose.yml + ./docker/docker-compose.ci.yml + services: | + helloworld2 + helloworld4 \ No newline at end of file diff --git a/README.md b/README.md index 7e1d3a7..afa14bf 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,14 @@ This action runs your docker-compose file and clean up before action finished. **Optional** The name of the compose file. Default `"./docker-compose.yml"`. +It can be a list of files: + +```yml +compose-file: | + docker-compose.yml + docker-compose.ci.yml +``` + ### `services` **Optional** Just perform `docker-compose up` to one service instead of all of them @@ -22,7 +30,7 @@ This action runs your docker-compose file and clean up before action finished. ### `compose-flags` -**Optional** Used to specify flags to pass to the `docker-compose` command. Default is none. A full list of flags can be found in the [docker-compose documentation](https://docs.docker.com/compose/reference/#command-options-overview-and-help). +**Optional** Used to specify flags to pass to the `docker-compose` command. Default is none. A full list of flags can be found in the [docker-compose documentation](https://docs.docker.com/compose/reference/#command-options-overview-and-help). ## Example usage diff --git a/action.yml b/action.yml index ee1f4c2..ccbccf5 100644 --- a/action.yml +++ b/action.yml @@ -2,7 +2,7 @@ name: "Docker Compose Action" description: "Run your docker-compose file" inputs: compose-file: # id of input - description: "relative path to compose file" + description: "relative path to compose file(s)" required: false default: "./docker-compose.yml" compose-flags: # id of input diff --git a/docker/docker-compose.ci.yml b/docker/docker-compose.ci.yml new file mode 100644 index 0000000..5386610 --- /dev/null +++ b/docker/docker-compose.ci.yml @@ -0,0 +1,6 @@ +version: "3.8" + +services: + helloworld4: + profiles: [profile-2] + image: hello-world diff --git a/main.js b/main.js index a9a30f1..5861e53 100644 --- a/main.js +++ b/main.js @@ -1,22 +1,21 @@ const core = require("@actions/core"); const compose = require("docker-compose"); -const fs = require("fs"); const utils = require("./utils"); try { - const composeFile = core.getInput("compose-file"); - - if (!fs.existsSync(composeFile)) { - console.log(`${composeFile} not exists`); + const composeFiles = utils.parseComposeFiles( + core.getMultilineInput("compose-file") + ); + if (!composeFiles.length) { return; } - const services = core.getMultilineInput("services", { required: false });; + const services = core.getMultilineInput("services", { required: false }); const options = { - config: composeFile, + config: composeFiles, log: true, composeOptions: utils.parseFlags(core.getInput("compose-flags")), - commandOptions: utils.parseFlags(core.getInput("up-flags")) + commandOptions: utils.parseFlags(core.getInput("up-flags")), }; const promise = @@ -25,8 +24,12 @@ try { : compose.upAll(options); promise - .then(() => { console.log("compose started"); }) - .catch((err) => { core.setFailed(`compose up failed ${JSON.stringify(err)}`); }); + .then(() => { + console.log("compose started"); + }) + .catch((err) => { + core.setFailed(`compose up failed ${JSON.stringify(err)}`); + }); } catch (error) { core.setFailed(error.message); } diff --git a/post.js b/post.js index 23301ba..8484cf6 100644 --- a/post.js +++ b/post.js @@ -1,20 +1,20 @@ const core = require("@actions/core"); const compose = require("docker-compose"); -const fs = require("fs"); const utils = require("./utils"); try { - const composeFile = core.getInput("compose-file"); - if (!fs.existsSync(composeFile)) { - console.log(`${composeFile} not exists`); + const composeFiles = utils.parseComposeFiles( + core.getMultilineInput("compose-file") + ); + if (!composeFiles.length) { return; } const options = { - config: composeFile, + config: composeFiles, log: true, composeOptions: utils.parseFlags(core.getInput("compose-flags")), - commandOptions: utils.parseFlags(core.getInput("up-flags")) + commandOptions: utils.parseFlags(core.getInput("up-flags")), }; compose.down(options).then( diff --git a/utils.js b/utils.js index 13451b1..83d7afd 100644 --- a/utils.js +++ b/utils.js @@ -1,3 +1,5 @@ +const fs = require("fs"); + module.exports.parseFlags = (flags) => { if (flags != null && typeof flags == "string" && flags.length > 0) { return flags.split(" "); @@ -5,3 +7,18 @@ module.exports.parseFlags = (flags) => { return []; }; + +module.exports.parseComposeFiles = (composeFiles) => { + return composeFiles.filter((composeFile) => { + if (!composeFile.length) { + return false; + } + + if (!fs.existsSync(composeFile)) { + console.log(`${composeFile} not exists`); + return false; + } + + return true; + }); +};