Compare commits

..

5 Commits

Author SHA1 Message Date
dependabot[bot]
47413f941e
chore(deps): bump super-linter/super-linter
Bumps the docker-dependencies group with 1 update in the / directory: [super-linter/super-linter](https://github.com/super-linter/super-linter).


Updates `super-linter/super-linter` from slim-v8.0.0 to slim-v8.6.0
- [Release notes](https://github.com/super-linter/super-linter/releases)
- [Changelog](https://github.com/super-linter/super-linter/blob/main/CHANGELOG.md)
- [Commits](https://github.com/super-linter/super-linter/compare/v8...v8.6.0)

---
updated-dependencies:
- dependency-name: super-linter/super-linter
  dependency-version: slim-v8.6.0
  dependency-type: direct:production
  dependency-group: docker-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-17 04:19:02 +00:00
hoverkraft-bot[bot]
077eccb7f2 docs: update actions and workflows documentation
[skip ci]

Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-16 15:44:17 +00:00
copilot-swe-agent[bot]
d2bee4f07e feat: support OCI artifact compose-file inputs
Signed-off-by: Emilien Escalle <emilien.escalle@escemi.com>
2026-04-16 17:34:39 +02:00
dependabot[bot]
b542f028fa chore(deps): bump the github-actions-dependencies group with 2 updates:
Some checks failed
Internal - Main - Continuous Integration / ci (push) Has been cancelled
Need fix to Issue / main (push) Has been cancelled
Prepare release / release (push) Has been cancelled
Internal - Main - Continuous Integration / prepare-docs (push) Has been cancelled
Internal - Main - Continuous Integration / sync-docs (push) Has been cancelled
Mark stale issues and pull requests / main (push) Has been cancelled
---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions-dependencies
- dependency-name: hoverkraft-tech/ci-github-publish/.github/workflows/prepare-release.yml
  dependency-version: 0.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Emilien Escalle <emilien.escalle@escemi.com>
2026-04-10 10:43:24 +02:00
dependabot[bot]
506c87e9c6 chore(deps): bump @actions/github in the npm-actions-dependencies group
Bumps the npm-actions-dependencies group with 1 update:
- [@actions/github](https://github.com/actions/toolkit/tree/HEAD/packages/github)

Updates `@actions/github` from 9.0.0 to 9.1.0
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/github/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/github)

---
updated-dependencies:
- dependency-name: "@actions/github"
  dependency-version: 9.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-actions-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Emilien Escalle <emilien.escalle@escemi.com>
2026-04-10 10:31:21 +02:00
10 changed files with 144 additions and 54 deletions

View File

@ -170,6 +170,14 @@ jobs:
docker compose -f ./test/docker-compose.yml ps | grep test-service-a-1 || (echo "Service service-a is not running under custom context" && exit 1) docker compose -f ./test/docker-compose.yml ps | grep test-service-a-1 || (echo "Service service-a is not running under custom context" && exit 1)
(docker compose -f ./test/docker-compose.yml ps | grep test-service-b-1 && echo "Service service-b should not be running without profile" && exit 1) || true (docker compose -f ./test/docker-compose.yml ps | grep test-service-b-1 && echo "Service service-b should not be running without profile" && exit 1) || true
- name: Given OCI compose artifact when running action
assertion-name: "Then the OCI compose application runs"
compose-file: oci://localhost:5000/compose-action-test:latest
publish-oci-artifact: true
source-compose-file: ./test/docker-compose.yml
assertion: |
docker compose -f "$OCI_COMPOSE_FILE" ps service-a | grep service-a | grep "Up" || (echo "Service service-a is not running from the OCI artifact" && exit 1)
env: env:
DOCKER_COMPOSE_VERSION: ${{ matrix.expected-compose-version || '' }} DOCKER_COMPOSE_VERSION: ${{ matrix.expected-compose-version || '' }}
steps: steps:
@ -190,7 +198,7 @@ jobs:
- name: "Arrange: retrieve latest version of docker compose" - name: "Arrange: retrieve latest version of docker compose"
if: ${{ matrix.fetch-latest-compose }} if: ${{ matrix.fetch-latest-compose }}
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with: with:
script: | script: |
const dockerComposeVersion = (await github.rest.repos.getLatestRelease({ const dockerComposeVersion = (await github.rest.repos.getLatestRelease({
@ -200,6 +208,39 @@ jobs:
core.exportVariable('DOCKER_COMPOSE_VERSION', dockerComposeVersion); core.exportVariable('DOCKER_COMPOSE_VERSION', dockerComposeVersion);
- name: "Arrange: start local OCI registry"
if: ${{ matrix.publish-oci-artifact }}
# Keep the registry alive until the job ends because the action post hook
# reuses the OCI reference for docker compose logs and down.
run: |
OCI_REGISTRY_IMAGE=registry:2.8.3
OCI_REGISTRY_MAX_RETRIES=10
OCI_REGISTRY_RETRY_DELAY_SECONDS=1
# Keep the registry on port 5000 so it matches the OCI reference configured in the test matrix.
OCI_REGISTRY_CONTAINER_ID=$(docker run -d -p 5000:5000 "$OCI_REGISTRY_IMAGE")
echo "OCI_REGISTRY_CONTAINER_ID=$OCI_REGISTRY_CONTAINER_ID" >> "$GITHUB_ENV"
retry_count=0
while [ "$retry_count" -lt "$OCI_REGISTRY_MAX_RETRIES" ]; do
if curl --fail --silent http://localhost:5000/v2/ >/dev/null; then
exit 0
fi
retry_count=$((retry_count + 1))
sleep "$OCI_REGISTRY_RETRY_DELAY_SECONDS"
done
echo "Local OCI registry did not become ready on localhost:5000"
exit 1
- name: "Arrange: publish compose application as OCI artifact"
if: ${{ matrix.publish-oci-artifact }}
run: |
OCI_REPOSITORY="${{ matrix.compose-file }}"
OCI_PUBLISH_TARGET="${OCI_REPOSITORY#oci://}"
docker compose -f "${{ matrix.source-compose-file }}" publish "$OCI_PUBLISH_TARGET"
- name: "Arrange: ensure original docker compose version is not the expected one" - name: "Arrange: ensure original docker compose version is not the expected one"
if: ${{ matrix.ensure-version-mismatch }} if: ${{ matrix.ensure-version-mismatch }}
run: | run: |
@ -230,3 +271,4 @@ jobs:
run: ${{ matrix.assertion }} run: ${{ matrix.assertion }}
env: env:
IMAGE_NAME: ${{ matrix.image-name || '' }} IMAGE_NAME: ${{ matrix.image-name || '' }}
OCI_COMPOSE_FILE: ${{ matrix.compose-file || '' }}

View File

@ -15,12 +15,8 @@ permissions: {}
jobs: jobs:
release: release:
uses: hoverkraft-tech/ci-github-publish/.github/workflows/prepare-release.yml@5ff7d4c3910971ed53834becd5967271b4e228cf # 0.21.1 uses: hoverkraft-tech/ci-github-publish/.github/workflows/prepare-release.yml@b56be562f38e0e3e712f09691a8fe930aae9db1b # 0.22.0
permissions: permissions:
contents: write contents: read
id-token: write id-token: write
pull-requests: write pull-requests: write
with:
github-app-id: ${{ vars.CI_BOT_APP_ID }}
secrets:
github-app-key: ${{ secrets.CI_BOT_APP_PRIVATE_KEY }}

View File

@ -49,12 +49,12 @@ Some extra options can be passed to the `docker compose down` command using the
## Usage ## Usage
```yaml ```yaml
- uses: hoverkraft-tech/compose-action@4894d2492015c1774ee5a13a95b1072093087ec3 # v2.5.0 - uses: hoverkraft-tech/compose-action@d2bee4f07e8ca410d6b196d00f90c12e7d48c33a # v2.6.0
with: with:
# Additional options to pass to `docker` command. # Additional options to pass to `docker` command.
docker-flags: "" docker-flags: ""
# Path to compose file(s). It can be a list of files. It can be absolute or relative to the current working directory (cwd). # Path to compose file(s). It can be a list of files. It can be absolute or relative to the current working directory (cwd), or an OCI artifact reference starting with `oci://`.
# Default: `./docker-compose.yml` # Default: `./docker-compose.yml`
compose-file: ./docker-compose.yml compose-file: ./docker-compose.yml
@ -96,21 +96,21 @@ Some extra options can be passed to the `docker compose down` command using the
## Inputs ## Inputs
| **Input** | **Description** | **Required** | **Default** | | **Input** | **Description** | **Required** | **Default** |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------- | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------- |
| **`docker-flags`** | Additional options to pass to `docker` command. | **false** | - | | **`docker-flags`** | Additional options to pass to `docker` command. | **false** | - |
| **`compose-file`** | Path to compose file(s). It can be a list of files. It can be absolute or relative to the current working directory (cwd). | **false** | `./docker-compose.yml` | | **`compose-file`** | Path to compose file(s). It can be a list of files. It can be absolute or relative to the current working directory (cwd), or an OCI artifact reference starting with `oci://`. | **false** | `./docker-compose.yml` |
| **`services`** | Services to perform `docker compose up`. | **false** | - | | **`services`** | Services to perform `docker compose up`. | **false** | - |
| **`up-flags`** | Additional options to pass to `docker compose up` command. | **false** | - | | **`up-flags`** | Additional options to pass to `docker compose up` command. | **false** | - |
| **`down-flags`** | Additional options to pass to `docker compose down` command. | **false** | - | | **`down-flags`** | Additional options to pass to `docker compose down` command. | **false** | - |
| **`compose-flags`** | Additional options to pass to `docker compose` command. | **false** | - | | **`compose-flags`** | Additional options to pass to `docker compose` command. | **false** | - |
| **`cwd`** | Current working directory | **false** | `${{ github.workspace }}` | | **`cwd`** | Current working directory | **false** | `${{ github.workspace }}` |
| **`compose-version`** | Compose version to use. | **false** | - | | **`compose-version`** | Compose version to use. | **false** | - |
| | If null (default), it will use the current installed version. | | | | | If null (default), it will use the current installed version. | | |
| | If "latest", it will install the latest version. | | | | | If "latest", it will install the latest version. | | |
| **`services-log-level`** | The log level used for Docker Compose service logs. | **false** | `debug` | | **`services-log-level`** | The log level used for Docker Compose service logs. | **false** | `debug` |
| | Can be one of "debug", "info". | | | | | Can be one of "debug", "info". | | |
| **`github-token`** | The GitHub token used to create an authenticated client (to fetch the latest version of Docker Compose). | **false** | `${{ github.token }}` | | **`github-token`** | The GitHub token used to create an authenticated client (to fetch the latest version of Docker Compose). | **false** | `${{ github.token }}` |
<!-- inputs:end --> <!-- inputs:end -->
@ -139,7 +139,7 @@ jobs:
- uses: actions/checkout@v4.2.2 - uses: actions/checkout@v4.2.2
- name: Run docker compose - name: Run docker compose
uses: hoverkraft-tech/compose-action@4894d2492015c1774ee5a13a95b1072093087ec3 # v2.5.0 uses: hoverkraft-tech/compose-action@d2bee4f07e8ca410d6b196d00f90c12e7d48c33a # v2.6.0
with: with:
compose-file: "./docker/docker-compose.yml" compose-file: "./docker/docker-compose.yml"
@ -153,7 +153,7 @@ jobs:
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4.2.2 - uses: actions/checkout@v4.2.2
- uses: hoverkraft-tech/compose-action@4894d2492015c1774ee5a13a95b1072093087ec3 # v2.5.0 - uses: hoverkraft-tech/compose-action@d2bee4f07e8ca410d6b196d00f90c12e7d48c33a # v2.6.0
with: with:
compose-file: "./docker/docker-compose.yml" compose-file: "./docker/docker-compose.yml"
env: env:
@ -168,7 +168,7 @@ Perform `docker compose up` to some given service instead of all of them
steps: steps:
# need checkout before using compose-action # need checkout before using compose-action
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: hoverkraft-tech/compose-action@4894d2492015c1774ee5a13a95b1072093087ec3 # v2.5.0 - uses: hoverkraft-tech/compose-action@d2bee4f07e8ca410d6b196d00f90c12e7d48c33a # v2.6.0
with: with:
compose-file: "./docker/docker-compose.yml" compose-file: "./docker/docker-compose.yml"
services: | services: |
@ -206,7 +206,7 @@ A full list of flags can be found in the [Docker compose documentation](https://
steps: steps:
# need checkout before using compose-action # need checkout before using compose-action
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: hoverkraft-tech/compose-action@4894d2492015c1774ee5a13a95b1072093087ec3 # v2.5.0 - uses: hoverkraft-tech/compose-action@d2bee4f07e8ca410d6b196d00f90c12e7d48c33a # v2.6.0
with: with:
compose-file: "./docker/docker-compose.yml" compose-file: "./docker/docker-compose.yml"
compose-flags: "--profile profile-1" compose-flags: "--profile profile-1"
@ -220,7 +220,7 @@ This is useful when you have a base compose file and additional files for differ
steps: steps:
# need checkout before using compose-action # need checkout before using compose-action
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: hoverkraft-tech/compose-action@4894d2492015c1774ee5a13a95b1072093087ec3 # v2.5.0 - uses: hoverkraft-tech/compose-action@d2bee4f07e8ca410d6b196d00f90c12e7d48c33a # v2.6.0
with: with:
compose-file: | compose-file: |
./docker/docker-compose.yml ./docker/docker-compose.yml

View File

@ -25,7 +25,7 @@ inputs:
description: "Additional options to pass to `docker` command." description: "Additional options to pass to `docker` command."
required: false required: false
compose-file: compose-file:
description: "Path to compose file(s). It can be a list of files. It can be absolute or relative to the current working directory (cwd)." description: "Path to compose file(s). It can be a list of files. It can be absolute or relative to the current working directory (cwd), or an OCI artifact reference starting with `oci://`."
required: false required: false
default: "./docker-compose.yml" default: "./docker-compose.yml"
services: services:

25
dist/index.js generated vendored
View File

@ -43808,9 +43808,13 @@ class InputService {
getComposeFiles() { getComposeFiles() {
const cwd = this.getCwd(); const cwd = this.getCwd();
const composeFiles = getMultilineInput(InputNames.ComposeFile).filter((composeFile) => { const composeFiles = getMultilineInput(InputNames.ComposeFile).filter((composeFile) => {
if (!composeFile.trim().length) { const trimmedComposeFile = composeFile.trim();
if (!trimmedComposeFile.length) {
return false; return false;
} }
if (trimmedComposeFile.startsWith("oci://")) {
return true;
}
const possiblePaths = [(0,external_node_path_namespaceObject.join)(cwd, composeFile), composeFile]; const possiblePaths = [(0,external_node_path_namespaceObject.join)(cwd, composeFile), composeFile];
for (const path of possiblePaths) { for (const path of possiblePaths) {
if ((0,external_node_fs_namespaceObject.existsSync)(path)) { if ((0,external_node_fs_namespaceObject.existsSync)(path)) {
@ -44063,6 +44067,19 @@ function getProxyFetch(destinationUrl) {
function getApiBaseUrl() { function getApiBaseUrl() {
return process.env['GITHUB_API_URL'] || 'https://api.github.com'; return process.env['GITHUB_API_URL'] || 'https://api.github.com';
} }
function getUserAgentWithOrchestrationId(baseUserAgent) {
var _a;
const orchId = (_a = process.env['ACTIONS_ORCHESTRATION_ID']) === null || _a === void 0 ? void 0 : _a.trim();
if (orchId) {
const sanitizedId = orchId.replace(/[^a-z0-9_.-]/gi, '_');
const tag = `actions_orchestration_id/${sanitizedId}`;
if (baseUserAgent === null || baseUserAgent === void 0 ? void 0 : baseUserAgent.includes(tag))
return baseUserAgent;
const ua = baseUserAgent ? `${baseUserAgent} ` : '';
return `${ua}${tag}`;
}
return baseUserAgent;
}
//# sourceMappingURL=utils.js.map //# sourceMappingURL=utils.js.map
;// CONCATENATED MODULE: ./node_modules/universal-user-agent/index.js ;// CONCATENATED MODULE: ./node_modules/universal-user-agent/index.js
function getUserAgent() { function getUserAgent() {
@ -48174,6 +48191,7 @@ const defaults = {
} }
}; };
const GitHub = Octokit.plugin(restEndpointMethods, paginateRest).defaults(defaults); const GitHub = Octokit.plugin(restEndpointMethods, paginateRest).defaults(defaults);
/** /**
* Convience function to correctly format Octokit Options to pass into the constructor. * Convience function to correctly format Octokit Options to pass into the constructor.
* *
@ -48187,6 +48205,11 @@ function getOctokitOptions(token, options) {
if (auth) { if (auth) {
opts.auth = auth; opts.auth = auth;
} }
// Orchestration ID
const userAgent = getUserAgentWithOrchestrationId(opts.userAgent);
if (userAgent) {
opts.userAgent = userAgent;
}
return opts; return opts;
} }
//# sourceMappingURL=utils.js.map //# sourceMappingURL=utils.js.map

6
dist/post.js generated vendored
View File

@ -40060,9 +40060,13 @@ class InputService {
getComposeFiles() { getComposeFiles() {
const cwd = this.getCwd(); const cwd = this.getCwd();
const composeFiles = getMultilineInput(InputNames.ComposeFile).filter((composeFile) => { const composeFiles = getMultilineInput(InputNames.ComposeFile).filter((composeFile) => {
if (!composeFile.trim().length) { const trimmedComposeFile = composeFile.trim();
if (!trimmedComposeFile.length) {
return false; return false;
} }
if (trimmedComposeFile.startsWith("oci://")) {
return true;
}
const possiblePaths = [(0,external_node_path_namespaceObject.join)(cwd, composeFile), composeFile]; const possiblePaths = [(0,external_node_path_namespaceObject.join)(cwd, composeFile), composeFile];
for (const path of possiblePaths) { for (const path of possiblePaths) {
if ((0,external_node_fs_namespaceObject.existsSync)(path)) { if ((0,external_node_fs_namespaceObject.existsSync)(path)) {

34
package-lock.json generated
View File

@ -10,7 +10,7 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^3.0.0", "@actions/core": "^3.0.0",
"@actions/github": "^9.0.0", "@actions/github": "^9.1.0",
"@actions/tool-cache": "^4.0.0", "@actions/tool-cache": "^4.0.0",
"@octokit/action": "^8.0.4", "@octokit/action": "^8.0.4",
"docker-compose": "^1.4.2" "docker-compose": "^1.4.2"
@ -45,9 +45,9 @@
} }
}, },
"node_modules/@actions/github": { "node_modules/@actions/github": {
"version": "9.0.0", "version": "9.1.0",
"resolved": "https://registry.npmjs.org/@actions/github/-/github-9.0.0.tgz", "resolved": "https://registry.npmjs.org/@actions/github/-/github-9.1.0.tgz",
"integrity": "sha512-yJ0RoswsAaKcvkmpCE4XxBRiy/whH2SdTBHWzs0gi4wkqTDhXMChjSdqBz/F4AeiDlP28rQqL33iHb+kjAMX6w==", "integrity": "sha512-u0hDGQeCS+7VNoLA8hYG65RLdPLMaPGfka0sZ0up7P0AiShqfX6xcuXNteGkQ7X7Tod7AMNwHd4p7DS63i8zzA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/http-client": "^3.0.2", "@actions/http-client": "^3.0.2",
@ -129,7 +129,6 @@
"integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.29.0", "@babel/code-frame": "^7.29.0",
"@babel/generator": "^7.29.0", "@babel/generator": "^7.29.0",
@ -1001,6 +1000,7 @@
"integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"@eslint/object-schema": "^2.1.7", "@eslint/object-schema": "^2.1.7",
"debug": "^4.3.1", "debug": "^4.3.1",
@ -1016,6 +1016,7 @@
"integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"@eslint/core": "^0.17.0" "@eslint/core": "^0.17.0"
}, },
@ -1116,6 +1117,7 @@
"integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
} }
@ -1126,6 +1128,7 @@
"integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"@eslint/core": "^0.17.0", "@eslint/core": "^0.17.0",
"levn": "^0.4.1" "levn": "^0.4.1"
@ -1778,7 +1781,6 @@
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz",
"integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@octokit/auth-token": "^6.0.0", "@octokit/auth-token": "^6.0.0",
"@octokit/graphql": "^9.0.3", "@octokit/graphql": "^9.0.3",
@ -2437,7 +2439,6 @@
"integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.2", "@eslint-community/regexpp": "^4.12.2",
@ -2689,7 +2690,6 @@
"integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"undici-types": "~7.18.0" "undici-types": "~7.18.0"
} }
@ -2724,7 +2724,6 @@
"integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==", "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.12.2", "@eslint-community/regexpp": "^4.12.2",
"@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/scope-manager": "8.58.0",
@ -2764,7 +2763,6 @@
"integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==", "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/scope-manager": "8.58.0",
"@typescript-eslint/types": "8.58.0", "@typescript-eslint/types": "8.58.0",
@ -3307,7 +3305,6 @@
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
}, },
@ -3756,7 +3753,6 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"baseline-browser-mapping": "^2.9.0", "baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759", "caniuse-lite": "^1.0.30001759",
@ -4258,7 +4254,6 @@
"integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"env-paths": "^2.2.1", "env-paths": "^2.2.1",
"import-fresh": "^3.3.0", "import-fresh": "^3.3.0",
@ -5266,6 +5261,7 @@
"integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"peer": true,
"dependencies": { "dependencies": {
"esrecurse": "^4.3.0", "esrecurse": "^4.3.0",
"estraverse": "^5.2.0" "estraverse": "^5.2.0"
@ -5296,6 +5292,7 @@
"integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"fast-deep-equal": "^3.1.1", "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0", "fast-json-stable-stringify": "^2.0.0",
@ -5312,7 +5309,8 @@
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT",
"peer": true
}, },
"node_modules/espree": { "node_modules/espree": {
"version": "10.4.0", "version": "10.4.0",
@ -6980,7 +6978,6 @@
"integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@jest/core": "30.3.0", "@jest/core": "30.3.0",
"@jest/types": "30.3.0", "@jest/types": "30.3.0",
@ -7696,7 +7693,6 @@
"integrity": "sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng==", "integrity": "sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"acorn": "^8.5.0", "acorn": "^8.5.0",
"eslint-visitor-keys": "^5.0.0", "eslint-visitor-keys": "^5.0.0",
@ -7952,7 +7948,8 @@
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT",
"peer": true
}, },
"node_modules/lodash.mergewith": { "node_modules/lodash.mergewith": {
"version": "4.6.2", "version": "4.6.2",
@ -8763,7 +8760,6 @@
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"prettier": "bin/prettier.cjs" "prettier": "bin/prettier.cjs"
}, },
@ -9813,7 +9809,6 @@
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
@ -10079,7 +10074,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
"tsserver": "bin/tsserver" "tsserver": "bin/tsserver"

View File

@ -26,7 +26,7 @@
}, },
"dependencies": { "dependencies": {
"@actions/core": "^3.0.0", "@actions/core": "^3.0.0",
"@actions/github": "^9.0.0", "@actions/github": "^9.1.0",
"@actions/tool-cache": "^4.0.0", "@actions/tool-cache": "^4.0.0",
"@octokit/action": "^8.0.4", "@octokit/action": "^8.0.4",
"docker-compose": "^1.4.2" "docker-compose": "^1.4.2"

View File

@ -139,6 +139,31 @@ describe("InputService", () => {
expect(inputs.composeFiles).toEqual(["./compose.yml"]); expect(inputs.composeFiles).toEqual(["./compose.yml"]);
}); });
it("should accept OCI compose files without checking the file system", () => {
getMultilineInputMock.mockImplementation((inputName) => {
switch (inputName) {
case InputNames.ComposeFile:
return ["oci://docker.io/hoverkraft/compose-app:latest"];
default:
return [];
}
});
getInputMock.mockImplementation((inputName) => {
switch (inputName) {
case InputNames.Cwd:
return "/current/working/directory";
default:
return "";
}
});
const inputs = service.getInputs();
expect(inputs.composeFiles).toEqual(["oci://docker.io/hoverkraft/compose-app:latest"]);
expect(existsSyncMock).not.toHaveBeenCalled();
});
it("should throws an error when a compose file does not exist", () => { it("should throws an error when a compose file does not exist", () => {
getMultilineInputMock.mockImplementation((inputName) => { getMultilineInputMock.mockImplementation((inputName) => {
switch (inputName) { switch (inputName) {

View File

@ -54,10 +54,16 @@ export class InputService {
private getComposeFiles(): string[] { private getComposeFiles(): string[] {
const cwd = this.getCwd(); const cwd = this.getCwd();
const composeFiles = getMultilineInput(InputNames.ComposeFile).filter((composeFile: string) => { const composeFiles = getMultilineInput(InputNames.ComposeFile).filter((composeFile: string) => {
if (!composeFile.trim().length) { const trimmedComposeFile = composeFile.trim();
if (!trimmedComposeFile.length) {
return false; return false;
} }
if (trimmedComposeFile.startsWith("oci://")) {
return true;
}
const possiblePaths = [join(cwd, composeFile), composeFile]; const possiblePaths = [join(cwd, composeFile), composeFile];
for (const path of possiblePaths) { for (const path of possiblePaths) {