v5.0.0
This commit is contained in:
commit
ddd3a6404a
2
.dockerignore
Executable file
2
.dockerignore
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
/coverage
|
||||||
|
/node_modules
|
15
.editorconfig
Executable file
15
.editorconfig
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
# This file is for unifying the coding style for different editors and IDEs.
|
||||||
|
# More information at http://editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
3
.eslintignore
Executable file
3
.eslintignore
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
/dist/**
|
||||||
|
/coverage/**
|
||||||
|
/node_modules/**
|
24
.eslintrc.json
Executable file
24
.eslintrc.json
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"node": true,
|
||||||
|
"es6": true,
|
||||||
|
"jest": true
|
||||||
|
},
|
||||||
|
"extends": [
|
||||||
|
"eslint:recommended",
|
||||||
|
"plugin:@typescript-eslint/eslint-recommended",
|
||||||
|
"plugin:@typescript-eslint/recommended",
|
||||||
|
"plugin:jest/recommended",
|
||||||
|
"plugin:prettier/recommended"
|
||||||
|
],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": "latest",
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"plugins": [
|
||||||
|
"@typescript-eslint",
|
||||||
|
"jest",
|
||||||
|
"prettier"
|
||||||
|
]
|
||||||
|
}
|
2
.gitattributes
vendored
Executable file
2
.gitattributes
vendored
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
/dist/** linguist-generated=true
|
||||||
|
/lib/** linguist-generated=true
|
3
.github/CODE_OF_CONDUCT.md
vendored
Executable file
3
.github/CODE_OF_CONDUCT.md
vendored
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Code of conduct
|
||||||
|
|
||||||
|
- [Moby community guidelines](https://github.com/moby/moby/blob/master/CONTRIBUTING.md#moby-community-guidelines)
|
31
.github/CONTRIBUTING.md
vendored
Executable file
31
.github/CONTRIBUTING.md
vendored
Executable file
@ -0,0 +1,31 @@
|
|||||||
|
## Contributing
|
||||||
|
|
||||||
|
Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great.
|
||||||
|
|
||||||
|
Contributions to this project are [released](https://docs.github.com/en/github/site-policy/github-terms-of-service#6-contributions-under-repository-license)
|
||||||
|
to the public under the [project's open source license](LICENSE).
|
||||||
|
|
||||||
|
## Submitting a pull request
|
||||||
|
|
||||||
|
1. [Fork](https://github.com/docker/build-push-action/fork) and clone the repository
|
||||||
|
2. Configure and install the dependencies: `yarn install`
|
||||||
|
3. Create a new branch: `git checkout -b my-branch-name`
|
||||||
|
4. Make your changes
|
||||||
|
5. Make sure the tests pass: `docker buildx bake test`
|
||||||
|
6. Format code and build javascript artifacts: `docker buildx bake pre-checkin`
|
||||||
|
7. Validate all code has correctly formatted and built: `docker buildx bake validate`
|
||||||
|
8. Push to your fork and [submit a pull request](https://github.com/docker/build-push-action/compare)
|
||||||
|
9. Pat your self on the back and wait for your pull request to be reviewed and merged.
|
||||||
|
|
||||||
|
Here are a few things you can do that will increase the likelihood of your pull request being accepted:
|
||||||
|
|
||||||
|
- Make sure the `README.md` and any other relevant **documentation are kept up-to-date**.
|
||||||
|
- We try to follow [SemVer v2.0.0](https://semver.org/). Randomly breaking public APIs is not an option.
|
||||||
|
- Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as **separate pull requests**.
|
||||||
|
- Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)
|
||||||
|
- [Using Pull Requests](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests)
|
||||||
|
- [GitHub Help](https://docs.github.com/en)
|
101
.github/ISSUE_TEMPLATE/bug.yml
vendored
Executable file
101
.github/ISSUE_TEMPLATE/bug.yml
vendored
Executable file
@ -0,0 +1,101 @@
|
|||||||
|
# https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema
|
||||||
|
name: Bug Report
|
||||||
|
description: Report a bug
|
||||||
|
labels:
|
||||||
|
- status/triage
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thank you for taking the time to report a bug!
|
||||||
|
If this is a security issue please report it to the [Docker Security team](mailto:security@docker.com).
|
||||||
|
Before submitting a bug report, check out the [Troubleshooting doc](https://github.com/docker/build-push-action/blob/master/TROUBLESHOOTING.md).
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Contributing guidelines
|
||||||
|
description: >
|
||||||
|
Make sure you've read the contributing guidelines before proceeding.
|
||||||
|
options:
|
||||||
|
- label: I've read the [contributing guidelines](https://github.com/docker/build-push-action/blob/master/.github/CONTRIBUTING.md) and wholeheartedly agree
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: "I've found a bug, and:"
|
||||||
|
description: |
|
||||||
|
Make sure that your request fulfills all of the following requirements.
|
||||||
|
If one requirement cannot be satisfied, explain in detail why.
|
||||||
|
options:
|
||||||
|
- label: The documentation does not mention anything about my problem
|
||||||
|
- label: There are no open or closed issues that are related to my problem
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
description: >
|
||||||
|
Provide a brief description of the bug in 1-2 sentences.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected behaviour
|
||||||
|
description: >
|
||||||
|
Describe precisely what you'd expect to happen.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Actual behaviour
|
||||||
|
description: >
|
||||||
|
Describe precisely what is actually happening.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Repository URL
|
||||||
|
description: >
|
||||||
|
Enter the URL of the repository where you are experiencing the
|
||||||
|
issue. If your repository is private, provide a link to a minimal
|
||||||
|
repository that reproduces the issue.
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Workflow run URL
|
||||||
|
description: >
|
||||||
|
Enter the URL of the GitHub Action workflow run, if public.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: YAML workflow
|
||||||
|
description: |
|
||||||
|
Provide the YAML of the workflow that's causing the issue.
|
||||||
|
Make sure to remove any sensitive information.
|
||||||
|
render: yaml
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Workflow logs
|
||||||
|
description: >
|
||||||
|
[Attach](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/attaching-files)
|
||||||
|
the [log file of your workflow run](https://docs.github.com/en/actions/managing-workflow-runs/using-workflow-run-logs#downloading-logs)
|
||||||
|
and make sure to remove any sensitive information.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: BuildKit logs
|
||||||
|
description: >
|
||||||
|
If applicable, provide the [BuildKit container logs](https://docs.docker.com/build/ci/github-actions/configure-builder/#buildkit-container-logs)
|
||||||
|
render: text
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional info
|
||||||
|
description: |
|
||||||
|
Provide any additional information that could be useful.
|
9
.github/ISSUE_TEMPLATE/config.yml
vendored
Executable file
9
.github/ISSUE_TEMPLATE/config.yml
vendored
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
# https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#configuring-the-template-chooser
|
||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Questions and Discussions
|
||||||
|
url: https://github.com/docker/build-push-action/discussions/new
|
||||||
|
about: Use Github Discussions to ask questions and/or open discussion topics.
|
||||||
|
- name: Documentation
|
||||||
|
url: https://docs.docker.com/build/ci/github-actions/
|
||||||
|
about: Read the documentation.
|
15
.github/ISSUE_TEMPLATE/feature.yml
vendored
Executable file
15
.github/ISSUE_TEMPLATE/feature.yml
vendored
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
# https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema
|
||||||
|
name: Feature request
|
||||||
|
description: Missing functionality? Come tell us about it!
|
||||||
|
labels:
|
||||||
|
- kind/enhancement
|
||||||
|
- status/triage
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
description: What is the feature you want to see?
|
||||||
|
validations:
|
||||||
|
required: true
|
12
.github/SECURITY.md
vendored
Executable file
12
.github/SECURITY.md
vendored
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
# Reporting security issues
|
||||||
|
|
||||||
|
The project maintainers take security seriously. If you discover a security
|
||||||
|
issue, please bring it to their attention right away!
|
||||||
|
|
||||||
|
**Please _DO NOT_ file a public issue**, instead send your report privately to
|
||||||
|
[security@docker.com](mailto:security@docker.com).
|
||||||
|
|
||||||
|
Security reports are greatly appreciated, and we will publicly thank you for it.
|
||||||
|
We also like to send gifts—if you'd like Docker swag, make sure to let
|
||||||
|
us know. We currently do not offer a paid security bounty program, but are not
|
||||||
|
ruling it out in the future.
|
BIN
.github/build-push-action.png
vendored
Executable file
BIN
.github/build-push-action.png
vendored
Executable file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
19
.github/dependabot.yml
vendored
Executable file
19
.github/dependabot.yml
vendored
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
labels:
|
||||||
|
- "dependencies"
|
||||||
|
- "bot"
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
versioning-strategy: "increase"
|
||||||
|
allow:
|
||||||
|
- dependency-type: "production"
|
||||||
|
labels:
|
||||||
|
- "dependencies"
|
||||||
|
- "bot"
|
5
.github/e2e/distribution/env
vendored
Executable file
5
.github/e2e/distribution/env
vendored
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
REGISTRY_FQDN=localhost:8080
|
||||||
|
REGISTRY_SLUG=localhost:8080/test-docker-action
|
||||||
|
|
||||||
|
DISTRIBUTION_HOST=localhost
|
||||||
|
DISTRIBUTION_PORT=8080
|
13
.github/e2e/distribution/install.sh
vendored
Executable file
13
.github/e2e/distribution/install.sh
vendored
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
: "${DISTRIBUTION_VERSION:=2}"
|
||||||
|
: "${DISTRIBUTION_HOST:=localhost}"
|
||||||
|
: "${DISTRIBUTION_PORT:=8080}"
|
||||||
|
|
||||||
|
echo "::group::Starting registry:${DISTRIBUTION_VERSION}"
|
||||||
|
(
|
||||||
|
set -x
|
||||||
|
docker run -d --name registry -p "${DISTRIBUTION_PORT}:5000" "registry:${DISTRIBUTION_VERSION}"
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
8
.github/e2e/harbor/env
vendored
Executable file
8
.github/e2e/harbor/env
vendored
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
REGISTRY_FQDN=localhost:8081
|
||||||
|
REGISTRY_USER=admin
|
||||||
|
REGISTRY_PASSWORD=Harbor12345
|
||||||
|
REGISTRY_SLUG=localhost:8081/test-docker-action/test-docker-action
|
||||||
|
|
||||||
|
HARBOR_HOST=localhost
|
||||||
|
HARBOR_PORT=8081
|
||||||
|
HARBOR_PROJECT=test-docker-action
|
79
.github/e2e/harbor/install.sh
vendored
Executable file
79
.github/e2e/harbor/install.sh
vendored
Executable file
@ -0,0 +1,79 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
: "${HARBOR_VERSION:=v2.7.0}"
|
||||||
|
: "${HARBOR_HOST:=localhost}"
|
||||||
|
: "${HARBOR_PORT:=49154}"
|
||||||
|
: "${REGISTRY_USER:=admin}"
|
||||||
|
: "${REGISTRY_PASSWORD:=Harbor12345}"
|
||||||
|
|
||||||
|
: "${HARBOR_PROJECT:=test-docker-action}"
|
||||||
|
|
||||||
|
project_post_data() {
|
||||||
|
cat <<EOF
|
||||||
|
{
|
||||||
|
"project_name": "$HARBOR_PROJECT",
|
||||||
|
"public": true
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
export TERM=xterm
|
||||||
|
|
||||||
|
# download
|
||||||
|
echo "::group::Downloading Harbor $HARBOR_VERSION"
|
||||||
|
(
|
||||||
|
cd /tmp
|
||||||
|
set -x
|
||||||
|
wget -q "https://github.com/goharbor/harbor/releases/download/${HARBOR_VERSION}/harbor-offline-installer-${HARBOR_VERSION}.tgz" -O harbor-online-installer.tgz
|
||||||
|
tar xvf harbor-online-installer.tgz
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# config
|
||||||
|
echo "::group::Configuring Harbor"
|
||||||
|
(
|
||||||
|
cd /tmp/harbor
|
||||||
|
set -x
|
||||||
|
cp harbor.yml.tmpl harbor.yml
|
||||||
|
harborConfig="$(harborHost="$HARBOR_HOST" harborPort="$HARBOR_PORT" harborPwd="$REGISTRY_PASSWORD" yq --no-colors '.hostname = env(harborHost) | .http.port = env(harborPort) | .harbor_admin_password = env(harborPwd) | del(.https)' harbor.yml)"
|
||||||
|
tee harbor.yml <<<"$harborConfig" >/dev/null
|
||||||
|
yq --no-colors harbor.yml
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# install and start
|
||||||
|
echo "::group::Installing Harbor"
|
||||||
|
(
|
||||||
|
cd /tmp/harbor
|
||||||
|
set -x
|
||||||
|
./install.sh
|
||||||
|
sleep 10
|
||||||
|
netstat -aptn
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# compose config
|
||||||
|
echo "::group::Compose config"
|
||||||
|
(
|
||||||
|
cd /tmp/harbor
|
||||||
|
set -x
|
||||||
|
docker compose config
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# create project
|
||||||
|
echo "::group::Creating project"
|
||||||
|
(
|
||||||
|
set -x
|
||||||
|
curl --fail -v -k --max-time 10 -u "$REGISTRY_USER:$REGISTRY_PASSWORD" -X POST -H "Content-Type: application/json" -d "$(project_post_data)" "http://$HARBOR_HOST:$HARBOR_PORT/api/v2.0/projects"
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# list projects
|
||||||
|
echo "::group::List projects"
|
||||||
|
(
|
||||||
|
set -x
|
||||||
|
curl --fail -s -k --max-time 10 -u "$REGISTRY_USER:$REGISTRY_PASSWORD" -H "Content-Type: application/json" "http://$HARBOR_HOST:$HARBOR_PORT/api/v2.0/projects" | jq
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
8
.github/e2e/nexus/docker-compose.yml
vendored
Executable file
8
.github/e2e/nexus/docker-compose.yml
vendored
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
services:
|
||||||
|
nexus:
|
||||||
|
image: sonatype/nexus3:${NEXUS_VERSION:-latest}
|
||||||
|
volumes:
|
||||||
|
- "./data:/nexus-data"
|
||||||
|
ports:
|
||||||
|
- "8081:8081"
|
||||||
|
- "8082:8082"
|
9
.github/e2e/nexus/env
vendored
Executable file
9
.github/e2e/nexus/env
vendored
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
REGISTRY_FQDN=localhost:8082
|
||||||
|
REGISTRY_USER=admin
|
||||||
|
REGISTRY_PASSWORD=Nexus12345
|
||||||
|
REGISTRY_SLUG=localhost:8082/test-docker-action
|
||||||
|
|
||||||
|
NEXUS_HOST=localhost
|
||||||
|
NEXUS_PORT=8081
|
||||||
|
NEXUS_REGISTRY_PORT=8082
|
||||||
|
NEXUS_REPO=test-docker-action
|
93
.github/e2e/nexus/install.sh
vendored
Executable file
93
.github/e2e/nexus/install.sh
vendored
Executable file
@ -0,0 +1,93 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
SCRIPT_DIR=$(cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd)
|
||||||
|
|
||||||
|
: "${NEXUS_VERSION:=3.47.1}"
|
||||||
|
: "${NEXUS_HOST:=localhost}"
|
||||||
|
: "${NEXUS_PORT:=8081}"
|
||||||
|
: "${NEXUS_REGISTRY_PORT:=8082}"
|
||||||
|
: "${REGISTRY_USER:=admin}"
|
||||||
|
: "${REGISTRY_PASSWORD:=Nexus12345}"
|
||||||
|
|
||||||
|
: "${NEXUS_REPO:=test-docker-action}"
|
||||||
|
|
||||||
|
createrepo_post_data() {
|
||||||
|
cat <<EOF
|
||||||
|
{
|
||||||
|
"name": "${NEXUS_REPO}",
|
||||||
|
"online": true,
|
||||||
|
"storage": {
|
||||||
|
"blobStoreName": "default",
|
||||||
|
"strictContentTypeValidation": true,
|
||||||
|
"writePolicy": "ALLOW"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"v1Enabled": false,
|
||||||
|
"forceBasicAuth": true,
|
||||||
|
"httpPort": ${NEXUS_REGISTRY_PORT},
|
||||||
|
"httpsPort": null,
|
||||||
|
"subdomain": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
export NEXUS_VERSION
|
||||||
|
|
||||||
|
mkdir -p /tmp/nexus/data
|
||||||
|
chown 200:200 /tmp/nexus/data
|
||||||
|
cp "${SCRIPT_DIR}/docker-compose.yml" /tmp/nexus/docker-compose.yml
|
||||||
|
|
||||||
|
echo "::group::Pulling Nexus $NEXUS_VERSION"
|
||||||
|
(
|
||||||
|
cd /tmp/nexus
|
||||||
|
set -x
|
||||||
|
docker compose pull
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Compose config"
|
||||||
|
(
|
||||||
|
cd /tmp/nexus
|
||||||
|
set -x
|
||||||
|
docker compose config
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Running Nexus"
|
||||||
|
(
|
||||||
|
cd /tmp/nexus
|
||||||
|
set -x
|
||||||
|
docker compose up -d
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Running Nexus"
|
||||||
|
(
|
||||||
|
cd /tmp/nexus
|
||||||
|
set -x
|
||||||
|
docker compose up -d
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Waiting for Nexus to be ready"
|
||||||
|
until $(curl --output /dev/null --silent --head --fail "http://$NEXUS_HOST:$NEXUS_PORT"); do
|
||||||
|
printf '.'
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Change user's password"
|
||||||
|
(
|
||||||
|
set -x
|
||||||
|
curl --fail -v -k --max-time 10 -u "$REGISTRY_USER:$(cat /tmp/nexus/data/admin.password)" -X PUT -H 'Content-Type: text/plain' -d "$REGISTRY_PASSWORD" "http://$NEXUS_HOST:$NEXUS_PORT/service/rest/v1/security/users/$REGISTRY_USER/change-password"
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Create Docker repository"
|
||||||
|
(
|
||||||
|
set -x
|
||||||
|
curl --fail -v -k --max-time 10 -u "$REGISTRY_USER:$REGISTRY_PASSWORD" -X POST -H 'Content-Type: application/json' -d "$(createrepo_post_data)" "http://$NEXUS_HOST:$NEXUS_PORT/service/rest/v1/repositories/docker/hosted"
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
129
.github/workflows/.e2e-run.yml
vendored
Executable file
129
.github/workflows/.e2e-run.yml
vendored
Executable file
@ -0,0 +1,129 @@
|
|||||||
|
# reusable workflow
|
||||||
|
name: .e2e-run
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
id:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
type:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
name:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
registry:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
slug:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
username_secret:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
password_secret:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
env:
|
||||||
|
HARBOR_VERSION: v2.7.0
|
||||||
|
NEXUS_VERSION: 3.47.1
|
||||||
|
DISTRIBUTION_VERSION: 2.8.1
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
run:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
-
|
||||||
|
buildx_version: latest
|
||||||
|
buildkit_image: moby/buildkit:buildx-stable-1
|
||||||
|
-
|
||||||
|
buildx_version: https://github.com/docker/buildx.git#master
|
||||||
|
buildkit_image: moby/buildkit:master
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Set up env
|
||||||
|
if: inputs.type == 'local'
|
||||||
|
run: |
|
||||||
|
cat ./.github/e2e/${{ inputs.id }}/env >> $GITHUB_ENV
|
||||||
|
-
|
||||||
|
name: Set up BuildKit config
|
||||||
|
run: |
|
||||||
|
touch /tmp/buildkitd.toml
|
||||||
|
if [ "${{ inputs.type }}" = "local" ]; then
|
||||||
|
echo -e "[registry.\"${{ env.REGISTRY_FQDN }}\"]\nhttp = true\ninsecure = true" > /tmp/buildkitd.toml
|
||||||
|
fi
|
||||||
|
-
|
||||||
|
name: Set up Docker daemon
|
||||||
|
if: inputs.type == 'local'
|
||||||
|
run: |
|
||||||
|
if [ ! -e /etc/docker/daemon.json ]; then
|
||||||
|
echo '{}' | tee /etc/docker/daemon.json >/dev/null
|
||||||
|
fi
|
||||||
|
DOCKERD_CONFIG=$(jq '.+{"insecure-registries":["http://${{ env.REGISTRY_FQDN }}"]}' /etc/docker/daemon.json)
|
||||||
|
sudo tee /etc/docker/daemon.json <<<"$DOCKERD_CONFIG" >/dev/null
|
||||||
|
sudo service docker restart
|
||||||
|
-
|
||||||
|
name: Install ${{ inputs.name }}
|
||||||
|
if: inputs.type == 'local'
|
||||||
|
run: |
|
||||||
|
sudo -E bash ./.github/e2e/${{ inputs.id }}/install.sh
|
||||||
|
-
|
||||||
|
name: Docker meta
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v4
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY_SLUG || inputs.slug }}
|
||||||
|
tags: |
|
||||||
|
type=ref,event=branch,enable=${{ matrix.buildx_version == 'latest' && matrix.buildkit_image == 'moby/buildkit:buildx-stable-1' }}
|
||||||
|
type=ref,event=tag,enable=${{ matrix.buildx_version == 'latest' && matrix.buildkit_image == 'moby/buildkit:buildx-stable-1' }}
|
||||||
|
type=raw,gh-runid-${{ github.run_id }}
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
with:
|
||||||
|
version: ${{ matrix.buildx_version }}
|
||||||
|
config: /tmp/buildkitd.toml
|
||||||
|
buildkitd-flags: --debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host
|
||||||
|
driver-opts: |
|
||||||
|
image=${{ matrix.buildkit_image }}
|
||||||
|
network=host
|
||||||
|
-
|
||||||
|
name: Login to Registry
|
||||||
|
if: github.event_name != 'pull_request' && (env.REGISTRY_USER || inputs.username_secret) != ''
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY_FQDN || inputs.registry }}
|
||||||
|
username: ${{ env.REGISTRY_USER || secrets[inputs.username_secret] }}
|
||||||
|
password: ${{ env.REGISTRY_PASSWORD || secrets[inputs.password_secret] }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
context: ./test
|
||||||
|
file: ./test/multi.Dockerfile
|
||||||
|
platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
cache-from: type=registry,ref=${{ env.REGISTRY_SLUG || inputs.slug }}:master
|
||||||
|
cache-to: type=inline
|
||||||
|
-
|
||||||
|
name: Inspect image
|
||||||
|
run: |
|
||||||
|
docker pull ${{ env.REGISTRY_SLUG || inputs.slug }}:${{ steps.meta.outputs.version }}
|
||||||
|
docker image inspect ${{ env.REGISTRY_SLUG || inputs.slug }}:${{ steps.meta.outputs.version }}
|
||||||
|
-
|
||||||
|
name: Check manifest
|
||||||
|
run: |
|
||||||
|
docker buildx imagetools inspect ${{ env.REGISTRY_SLUG || inputs.slug }}:${{ steps.meta.outputs.version }} --format '{{json .}}'
|
1102
.github/workflows/ci.yml
vendored
Executable file
1102
.github/workflows/ci.yml
vendored
Executable file
File diff suppressed because it is too large
Load Diff
114
.github/workflows/e2e.yml
vendored
Executable file
114
.github/workflows/e2e.yml
vendored
Executable file
@ -0,0 +1,114 @@
|
|||||||
|
name: e2e
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 10 * * *'
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
uses: ./.github/workflows/.e2e-run.yml
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
-
|
||||||
|
name: Distribution
|
||||||
|
id: distribution
|
||||||
|
type: local
|
||||||
|
-
|
||||||
|
name: Docker Hub
|
||||||
|
registry: ''
|
||||||
|
slug: ghactionstest/ghactionstest
|
||||||
|
username_secret: DOCKERHUB_USERNAME
|
||||||
|
password_secret: DOCKERHUB_TOKEN
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: GitHub
|
||||||
|
registry: ghcr.io
|
||||||
|
slug: ghcr.io/docker-ghactiontest/test
|
||||||
|
username_secret: GHCR_USERNAME
|
||||||
|
password_secret: GHCR_PAT
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: GitLab
|
||||||
|
registry: registry.gitlab.com
|
||||||
|
slug: registry.gitlab.com/test1716/test
|
||||||
|
username_secret: GITLAB_USERNAME
|
||||||
|
password_secret: GITLAB_TOKEN
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: AWS ECR
|
||||||
|
registry: 175142243308.dkr.ecr.us-east-2.amazonaws.com
|
||||||
|
slug: 175142243308.dkr.ecr.us-east-2.amazonaws.com/sandbox/test-docker-action
|
||||||
|
username_secret: AWS_ACCESS_KEY_ID
|
||||||
|
password_secret: AWS_SECRET_ACCESS_KEY
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: AWS ECR Public
|
||||||
|
registry: public.ecr.aws
|
||||||
|
slug: public.ecr.aws/q3b5f1u4/test-docker-action
|
||||||
|
username_secret: AWS_ACCESS_KEY_ID
|
||||||
|
password_secret: AWS_SECRET_ACCESS_KEY
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: Google Artifact Registry
|
||||||
|
registry: us-east4-docker.pkg.dev
|
||||||
|
slug: us-east4-docker.pkg.dev/sandbox-298914/docker-official-github-actions/test-docker-action
|
||||||
|
username_secret: GAR_USERNAME
|
||||||
|
password_secret: GAR_JSON_KEY
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: Google Container Registry
|
||||||
|
registry: gcr.io
|
||||||
|
slug: gcr.io/sandbox-298914/test-docker-action
|
||||||
|
username_secret: GCR_USERNAME
|
||||||
|
password_secret: GCR_JSON_KEY
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: Azure Container Registry
|
||||||
|
registry: officialgithubactions.azurecr.io
|
||||||
|
slug: officialgithubactions.azurecr.io/test-docker-action
|
||||||
|
username_secret: AZURE_CLIENT_ID
|
||||||
|
password_secret: AZURE_CLIENT_SECRET
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: Quay
|
||||||
|
registry: quay.io
|
||||||
|
slug: quay.io/docker_build_team/ghactiontest
|
||||||
|
username_secret: QUAY_USERNAME
|
||||||
|
password_secret: QUAY_TOKEN
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: Artifactory
|
||||||
|
registry: sforzando-build-team-local.jfrog.io
|
||||||
|
slug: sforzando-build-team-local.jfrog.io/build-push-action-e2e
|
||||||
|
username_secret: ARTIFACTORY_USERNAME
|
||||||
|
password_secret: ARTIFACTORY_TOKEN
|
||||||
|
type: remote
|
||||||
|
-
|
||||||
|
name: Harbor
|
||||||
|
id: harbor
|
||||||
|
type: local
|
||||||
|
-
|
||||||
|
name: Nexus
|
||||||
|
id: nexus
|
||||||
|
type: local
|
||||||
|
with:
|
||||||
|
id: ${{ matrix.id }}
|
||||||
|
type: ${{ matrix.type }}
|
||||||
|
name: ${{ matrix.name }}
|
||||||
|
registry: ${{ matrix.registry }}
|
||||||
|
slug: ${{ matrix.slug }}
|
||||||
|
username_secret: ${{ matrix.username_secret }}
|
||||||
|
password_secret: ${{ matrix.password_secret }}
|
||||||
|
secrets: inherit
|
30
.github/workflows/test.yml
vendored
Executable file
30
.github/workflows/test.yml
vendored
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
name: test
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
- 'releases/v*'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Test
|
||||||
|
uses: docker/bake-action@v3
|
||||||
|
with:
|
||||||
|
targets: test
|
||||||
|
-
|
||||||
|
name: Upload coverage
|
||||||
|
uses: codecov/codecov-action@v3
|
||||||
|
with:
|
||||||
|
file: ./coverage/clover.xml
|
45
.github/workflows/validate.yml
vendored
Executable file
45
.github/workflows/validate.yml
vendored
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
name: validate
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
- 'releases/v*'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
prepare:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
targets: ${{ steps.targets.outputs.matrix }}
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Targets matrix
|
||||||
|
id: targets
|
||||||
|
run: |
|
||||||
|
echo "matrix=$(docker buildx bake validate --print | jq -cr '.group.validate.targets')" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
validate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- prepare
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
target: ${{ fromJson(needs.prepare.outputs.targets) }}
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Validate
|
||||||
|
uses: docker/bake-action@v3
|
||||||
|
with:
|
||||||
|
targets: ${{ matrix.target }}
|
91
.gitignore
vendored
Executable file
91
.gitignore
vendored
Executable file
@ -0,0 +1,91 @@
|
|||||||
|
node_modules
|
||||||
|
lib
|
||||||
|
|
||||||
|
# Rest of the file pulled from https://github.com/github/gitignore/blob/master/Node.gitignore
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# TypeScript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# next.js build output
|
||||||
|
.next
|
||||||
|
|
||||||
|
# nuxt.js build output
|
||||||
|
.nuxt
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
11
.prettierrc.json
Executable file
11
.prettierrc.json
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"printWidth": 240,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"useTabs": false,
|
||||||
|
"semi": true,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "none",
|
||||||
|
"bracketSpacing": false,
|
||||||
|
"arrowParens": "avoid",
|
||||||
|
"parser": "typescript"
|
||||||
|
}
|
191
LICENSE
Executable file
191
LICENSE
Executable file
@ -0,0 +1,191 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
https://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Copyright 2013-2018 Docker, Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
270
README.md
Executable file
270
README.md
Executable file
@ -0,0 +1,270 @@
|
|||||||
|
[](https://github.com/docker/build-push-action/releases/latest)
|
||||||
|
[](https://github.com/marketplace/actions/build-and-push-docker-images)
|
||||||
|
[](https://github.com/docker/build-push-action/actions?workflow=ci)
|
||||||
|
[](https://github.com/docker/build-push-action/actions?workflow=test)
|
||||||
|
[](https://codecov.io/gh/docker/build-push-action)
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
GitHub Action to build and push Docker images with [Buildx](https://github.com/docker/buildx)
|
||||||
|
with full support of the features provided by [Moby BuildKit](https://github.com/moby/buildkit)
|
||||||
|
builder toolkit. This includes multi-platform build, secrets, remote cache, etc.
|
||||||
|
and different builder deployment/namespacing options.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
* [Usage](#usage)
|
||||||
|
* [Git context](#git-context)
|
||||||
|
* [Path context](#path-context)
|
||||||
|
* [Examples](#examples)
|
||||||
|
* [Multi-platform image](https://docs.docker.com/build/ci/github-actions/multi-platform/)
|
||||||
|
* [Secrets](https://docs.docker.com/build/ci/github-actions/secrets/)
|
||||||
|
* [Push to multi-registries](https://docs.docker.com/build/ci/github-actions/push-multi-registries/)
|
||||||
|
* [Manage tags and labels](https://docs.docker.com/build/ci/github-actions/manage-tags-labels/)
|
||||||
|
* [Cache management](https://docs.docker.com/build/ci/github-actions/cache/)
|
||||||
|
* [Export to Docker](https://docs.docker.com/build/ci/github-actions/export-docker/)
|
||||||
|
* [Test before push](https://docs.docker.com/build/ci/github-actions/test-before-push/)
|
||||||
|
* [Local registry](https://docs.docker.com/build/ci/github-actions/local-registry/)
|
||||||
|
* [Share built image between jobs](https://docs.docker.com/build/ci/github-actions/share-image-jobs/)
|
||||||
|
* [Named contexts](https://docs.docker.com/build/ci/github-actions/named-contexts/)
|
||||||
|
* [Copy image between registries](https://docs.docker.com/build/ci/github-actions/copy-image-registries/)
|
||||||
|
* [Update Docker Hub repo description](https://docs.docker.com/build/ci/github-actions/update-dockerhub-desc/)
|
||||||
|
* [Customizing](#customizing)
|
||||||
|
* [inputs](#inputs)
|
||||||
|
* [outputs](#outputs)
|
||||||
|
* [Troubleshooting](#troubleshooting)
|
||||||
|
* [Contributing](#contributing)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
In the examples below we are also using 3 other actions:
|
||||||
|
|
||||||
|
* [`setup-buildx`](https://github.com/docker/setup-buildx-action) action will
|
||||||
|
create and boot a builder using by default the [`docker-container` driver](https://docs.docker.com/build/building/drivers/docker-container/).
|
||||||
|
This is **not required but recommended** using it to be able to build
|
||||||
|
multi-platform images, export cache, etc.
|
||||||
|
* [`setup-qemu`](https://github.com/docker/setup-qemu-action) action can be
|
||||||
|
useful if you want to add emulation support with QEMU to be able to build
|
||||||
|
against more platforms.
|
||||||
|
* [`login`](https://github.com/docker/login-action) action will take care to
|
||||||
|
log in against a Docker registry.
|
||||||
|
|
||||||
|
### Git context
|
||||||
|
|
||||||
|
By default, this action uses the [Git context](https://docs.docker.com/engine/reference/commandline/build/#git-repositories),
|
||||||
|
so you don't need to use the [`actions/checkout`](https://github.com/actions/checkout/)
|
||||||
|
action to check out the repository as this will be done directly by [BuildKit](https://github.com/moby/buildkit).
|
||||||
|
|
||||||
|
The git reference will be based on the [event that triggered your workflow](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows)
|
||||||
|
and will result in the following context: `https://github.com/<owner>/<repo>.git#<ref>`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: ci
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
-
|
||||||
|
name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
push: true
|
||||||
|
tags: user/app:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
Be careful because **any file mutation in the steps that precede the build step
|
||||||
|
will be ignored, including processing of the `.dockerignore` file** since
|
||||||
|
the context is based on the Git reference. However, you can use the
|
||||||
|
[Path context](#path-context) using the [`context` input](#inputs) alongside
|
||||||
|
the [`actions/checkout`](https://github.com/actions/checkout/) action to remove
|
||||||
|
this restriction.
|
||||||
|
|
||||||
|
Default Git context can also be provided using the [Handlebars template](https://handlebarsjs.com/guide/)
|
||||||
|
expression `{{defaultContext}}`. Here we can use it to provide a subdirectory
|
||||||
|
to the default Git context:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
-
|
||||||
|
# Setting up Docker Buildx with docker-container driver is required
|
||||||
|
# at the moment to be able to use a subdirectory with Git context
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: "{{defaultContext}}:mysubdir"
|
||||||
|
push: true
|
||||||
|
tags: user/app:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Warning**
|
||||||
|
>
|
||||||
|
> Subdirectory for Git context is available from [BuildKit v0.9.0](https://github.com/moby/buildkit/releases/tag/v0.9.0).
|
||||||
|
> If you're using the `docker` builder (default if `setup-buildx-action` not used),
|
||||||
|
> then BuildKit in Docker Engine will be used. As Docker Engine < v22.x.x embeds
|
||||||
|
> Buildkit 0.8.2 at the moment, it does not support this feature. It's therefore
|
||||||
|
> required to use the `setup-buildx-action` at the moment.
|
||||||
|
|
||||||
|
Building from the current repository automatically uses the [GitHub Token](https://docs.github.com/en/actions/security-guides/automatic-token-authentication),
|
||||||
|
so it does not need to be passed. If you want to authenticate against another
|
||||||
|
private repository, you have to use a [secret](https://docs.docker.com/build/ci/github-actions/secrets)
|
||||||
|
named `GIT_AUTH_TOKEN` to be able to authenticate against it with Buildx:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
push: true
|
||||||
|
tags: user/app:latest
|
||||||
|
secrets: |
|
||||||
|
GIT_AUTH_TOKEN=${{ secrets.MYTOKEN }}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Path context
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: ci
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
-
|
||||||
|
name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
tags: user/app:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
* [Multi-platform image](https://docs.docker.com/build/ci/github-actions/multi-platform/)
|
||||||
|
* [Secrets](https://docs.docker.com/build/ci/github-actions/secrets/)
|
||||||
|
* [Push to multi-registries](https://docs.docker.com/build/ci/github-actions/push-multi-registries/)
|
||||||
|
* [Manage tags and labels](https://docs.docker.com/build/ci/github-actions/manage-tags-labels/)
|
||||||
|
* [Cache management](https://docs.docker.com/build/ci/github-actions/cache/)
|
||||||
|
* [Export to Docker](https://docs.docker.com/build/ci/github-actions/export-docker/)
|
||||||
|
* [Test before push](https://docs.docker.com/build/ci/github-actions/test-before-push/)
|
||||||
|
* [Local registry](https://docs.docker.com/build/ci/github-actions/local-registry/)
|
||||||
|
* [Share built image between jobs](https://docs.docker.com/build/ci/github-actions/share-image-jobs/)
|
||||||
|
* [Named contexts](https://docs.docker.com/build/ci/github-actions/named-contexts/)
|
||||||
|
* [Copy image between registries](https://docs.docker.com/build/ci/github-actions/copy-image-registries/)
|
||||||
|
* [Update Docker Hub repo description](https://docs.docker.com/build/ci/github-actions/update-dockerhub-desc/)
|
||||||
|
|
||||||
|
## Customizing
|
||||||
|
|
||||||
|
### inputs
|
||||||
|
|
||||||
|
Following inputs can be used as `step.with` keys
|
||||||
|
|
||||||
|
> `List` type is a newline-delimited string
|
||||||
|
> ```yaml
|
||||||
|
> cache-from: |
|
||||||
|
> user/app:cache
|
||||||
|
> type=local,src=path/to/dir
|
||||||
|
> ```
|
||||||
|
|
||||||
|
> `CSV` type is a comma-delimited string
|
||||||
|
> ```yaml
|
||||||
|
> tags: name/app:latest,name/app:1.0.0
|
||||||
|
> ```
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
|--------------------|-------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `add-hosts` | List/CSV | List of [customs host-to-IP mapping](https://docs.docker.com/engine/reference/commandline/build/#add-entries-to-container-hosts-file---add-host) (e.g., `docker:10.180.0.1`) |
|
||||||
|
| `allow` | List/CSV | List of [extra privileged entitlement](https://docs.docker.com/engine/reference/commandline/buildx_build/#allow) (e.g., `network.host,security.insecure`) |
|
||||||
|
| `attests` | List | List of [attestation](https://docs.docker.com/build/attestations/) parameters (e.g., `type=sbom,generator=image`) |
|
||||||
|
| `builder` | String | Builder instance (see [setup-buildx](https://github.com/docker/setup-buildx-action) action) |
|
||||||
|
| `build-args` | List | List of [build-time variables](https://docs.docker.com/engine/reference/commandline/buildx_build/#build-arg) |
|
||||||
|
| `build-contexts` | List | List of additional [build contexts](https://docs.docker.com/engine/reference/commandline/buildx_build/#build-context) (e.g., `name=path`) |
|
||||||
|
| `cache-from` | List | List of [external cache sources](https://docs.docker.com/engine/reference/commandline/buildx_build/#cache-from) (e.g., `type=local,src=path/to/dir`) |
|
||||||
|
| `cache-to` | List | List of [cache export destinations](https://docs.docker.com/engine/reference/commandline/buildx_build/#cache-to) (e.g., `type=local,dest=path/to/dir`) |
|
||||||
|
| `cgroup-parent` | String | Optional [parent cgroup](https://docs.docker.com/engine/reference/commandline/build/#use-a-custom-parent-cgroup---cgroup-parent) for the container used in the build |
|
||||||
|
| `context` | String | Build's context is the set of files located in the specified [`PATH` or `URL`](https://docs.docker.com/engine/reference/commandline/build/) (default [Git context](#git-context)) |
|
||||||
|
| `file` | String | Path to the Dockerfile. (default `{context}/Dockerfile`) |
|
||||||
|
| `labels` | List | List of metadata for an image |
|
||||||
|
| `load` | Bool | [Load](https://docs.docker.com/engine/reference/commandline/buildx_build/#load) is a shorthand for `--output=type=docker` (default `false`) |
|
||||||
|
| `network` | String | Set the networking mode for the `RUN` instructions during build |
|
||||||
|
| `no-cache` | Bool | Do not use cache when building the image (default `false`) |
|
||||||
|
| `no-cache-filters` | List/CSV | Do not cache specified stages |
|
||||||
|
| `outputs`¹ | List | List of [output destinations](https://docs.docker.com/engine/reference/commandline/buildx_build/#output) (format: `type=local,dest=path`) |
|
||||||
|
| `platforms` | List/CSV | List of [target platforms](https://docs.docker.com/engine/reference/commandline/buildx_build/#platform) for build |
|
||||||
|
| `provenance` | Bool/String | Generate [provenance](https://docs.docker.com/build/attestations/slsa-provenance/) attestation for the build (shorthand for `--attest=type=provenance`) |
|
||||||
|
| `pull` | Bool | Always attempt to pull all referenced images (default `false`) |
|
||||||
|
| `push` | Bool | [Push](https://docs.docker.com/engine/reference/commandline/buildx_build/#push) is a shorthand for `--output=type=registry` (default `false`) |
|
||||||
|
| `sbom` | Bool/String | Generate [SBOM](https://docs.docker.com/build/attestations/sbom/) attestation for the build (shorthand for `--attest=type=sbom`) |
|
||||||
|
| `secrets` | List | List of [secrets](https://docs.docker.com/engine/reference/commandline/buildx_build/#secret) to expose to the build (e.g., `key=string`, `GIT_AUTH_TOKEN=mytoken`) |
|
||||||
|
| `secret-files` | List | List of [secret files](https://docs.docker.com/engine/reference/commandline/buildx_build/#secret) to expose to the build (e.g., `key=filename`, `MY_SECRET=./secret.txt`) |
|
||||||
|
| `shm-size` | String | Size of [`/dev/shm`](https://docs.docker.com/engine/reference/commandline/buildx_build/#shm-size) (e.g., `2g`) |
|
||||||
|
| `ssh` | List | List of [SSH agent socket or keys](https://docs.docker.com/engine/reference/commandline/buildx_build/#ssh) to expose to the build |
|
||||||
|
| `tags` | List/CSV | List of tags |
|
||||||
|
| `target` | String | Sets the target stage to build |
|
||||||
|
| `ulimit` | List | [Ulimit](https://docs.docker.com/engine/reference/commandline/buildx_build/#ulimit) options (e.g., `nofile=1024:1024`) |
|
||||||
|
| `github-token` | String | GitHub Token used to authenticate against a repository for [Git context](#git-context) (default `${{ github.token }}`) |
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> * ¹ multiple `outputs` are [not yet supported](https://github.com/moby/buildkit/issues/1555)
|
||||||
|
|
||||||
|
### outputs
|
||||||
|
|
||||||
|
Following outputs are available
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
|------------|---------|-----------------------|
|
||||||
|
| `imageid` | String | Image ID |
|
||||||
|
| `digest` | String | Image digest |
|
||||||
|
| `metadata` | JSON | Build result metadata |
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
See [TROUBLESHOOTING.md](TROUBLESHOOTING.md)
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Want to contribute? Awesome! You can find information about contributing to
|
||||||
|
this project in the [CONTRIBUTING.md](/.github/CONTRIBUTING.md)
|
164
TROUBLESHOOTING.md
Executable file
164
TROUBLESHOOTING.md
Executable file
@ -0,0 +1,164 @@
|
|||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
* [Cannot push to a registry](#cannot-push-to-a-registry)
|
||||||
|
* [BuildKit container logs](#buildkit-container-logs)
|
||||||
|
* [With containerd](#with-containerd)
|
||||||
|
* [`repository name must be lowercase`](#repository-name-must-be-lowercase)
|
||||||
|
* [Image not loaded](#image-not-loaded)
|
||||||
|
|
||||||
|
## Cannot push to a registry
|
||||||
|
|
||||||
|
While pushing to a registry, you may encounter these kinds of issues:
|
||||||
|
|
||||||
|
* `failed commit on ref "layer-sha256:...": invalid content digest in response: invalid checksum digest format`
|
||||||
|
* `failed commit on ref "layer-sha256:...": no response`
|
||||||
|
* `failed commit on ref "manifest-sha256:...": unexpected status: 400 Bad Request`
|
||||||
|
* `failed commit on ref "manifest-sha256:...": unexpected status: 401 Unauthorized`
|
||||||
|
* `unexpected response: 401 Unauthorized`
|
||||||
|
|
||||||
|
These issues are not directly related to this action but are rather linked to
|
||||||
|
[Buildx](https://github.com/docker/buildx), [BuildKit](https://github.com/moby/buildkit),
|
||||||
|
[containerd](https://github.com/containerd/containerd) or the registry on which
|
||||||
|
you're pushing your image. The quality of error message depends on the registry
|
||||||
|
and are usually not very informative.
|
||||||
|
|
||||||
|
### BuildKit container logs
|
||||||
|
|
||||||
|
To help you solve this, you have to [enable debugging in the setup-buildx](https://github.com/docker/setup-buildx-action#buildkit-container-logs)
|
||||||
|
action step and attach BuildKit container logs to your issue.
|
||||||
|
|
||||||
|
### With containerd
|
||||||
|
|
||||||
|
Next you can test pushing with [containerd action](https://github.com/crazy-max/ghaction-setup-containerd)
|
||||||
|
using the following workflow. If it works then open an issue on [BuildKit](https://github.com/moby/buildkit)
|
||||||
|
repository.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: containerd
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
containerd:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
with:
|
||||||
|
buildkitd-flags: --debug
|
||||||
|
-
|
||||||
|
name: Set up containerd
|
||||||
|
uses: crazy-max/ghaction-setup-containerd@v2
|
||||||
|
-
|
||||||
|
name: Build Docker image
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
tags: docker.io/user/app:latest
|
||||||
|
outputs: type=oci,dest=/tmp/image.tar
|
||||||
|
-
|
||||||
|
name: Import image in containerd
|
||||||
|
run: |
|
||||||
|
sudo ctr i import --base-name docker.io/user/app --digests --all-platforms /tmp/image.tar
|
||||||
|
-
|
||||||
|
name: Push image with containerd
|
||||||
|
run: |
|
||||||
|
sudo ctr --debug i push --user "${{ secrets.DOCKER_USERNAME }}:${{ secrets.DOCKER_PASSWORD }}" docker.io/user/app:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
## `repository name must be lowercase`
|
||||||
|
|
||||||
|
You may encounter this issue if you're using `github.repository` as a repo slug
|
||||||
|
in your tag:
|
||||||
|
|
||||||
|
```
|
||||||
|
#6 exporting to image
|
||||||
|
#6 exporting layers
|
||||||
|
#6 exporting layers 1.2s done
|
||||||
|
#6 exporting manifest sha256:b47f7dfb97b89ccd5de553af3c8cd94c4795884cbe5693e93946b1d95a7b1d12 0.0s done
|
||||||
|
#6 exporting config sha256:995e93fab8196893192f08a38deea6769dc4d98f86cf705eccc24ec96a3e271c 0.0s done
|
||||||
|
#6 ERROR: invalid reference format: repository name must be lowercase
|
||||||
|
------
|
||||||
|
> exporting to image:
|
||||||
|
------
|
||||||
|
error: failed to solve: invalid reference format: repository name must be lowercase
|
||||||
|
```
|
||||||
|
|
||||||
|
or a cache reference:
|
||||||
|
|
||||||
|
```
|
||||||
|
#10 importing cache manifest from ghcr.io/My-Org/repo:main
|
||||||
|
#10 ERROR: invalid reference format: repository name must be lowercase
|
||||||
|
```
|
||||||
|
|
||||||
|
To fix this issue you can use our [metadata action](https://github.com/docker/metadata-action)
|
||||||
|
to generate sanitized tags:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Docker meta
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v4
|
||||||
|
with:
|
||||||
|
images: ghcr.io/${{ github.repository }}
|
||||||
|
tags: latest
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
```
|
||||||
|
|
||||||
|
Or a dedicated step to sanitize the slug:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Sanitize repo slug
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
id: repo_slug
|
||||||
|
with:
|
||||||
|
result-encoding: string
|
||||||
|
script: return 'ghcr.io/${{ github.repository }}'.toLowerCase()
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.repo_slug.outputs.result }}:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
## Image not loaded
|
||||||
|
|
||||||
|
Sometimes when your workflows are heavy consumers of disk storage, it can happen that build-push-action declares that the built image is loaded, but then not found in the following workflow steps.
|
||||||
|
|
||||||
|
- You can use the following solution as workaround, to free space on disk before building docker image using the following workflow step
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Free disk space
|
||||||
|
- name: Free Disk space
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sudo rm -rf /usr/local/lib/android # will release about 10 GB if you don't need Android
|
||||||
|
sudo rm -rf /usr/share/dotnet # will release about 20GB if you don't need .NET
|
||||||
|
```
|
||||||
|
|
||||||
|
- Another workaround can be to call `docker/setup-buildx-action` with docker driver
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
with:
|
||||||
|
driver: docker
|
||||||
|
```
|
||||||
|
|
||||||
|
More details in the [related issue](https://github.com/docker/build-push-action/issues/321)
|
207
__mocks__/@actions/github.ts
Executable file
207
__mocks__/@actions/github.ts
Executable file
@ -0,0 +1,207 @@
|
|||||||
|
import {jest} from '@jest/globals';
|
||||||
|
|
||||||
|
export const context = {
|
||||||
|
repo: {
|
||||||
|
owner: 'docker',
|
||||||
|
repo: 'build-push-action'
|
||||||
|
},
|
||||||
|
ref: 'refs/heads/master',
|
||||||
|
runId: 123456789,
|
||||||
|
payload: {
|
||||||
|
after: '860c1904a1ce19322e91ac35af1ab07466440c37',
|
||||||
|
base_ref: null,
|
||||||
|
before: '5f3331d7f7044c18ca9f12c77d961c4d7cf3276a',
|
||||||
|
commits: [
|
||||||
|
{
|
||||||
|
author: {
|
||||||
|
email: 'crazy-max@users.noreply.github.com',
|
||||||
|
name: 'CrazyMax',
|
||||||
|
username: 'crazy-max'
|
||||||
|
},
|
||||||
|
committer: {
|
||||||
|
email: 'crazy-max@users.noreply.github.com',
|
||||||
|
name: 'CrazyMax',
|
||||||
|
username: 'crazy-max'
|
||||||
|
},
|
||||||
|
distinct: true,
|
||||||
|
id: '860c1904a1ce19322e91ac35af1ab07466440c37',
|
||||||
|
message: 'hello dev',
|
||||||
|
timestamp: '2022-04-19T11:27:24+02:00',
|
||||||
|
tree_id: 'd2c60af597e863787d2d27f569e30495b0b92820',
|
||||||
|
url: 'https://github.com/docker/test-docker-action/commit/860c1904a1ce19322e91ac35af1ab07466440c37'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
compare: 'https://github.com/docker/test-docker-action/compare/5f3331d7f704...860c1904a1ce',
|
||||||
|
created: false,
|
||||||
|
deleted: false,
|
||||||
|
forced: false,
|
||||||
|
head_commit: {
|
||||||
|
author: {
|
||||||
|
email: 'crazy-max@users.noreply.github.com',
|
||||||
|
name: 'CrazyMax',
|
||||||
|
username: 'crazy-max'
|
||||||
|
},
|
||||||
|
committer: {
|
||||||
|
email: 'crazy-max@users.noreply.github.com',
|
||||||
|
name: 'CrazyMax',
|
||||||
|
username: 'crazy-max'
|
||||||
|
},
|
||||||
|
distinct: true,
|
||||||
|
id: '860c1904a1ce19322e91ac35af1ab07466440c37',
|
||||||
|
message: 'hello dev',
|
||||||
|
timestamp: '2022-04-19T11:27:24+02:00',
|
||||||
|
tree_id: 'd2c60af597e863787d2d27f569e30495b0b92820',
|
||||||
|
url: 'https://github.com/docker/test-docker-action/commit/860c1904a1ce19322e91ac35af1ab07466440c37'
|
||||||
|
},
|
||||||
|
organization: {
|
||||||
|
avatar_url: 'https://avatars.githubusercontent.com/u/5429470?v=4',
|
||||||
|
description: 'Docker helps developers bring their ideas to life by conquering the complexity of app development.',
|
||||||
|
events_url: 'https://api.github.com/orgs/docker/events',
|
||||||
|
hooks_url: 'https://api.github.com/orgs/docker/hooks',
|
||||||
|
id: 5429470,
|
||||||
|
issues_url: 'https://api.github.com/orgs/docker/issues',
|
||||||
|
login: 'docker',
|
||||||
|
members_url: 'https://api.github.com/orgs/docker/members{/member}',
|
||||||
|
node_id: 'MDEyOk9yZ2FuaXphdGlvbjU0Mjk0NzA=',
|
||||||
|
public_members_url: 'https://api.github.com/orgs/docker/public_members{/member}',
|
||||||
|
repos_url: 'https://api.github.com/orgs/docker/repos',
|
||||||
|
url: 'https://api.github.com/orgs/docker'
|
||||||
|
},
|
||||||
|
pusher: {
|
||||||
|
email: 'github@crazymax.dev',
|
||||||
|
name: 'crazy-max'
|
||||||
|
},
|
||||||
|
ref: 'refs/heads/dev',
|
||||||
|
repository: {
|
||||||
|
allow_forking: true,
|
||||||
|
archive_url: 'https://api.github.com/repos/docker/test-docker-action/{archive_format}{/ref}',
|
||||||
|
archived: false,
|
||||||
|
assignees_url: 'https://api.github.com/repos/docker/test-docker-action/assignees{/user}',
|
||||||
|
blobs_url: 'https://api.github.com/repos/docker/test-docker-action/git/blobs{/sha}',
|
||||||
|
branches_url: 'https://api.github.com/repos/docker/test-docker-action/branches{/branch}',
|
||||||
|
clone_url: 'https://github.com/docker/test-docker-action.git',
|
||||||
|
collaborators_url: 'https://api.github.com/repos/docker/test-docker-action/collaborators{/collaborator}',
|
||||||
|
comments_url: 'https://api.github.com/repos/docker/test-docker-action/comments{/number}',
|
||||||
|
commits_url: 'https://api.github.com/repos/docker/test-docker-action/commits{/sha}',
|
||||||
|
compare_url: 'https://api.github.com/repos/docker/test-docker-action/compare/{base}...{head}',
|
||||||
|
contents_url: 'https://api.github.com/repos/docker/test-docker-action/contents/{+path}',
|
||||||
|
contributors_url: 'https://api.github.com/repos/docker/test-docker-action/contributors',
|
||||||
|
created_at: 1596792180,
|
||||||
|
default_branch: 'master',
|
||||||
|
deployments_url: 'https://api.github.com/repos/docker/test-docker-action/deployments',
|
||||||
|
description: 'Test "Docker" Actions',
|
||||||
|
disabled: false,
|
||||||
|
downloads_url: 'https://api.github.com/repos/docker/test-docker-action/downloads',
|
||||||
|
events_url: 'https://api.github.com/repos/docker/test-docker-action/events',
|
||||||
|
fork: false,
|
||||||
|
forks: 1,
|
||||||
|
forks_count: 1,
|
||||||
|
forks_url: 'https://api.github.com/repos/docker/test-docker-action/forks',
|
||||||
|
full_name: 'docker/test-docker-action',
|
||||||
|
git_commits_url: 'https://api.github.com/repos/docker/test-docker-action/git/commits{/sha}',
|
||||||
|
git_refs_url: 'https://api.github.com/repos/docker/test-docker-action/git/refs{/sha}',
|
||||||
|
git_tags_url: 'https://api.github.com/repos/docker/test-docker-action/git/tags{/sha}',
|
||||||
|
git_url: 'git://github.com/docker/test-docker-action.git',
|
||||||
|
has_downloads: true,
|
||||||
|
has_issues: true,
|
||||||
|
has_pages: false,
|
||||||
|
has_projects: true,
|
||||||
|
has_wiki: true,
|
||||||
|
homepage: '',
|
||||||
|
hooks_url: 'https://api.github.com/repos/docker/test-docker-action/hooks',
|
||||||
|
html_url: 'https://github.com/docker/test-docker-action',
|
||||||
|
id: 285789493,
|
||||||
|
is_template: false,
|
||||||
|
issue_comment_url: 'https://api.github.com/repos/docker/test-docker-action/issues/comments{/number}',
|
||||||
|
issue_events_url: 'https://api.github.com/repos/docker/test-docker-action/issues/events{/number}',
|
||||||
|
issues_url: 'https://api.github.com/repos/docker/test-docker-action/issues{/number}',
|
||||||
|
keys_url: 'https://api.github.com/repos/docker/test-docker-action/keys{/key_id}',
|
||||||
|
labels_url: 'https://api.github.com/repos/docker/test-docker-action/labels{/name}',
|
||||||
|
language: 'JavaScript',
|
||||||
|
languages_url: 'https://api.github.com/repos/docker/test-docker-action/languages',
|
||||||
|
license: {
|
||||||
|
key: 'mit',
|
||||||
|
name: 'MIT License',
|
||||||
|
node_id: 'MDc6TGljZW5zZTEz',
|
||||||
|
spdx_id: 'MIT',
|
||||||
|
url: 'https://api.github.com/licenses/mit'
|
||||||
|
},
|
||||||
|
master_branch: 'master',
|
||||||
|
merges_url: 'https://api.github.com/repos/docker/test-docker-action/merges',
|
||||||
|
milestones_url: 'https://api.github.com/repos/docker/test-docker-action/milestones{/number}',
|
||||||
|
mirror_url: null,
|
||||||
|
name: 'test-docker-action',
|
||||||
|
node_id: 'MDEwOlJlcG9zaXRvcnkyODU3ODk0OTM=',
|
||||||
|
notifications_url: 'https://api.github.com/repos/docker/test-docker-action/notifications{?since,all,participating}',
|
||||||
|
open_issues: 6,
|
||||||
|
open_issues_count: 6,
|
||||||
|
organization: 'docker',
|
||||||
|
owner: {
|
||||||
|
avatar_url: 'https://avatars.githubusercontent.com/u/5429470?v=4',
|
||||||
|
email: 'info@docker.com',
|
||||||
|
events_url: 'https://api.github.com/users/docker/events{/privacy}',
|
||||||
|
followers_url: 'https://api.github.com/users/docker/followers',
|
||||||
|
following_url: 'https://api.github.com/users/docker/following{/other_user}',
|
||||||
|
gists_url: 'https://api.github.com/users/docker/gists{/gist_id}',
|
||||||
|
gravatar_id: '',
|
||||||
|
html_url: 'https://github.com/docker',
|
||||||
|
id: 5429470,
|
||||||
|
login: 'docker',
|
||||||
|
name: 'docker',
|
||||||
|
node_id: 'MDEyOk9yZ2FuaXphdGlvbjU0Mjk0NzA=',
|
||||||
|
organizations_url: 'https://api.github.com/users/docker/orgs',
|
||||||
|
received_events_url: 'https://api.github.com/users/docker/received_events',
|
||||||
|
repos_url: 'https://api.github.com/users/docker/repos',
|
||||||
|
site_admin: false,
|
||||||
|
starred_url: 'https://api.github.com/users/docker/starred{/owner}{/repo}',
|
||||||
|
subscriptions_url: 'https://api.github.com/users/docker/subscriptions',
|
||||||
|
type: 'Organization',
|
||||||
|
url: 'https://api.github.com/users/docker'
|
||||||
|
},
|
||||||
|
private: true,
|
||||||
|
pulls_url: 'https://api.github.com/repos/docker/test-docker-action/pulls{/number}',
|
||||||
|
pushed_at: 1650360446,
|
||||||
|
releases_url: 'https://api.github.com/repos/docker/test-docker-action/releases{/id}',
|
||||||
|
size: 796,
|
||||||
|
ssh_url: 'git@github.com:docker/test-docker-action.git',
|
||||||
|
stargazers: 0,
|
||||||
|
stargazers_count: 0,
|
||||||
|
stargazers_url: 'https://api.github.com/repos/docker/test-docker-action/stargazers',
|
||||||
|
statuses_url: 'https://api.github.com/repos/docker/test-docker-action/statuses/{sha}',
|
||||||
|
subscribers_url: 'https://api.github.com/repos/docker/test-docker-action/subscribers',
|
||||||
|
subscription_url: 'https://api.github.com/repos/docker/test-docker-action/subscription',
|
||||||
|
svn_url: 'https://github.com/docker/test-docker-action',
|
||||||
|
tags_url: 'https://api.github.com/repos/docker/test-docker-action/tags',
|
||||||
|
teams_url: 'https://api.github.com/repos/docker/test-docker-action/teams',
|
||||||
|
topics: [],
|
||||||
|
trees_url: 'https://api.github.com/repos/docker/test-docker-action/git/trees{/sha}',
|
||||||
|
updated_at: '2022-04-19T09:05:09Z',
|
||||||
|
url: 'https://github.com/docker/test-docker-action',
|
||||||
|
visibility: 'private',
|
||||||
|
watchers: 0,
|
||||||
|
watchers_count: 0
|
||||||
|
},
|
||||||
|
sender: {
|
||||||
|
avatar_url: 'https://avatars.githubusercontent.com/u/1951866?v=4',
|
||||||
|
events_url: 'https://api.github.com/users/crazy-max/events{/privacy}',
|
||||||
|
followers_url: 'https://api.github.com/users/crazy-max/followers',
|
||||||
|
following_url: 'https://api.github.com/users/crazy-max/following{/other_user}',
|
||||||
|
gists_url: 'https://api.github.com/users/crazy-max/gists{/gist_id}',
|
||||||
|
gravatar_id: '',
|
||||||
|
html_url: 'https://github.com/crazy-max',
|
||||||
|
id: 1951866,
|
||||||
|
login: 'crazy-max',
|
||||||
|
node_id: 'MDQ6VXNlcjE5NTE4NjY=',
|
||||||
|
organizations_url: 'https://api.github.com/users/crazy-max/orgs',
|
||||||
|
received_events_url: 'https://api.github.com/users/crazy-max/received_events',
|
||||||
|
repos_url: 'https://api.github.com/users/crazy-max/repos',
|
||||||
|
site_admin: false,
|
||||||
|
starred_url: 'https://api.github.com/users/crazy-max/starred{/owner}{/repo}',
|
||||||
|
subscriptions_url: 'https://api.github.com/users/crazy-max/subscriptions',
|
||||||
|
type: 'User',
|
||||||
|
url: 'https://api.github.com/users/crazy-max'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getOctokit = jest.fn();
|
646
__tests__/context.test.ts
Executable file
646
__tests__/context.test.ts
Executable file
@ -0,0 +1,646 @@
|
|||||||
|
import {beforeEach, describe, expect, jest, test} from '@jest/globals';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
import {Builder} from '@docker/actions-toolkit/lib/buildx/builder';
|
||||||
|
import {Buildx} from '@docker/actions-toolkit/lib/buildx/buildx';
|
||||||
|
import {Context} from '@docker/actions-toolkit/lib/context';
|
||||||
|
import {Docker} from '@docker/actions-toolkit/lib/docker/docker';
|
||||||
|
import {GitHub} from '@docker/actions-toolkit/lib/github';
|
||||||
|
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit';
|
||||||
|
import {BuilderInfo} from '@docker/actions-toolkit/lib/types/builder';
|
||||||
|
import {GitHubRepo} from '@docker/actions-toolkit/lib/types/github';
|
||||||
|
|
||||||
|
import * as context from '../src/context';
|
||||||
|
|
||||||
|
const tmpDir = path.join('/tmp', '.docker-build-push-jest');
|
||||||
|
const tmpName = path.join(tmpDir, '.tmpname-jest');
|
||||||
|
|
||||||
|
import repoFixture from './fixtures/github-repo.json';
|
||||||
|
jest.spyOn(GitHub.prototype, 'repoData').mockImplementation((): Promise<GitHubRepo> => {
|
||||||
|
return <Promise<GitHubRepo>>(repoFixture as unknown);
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.spyOn(Context, 'tmpDir').mockImplementation((): string => {
|
||||||
|
if (!fs.existsSync(tmpDir)) {
|
||||||
|
fs.mkdirSync(tmpDir, {recursive: true});
|
||||||
|
}
|
||||||
|
return tmpDir;
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
|
||||||
|
return tmpName;
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.spyOn(Docker, 'isAvailable').mockImplementation(async (): Promise<boolean> => {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<BuilderInfo> => {
|
||||||
|
return {
|
||||||
|
name: 'builder2',
|
||||||
|
driver: 'docker-container',
|
||||||
|
lastActivity: new Date('2023-01-16 09:45:23 +0000 UTC'),
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
buildkit: 'v0.11.0',
|
||||||
|
'buildkitd-flags': '--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host',
|
||||||
|
'driver-opts': ['BUILDKIT_STEP_LOG_MAX_SIZE=10485760', 'BUILDKIT_STEP_LOG_MAX_SPEED=10485760', 'JAEGER_TRACE=localhost:6831', 'image=moby/buildkit:latest', 'network=host'],
|
||||||
|
endpoint: 'unix:///var/run/docker.sock',
|
||||||
|
name: 'builder20',
|
||||||
|
platforms: 'linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6',
|
||||||
|
status: 'running'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getArgs', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
process.env = Object.keys(process.env).reduce((object, key) => {
|
||||||
|
if (!key.startsWith('INPUT_')) {
|
||||||
|
object[key] = process.env[key];
|
||||||
|
}
|
||||||
|
return object;
|
||||||
|
}, {});
|
||||||
|
});
|
||||||
|
|
||||||
|
// prettier-ignore
|
||||||
|
test.each([
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
'0.4.1',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
'0.4.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['build-args', `MY_ARG=val1,val2,val3
|
||||||
|
ARG=val
|
||||||
|
"MULTILINE=aaaa
|
||||||
|
bbbb
|
||||||
|
ccc"`],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--build-arg', 'MY_ARG=val1,val2,val3',
|
||||||
|
'--build-arg', 'ARG=val',
|
||||||
|
'--build-arg', `MULTILINE=aaaa\nbbbb\nccc`,
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'https://github.com/docker/build-push-action.git#refs/heads/master'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2,
|
||||||
|
'0.4.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['tags', 'name/app:7.4, name/app:latest'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--tag', 'name/app:7.4',
|
||||||
|
'--tag', 'name/app:latest',
|
||||||
|
'https://github.com/docker/build-push-action.git#refs/heads/master'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
3,
|
||||||
|
'0.4.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['labels', 'org.opencontainers.image.title=buildkit\norg.opencontainers.image.description=concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit'],
|
||||||
|
['outputs', 'type=local,dest=./release-out'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--label', 'org.opencontainers.image.title=buildkit',
|
||||||
|
'--label', 'org.opencontainers.image.description=concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit',
|
||||||
|
'--output', 'type=local,dest=./release-out',
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
4,
|
||||||
|
'0.4.1',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['platforms', 'linux/amd64,linux/arm64'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--platform', 'linux/amd64,linux/arm64',
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
5,
|
||||||
|
'0.4.1',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
6,
|
||||||
|
'0.4.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['secrets', 'GIT_AUTH_TOKEN=abcdefghijklmno=0123456789'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--secret', `id=GIT_AUTH_TOKEN,src=${tmpName}`,
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
7,
|
||||||
|
'0.4.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['github-token', 'abcdefghijklmno0123456789'],
|
||||||
|
['outputs', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--output', '.',
|
||||||
|
'--secret', `id=GIT_AUTH_TOKEN,src=${tmpName}`,
|
||||||
|
'https://github.com/docker/build-push-action.git#refs/heads/master'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
8,
|
||||||
|
'0.4.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', 'https://github.com/docker/build-push-action.git#refs/heads/master'],
|
||||||
|
['tag', 'localhost:5000/name/app:latest'],
|
||||||
|
['platforms', 'linux/amd64,linux/arm64'],
|
||||||
|
['secrets', 'GIT_AUTH_TOKEN=abcdefghijklmno=0123456789'],
|
||||||
|
['file', './test/Dockerfile'],
|
||||||
|
['builder', 'builder-git-context-2'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'true'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--file', './test/Dockerfile',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--platform', 'linux/amd64,linux/arm64',
|
||||||
|
'--secret', `id=GIT_AUTH_TOKEN,src=${tmpName}`,
|
||||||
|
'--builder', 'builder-git-context-2',
|
||||||
|
'--push',
|
||||||
|
'https://github.com/docker/build-push-action.git#refs/heads/master'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
9,
|
||||||
|
'0.4.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', 'https://github.com/docker/build-push-action.git#refs/heads/master'],
|
||||||
|
['tag', 'localhost:5000/name/app:latest'],
|
||||||
|
['platforms', 'linux/amd64,linux/arm64'],
|
||||||
|
['secrets', `GIT_AUTH_TOKEN=abcdefghi,jklmno=0123456789
|
||||||
|
"MYSECRET=aaaaaaaa
|
||||||
|
bbbbbbb
|
||||||
|
ccccccccc"
|
||||||
|
FOO=bar
|
||||||
|
"EMPTYLINE=aaaa
|
||||||
|
|
||||||
|
bbbb
|
||||||
|
ccc"`],
|
||||||
|
['file', './test/Dockerfile'],
|
||||||
|
['builder', 'builder-git-context-2'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'true'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--file', './test/Dockerfile',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--platform', 'linux/amd64,linux/arm64',
|
||||||
|
'--secret', `id=GIT_AUTH_TOKEN,src=${tmpName}`,
|
||||||
|
'--secret', `id=MYSECRET,src=${tmpName}`,
|
||||||
|
'--secret', `id=FOO,src=${tmpName}`,
|
||||||
|
'--secret', `id=EMPTYLINE,src=${tmpName}`,
|
||||||
|
'--builder', 'builder-git-context-2',
|
||||||
|
'--push',
|
||||||
|
'https://github.com/docker/build-push-action.git#refs/heads/master'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
10,
|
||||||
|
'0.4.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', 'https://github.com/docker/build-push-action.git#refs/heads/master'],
|
||||||
|
['tag', 'localhost:5000/name/app:latest'],
|
||||||
|
['platforms', 'linux/amd64,linux/arm64'],
|
||||||
|
['secrets', `GIT_AUTH_TOKEN=abcdefghi,jklmno=0123456789
|
||||||
|
MYSECRET=aaaaaaaa
|
||||||
|
bbbbbbb
|
||||||
|
ccccccccc
|
||||||
|
FOO=bar
|
||||||
|
EMPTYLINE=aaaa
|
||||||
|
|
||||||
|
bbbb
|
||||||
|
ccc`],
|
||||||
|
['file', './test/Dockerfile'],
|
||||||
|
['builder', 'builder-git-context-2'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'true'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--file', './test/Dockerfile',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--platform', 'linux/amd64,linux/arm64',
|
||||||
|
'--secret', `id=GIT_AUTH_TOKEN,src=${tmpName}`,
|
||||||
|
'--secret', `id=MYSECRET,src=${tmpName}`,
|
||||||
|
'--secret', `id=FOO,src=${tmpName}`,
|
||||||
|
'--secret', `id=EMPTYLINE,src=${tmpName}`,
|
||||||
|
'--builder', 'builder-git-context-2',
|
||||||
|
'--push',
|
||||||
|
'https://github.com/docker/build-push-action.git#refs/heads/master'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
11,
|
||||||
|
'0.5.1',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', 'https://github.com/docker/build-push-action.git#refs/heads/master'],
|
||||||
|
['tag', 'localhost:5000/name/app:latest'],
|
||||||
|
['secret-files', `MY_SECRET=${path.join(__dirname, 'fixtures', 'secret.txt')}`],
|
||||||
|
['file', './test/Dockerfile'],
|
||||||
|
['builder', 'builder-git-context-2'],
|
||||||
|
['network', 'host'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'true'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--file', './test/Dockerfile',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--secret', `id=MY_SECRET,src=${tmpName}`,
|
||||||
|
'--builder', 'builder-git-context-2',
|
||||||
|
'--network', 'host',
|
||||||
|
'--push',
|
||||||
|
'https://github.com/docker/build-push-action.git#refs/heads/master'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
12,
|
||||||
|
'0.4.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['labels', 'org.opencontainers.image.title=filter_results_top_n\norg.opencontainers.image.description=Reference implementation of operation "filter results (top-n)"'],
|
||||||
|
['outputs', 'type=local,dest=./release-out'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--label', 'org.opencontainers.image.title=filter_results_top_n',
|
||||||
|
'--label', 'org.opencontainers.image.description=Reference implementation of operation "filter results (top-n)"',
|
||||||
|
'--output', 'type=local,dest=./release-out',
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
13,
|
||||||
|
'0.6.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['tag', 'localhost:5000/name/app:latest'],
|
||||||
|
['file', './test/Dockerfile'],
|
||||||
|
['add-hosts', 'docker:10.180.0.1,foo:10.0.0.1'],
|
||||||
|
['network', 'host'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'true'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--add-host', 'docker:10.180.0.1',
|
||||||
|
'--add-host', 'foo:10.0.0.1',
|
||||||
|
'--file', './test/Dockerfile',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'--network', 'host',
|
||||||
|
'--push',
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
14,
|
||||||
|
'0.7.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['file', './test/Dockerfile'],
|
||||||
|
['add-hosts', 'docker:10.180.0.1\nfoo:10.0.0.1'],
|
||||||
|
['cgroup-parent', 'foo'],
|
||||||
|
['shm-size', '2g'],
|
||||||
|
['ulimit', `nofile=1024:1024
|
||||||
|
nproc=3`],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--add-host', 'docker:10.180.0.1',
|
||||||
|
'--add-host', 'foo:10.0.0.1',
|
||||||
|
'--cgroup-parent', 'foo',
|
||||||
|
'--file', './test/Dockerfile',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--shm-size', '2g',
|
||||||
|
'--ulimit', 'nofile=1024:1024',
|
||||||
|
'--ulimit', 'nproc=3',
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
15,
|
||||||
|
'0.7.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '{{defaultContext}}:docker'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'https://github.com/docker/build-push-action.git#refs/heads/master:docker'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
16,
|
||||||
|
'0.8.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['github-token', 'abcdefghijklmno0123456789'],
|
||||||
|
['context', '{{defaultContext}}:subdir'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--secret', `id=GIT_AUTH_TOKEN,src=${tmpName}`,
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'https://github.com/docker/build-push-action.git#refs/heads/master:subdir'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
17,
|
||||||
|
'0.8.2',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
['provenance', 'true'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
18,
|
||||||
|
'0.10.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
"--provenance", `mode=min,inline-only=true,builder-id=https://github.com/docker/build-push-action/actions/runs/123456789`,
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
19,
|
||||||
|
'0.10.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
['provenance', 'true'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
"--provenance", `builder-id=https://github.com/docker/build-push-action/actions/runs/123456789`,
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
20,
|
||||||
|
'0.10.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
['provenance', 'mode=max'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
"--provenance", `mode=max,builder-id=https://github.com/docker/build-push-action/actions/runs/123456789`,
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
21,
|
||||||
|
'0.10.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
['provenance', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
"--provenance", 'false',
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
22,
|
||||||
|
'0.10.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
['provenance', 'builder-id=foo'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
"--provenance", 'builder-id=foo',
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
23,
|
||||||
|
'0.10.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'false'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
['outputs', 'type=docker'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
"--output", 'type=docker',
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
24,
|
||||||
|
'0.10.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['load', 'true'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--load',
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
25,
|
||||||
|
'0.10.0',
|
||||||
|
new Map<string, string>([
|
||||||
|
['context', '.'],
|
||||||
|
['build-args', `FOO=bar#baz`],
|
||||||
|
['load', 'true'],
|
||||||
|
['no-cache', 'false'],
|
||||||
|
['push', 'false'],
|
||||||
|
['pull', 'false'],
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
'build',
|
||||||
|
'--build-arg', 'FOO=bar#baz',
|
||||||
|
'--iidfile', path.join(tmpDir, 'iidfile'),
|
||||||
|
'--load',
|
||||||
|
'--metadata-file', path.join(tmpDir, 'metadata-file'),
|
||||||
|
'.'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
])(
|
||||||
|
'[%d] given %p with %p as inputs, returns %p',
|
||||||
|
async (num: number, buildxVersion: string, inputs: Map<string, string>, expected: Array<string>) => {
|
||||||
|
inputs.forEach((value: string, name: string) => {
|
||||||
|
setInput(name, value);
|
||||||
|
});
|
||||||
|
const toolkit = new Toolkit();
|
||||||
|
jest.spyOn(Buildx.prototype, 'version').mockImplementation(async (): Promise<string> => {
|
||||||
|
return buildxVersion;
|
||||||
|
});
|
||||||
|
const inp = await context.getInputs();
|
||||||
|
const res = await context.getArgs(inp, toolkit);
|
||||||
|
expect(res).toEqual(expected);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// See: https://github.com/actions/toolkit/blob/a1b068ec31a042ff1e10a522d8fdf0b8869d53ca/packages/core/src/core.ts#L89
|
||||||
|
function getInputName(name: string): string {
|
||||||
|
return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setInput(name: string, value: string): void {
|
||||||
|
process.env[getInputName(name)] = value;
|
||||||
|
}
|
362
__tests__/fixtures/github-repo.json
Executable file
362
__tests__/fixtures/github-repo.json
Executable file
@ -0,0 +1,362 @@
|
|||||||
|
{
|
||||||
|
"id": 1296269,
|
||||||
|
"node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
|
||||||
|
"name": "Hello-World",
|
||||||
|
"full_name": "octocat/Hello-World",
|
||||||
|
"owner": {
|
||||||
|
"login": "octocat",
|
||||||
|
"id": 1,
|
||||||
|
"node_id": "MDQ6VXNlcjE=",
|
||||||
|
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/octocat",
|
||||||
|
"html_url": "https://github.com/octocat",
|
||||||
|
"followers_url": "https://api.github.com/users/octocat/followers",
|
||||||
|
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/octocat/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/octocat/repos",
|
||||||
|
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/octocat/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"site_admin": false
|
||||||
|
},
|
||||||
|
"private": false,
|
||||||
|
"html_url": "https://github.com/octocat/Hello-World",
|
||||||
|
"description": "This your first repo!",
|
||||||
|
"fork": false,
|
||||||
|
"url": "https://api.github.com/repos/octocat/Hello-World",
|
||||||
|
"archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
|
||||||
|
"assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
|
||||||
|
"blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
|
||||||
|
"branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
|
||||||
|
"collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
|
||||||
|
"comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
|
||||||
|
"commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
|
||||||
|
"compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
|
||||||
|
"contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
|
||||||
|
"contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
|
||||||
|
"deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
|
||||||
|
"downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
|
||||||
|
"events_url": "http://api.github.com/repos/octocat/Hello-World/events",
|
||||||
|
"forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
|
||||||
|
"git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
|
||||||
|
"git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
|
||||||
|
"git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
|
||||||
|
"git_url": "git:github.com/octocat/Hello-World.git",
|
||||||
|
"issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
|
||||||
|
"issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
|
||||||
|
"issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
|
||||||
|
"keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
|
||||||
|
"labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
|
||||||
|
"languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
|
||||||
|
"merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
|
||||||
|
"milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
|
||||||
|
"notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
|
||||||
|
"pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
|
||||||
|
"releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
|
||||||
|
"ssh_url": "git@github.com:octocat/Hello-World.git",
|
||||||
|
"stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
|
||||||
|
"statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
|
||||||
|
"subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
|
||||||
|
"subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
|
||||||
|
"tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
|
||||||
|
"teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
|
||||||
|
"trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}",
|
||||||
|
"clone_url": "https://github.com/octocat/Hello-World.git",
|
||||||
|
"mirror_url": "git:git.example.com/octocat/Hello-World",
|
||||||
|
"hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks",
|
||||||
|
"svn_url": "https://svn.github.com/octocat/Hello-World",
|
||||||
|
"homepage": "https://github.com",
|
||||||
|
"language": null,
|
||||||
|
"forks_count": 9,
|
||||||
|
"stargazers_count": 80,
|
||||||
|
"watchers_count": 80,
|
||||||
|
"size": 108,
|
||||||
|
"default_branch": "master",
|
||||||
|
"open_issues_count": 0,
|
||||||
|
"is_template": true,
|
||||||
|
"topics": [
|
||||||
|
"octocat",
|
||||||
|
"atom",
|
||||||
|
"electron",
|
||||||
|
"api"
|
||||||
|
],
|
||||||
|
"has_issues": true,
|
||||||
|
"has_projects": true,
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pages": false,
|
||||||
|
"has_downloads": true,
|
||||||
|
"archived": false,
|
||||||
|
"disabled": false,
|
||||||
|
"visibility": "public",
|
||||||
|
"pushed_at": "2011-01-26T19:06:43Z",
|
||||||
|
"created_at": "2011-01-26T19:01:12Z",
|
||||||
|
"updated_at": "2011-01-26T19:14:43Z",
|
||||||
|
"permissions": {
|
||||||
|
"pull": true,
|
||||||
|
"triage": true,
|
||||||
|
"push": false,
|
||||||
|
"maintain": false,
|
||||||
|
"admin": false
|
||||||
|
},
|
||||||
|
"allow_rebase_merge": true,
|
||||||
|
"template_repository": null,
|
||||||
|
"temp_clone_token": "ABTLWHOULUVAXGTRYU7OC2876QJ2O",
|
||||||
|
"allow_squash_merge": true,
|
||||||
|
"delete_branch_on_merge": true,
|
||||||
|
"allow_merge_commit": true,
|
||||||
|
"subscribers_count": 42,
|
||||||
|
"network_count": 0,
|
||||||
|
"license": {
|
||||||
|
"key": "mit",
|
||||||
|
"name": "MIT License",
|
||||||
|
"spdx_id": "MIT",
|
||||||
|
"url": "https://api.github.com/licenses/mit",
|
||||||
|
"node_id": "MDc6TGljZW5zZW1pdA=="
|
||||||
|
},
|
||||||
|
"organization": {
|
||||||
|
"login": "octocat",
|
||||||
|
"id": 1,
|
||||||
|
"node_id": "MDQ6VXNlcjE=",
|
||||||
|
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/octocat",
|
||||||
|
"html_url": "https://github.com/octocat",
|
||||||
|
"followers_url": "https://api.github.com/users/octocat/followers",
|
||||||
|
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/octocat/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/octocat/repos",
|
||||||
|
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/octocat/received_events",
|
||||||
|
"type": "Organization",
|
||||||
|
"site_admin": false
|
||||||
|
},
|
||||||
|
"parent": {
|
||||||
|
"id": 1296269,
|
||||||
|
"node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
|
||||||
|
"name": "Hello-World",
|
||||||
|
"full_name": "octocat/Hello-World",
|
||||||
|
"owner": {
|
||||||
|
"login": "octocat",
|
||||||
|
"id": 1,
|
||||||
|
"node_id": "MDQ6VXNlcjE=",
|
||||||
|
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/octocat",
|
||||||
|
"html_url": "https://github.com/octocat",
|
||||||
|
"followers_url": "https://api.github.com/users/octocat/followers",
|
||||||
|
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/octocat/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/octocat/repos",
|
||||||
|
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/octocat/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"site_admin": false
|
||||||
|
},
|
||||||
|
"private": false,
|
||||||
|
"html_url": "https://github.com/octocat/Hello-World",
|
||||||
|
"description": "This your first repo!",
|
||||||
|
"fork": false,
|
||||||
|
"url": "https://api.github.com/repos/octocat/Hello-World",
|
||||||
|
"archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
|
||||||
|
"assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
|
||||||
|
"blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
|
||||||
|
"branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
|
||||||
|
"collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
|
||||||
|
"comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
|
||||||
|
"commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
|
||||||
|
"compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
|
||||||
|
"contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
|
||||||
|
"contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
|
||||||
|
"deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
|
||||||
|
"downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
|
||||||
|
"events_url": "http://api.github.com/repos/octocat/Hello-World/events",
|
||||||
|
"forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
|
||||||
|
"git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
|
||||||
|
"git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
|
||||||
|
"git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
|
||||||
|
"git_url": "git:github.com/octocat/Hello-World.git",
|
||||||
|
"issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
|
||||||
|
"issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
|
||||||
|
"issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
|
||||||
|
"keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
|
||||||
|
"labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
|
||||||
|
"languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
|
||||||
|
"merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
|
||||||
|
"milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
|
||||||
|
"notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
|
||||||
|
"pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
|
||||||
|
"releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
|
||||||
|
"ssh_url": "git@github.com:octocat/Hello-World.git",
|
||||||
|
"stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
|
||||||
|
"statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
|
||||||
|
"subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
|
||||||
|
"subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
|
||||||
|
"tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
|
||||||
|
"teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
|
||||||
|
"trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}",
|
||||||
|
"clone_url": "https://github.com/octocat/Hello-World.git",
|
||||||
|
"mirror_url": "git:git.example.com/octocat/Hello-World",
|
||||||
|
"hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks",
|
||||||
|
"svn_url": "https://svn.github.com/octocat/Hello-World",
|
||||||
|
"homepage": "https://github.com",
|
||||||
|
"language": null,
|
||||||
|
"forks_count": 9,
|
||||||
|
"stargazers_count": 80,
|
||||||
|
"watchers_count": 80,
|
||||||
|
"size": 108,
|
||||||
|
"default_branch": "master",
|
||||||
|
"open_issues_count": 0,
|
||||||
|
"is_template": true,
|
||||||
|
"topics": [
|
||||||
|
"octocat",
|
||||||
|
"atom",
|
||||||
|
"electron",
|
||||||
|
"api"
|
||||||
|
],
|
||||||
|
"has_issues": true,
|
||||||
|
"has_projects": true,
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pages": false,
|
||||||
|
"has_downloads": true,
|
||||||
|
"archived": false,
|
||||||
|
"disabled": false,
|
||||||
|
"visibility": "public",
|
||||||
|
"pushed_at": "2011-01-26T19:06:43Z",
|
||||||
|
"created_at": "2011-01-26T19:01:12Z",
|
||||||
|
"updated_at": "2011-01-26T19:14:43Z",
|
||||||
|
"permissions": {
|
||||||
|
"admin": false,
|
||||||
|
"push": false,
|
||||||
|
"pull": true
|
||||||
|
},
|
||||||
|
"allow_rebase_merge": true,
|
||||||
|
"template_repository": null,
|
||||||
|
"temp_clone_token": "ABTLWHOULUVAXGTRYU7OC2876QJ2O",
|
||||||
|
"allow_squash_merge": true,
|
||||||
|
"delete_branch_on_merge": true,
|
||||||
|
"allow_merge_commit": true,
|
||||||
|
"subscribers_count": 42,
|
||||||
|
"network_count": 0
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"id": 1296269,
|
||||||
|
"node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
|
||||||
|
"name": "Hello-World",
|
||||||
|
"full_name": "octocat/Hello-World",
|
||||||
|
"owner": {
|
||||||
|
"login": "octocat",
|
||||||
|
"id": 1,
|
||||||
|
"node_id": "MDQ6VXNlcjE=",
|
||||||
|
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/octocat",
|
||||||
|
"html_url": "https://github.com/octocat",
|
||||||
|
"followers_url": "https://api.github.com/users/octocat/followers",
|
||||||
|
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/octocat/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/octocat/repos",
|
||||||
|
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/octocat/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"site_admin": false
|
||||||
|
},
|
||||||
|
"private": false,
|
||||||
|
"html_url": "https://github.com/octocat/Hello-World",
|
||||||
|
"description": "This your first repo!",
|
||||||
|
"fork": false,
|
||||||
|
"url": "https://api.github.com/repos/octocat/Hello-World",
|
||||||
|
"archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
|
||||||
|
"assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
|
||||||
|
"blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
|
||||||
|
"branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
|
||||||
|
"collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
|
||||||
|
"comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
|
||||||
|
"commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
|
||||||
|
"compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
|
||||||
|
"contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
|
||||||
|
"contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
|
||||||
|
"deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
|
||||||
|
"downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
|
||||||
|
"events_url": "http://api.github.com/repos/octocat/Hello-World/events",
|
||||||
|
"forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
|
||||||
|
"git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
|
||||||
|
"git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
|
||||||
|
"git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
|
||||||
|
"git_url": "git:github.com/octocat/Hello-World.git",
|
||||||
|
"issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
|
||||||
|
"issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
|
||||||
|
"issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
|
||||||
|
"keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
|
||||||
|
"labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
|
||||||
|
"languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
|
||||||
|
"merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
|
||||||
|
"milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
|
||||||
|
"notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
|
||||||
|
"pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
|
||||||
|
"releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
|
||||||
|
"ssh_url": "git@github.com:octocat/Hello-World.git",
|
||||||
|
"stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
|
||||||
|
"statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
|
||||||
|
"subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
|
||||||
|
"subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
|
||||||
|
"tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
|
||||||
|
"teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
|
||||||
|
"trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}",
|
||||||
|
"clone_url": "https://github.com/octocat/Hello-World.git",
|
||||||
|
"mirror_url": "git:git.example.com/octocat/Hello-World",
|
||||||
|
"hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks",
|
||||||
|
"svn_url": "https://svn.github.com/octocat/Hello-World",
|
||||||
|
"homepage": "https://github.com",
|
||||||
|
"language": null,
|
||||||
|
"forks_count": 9,
|
||||||
|
"stargazers_count": 80,
|
||||||
|
"watchers_count": 80,
|
||||||
|
"size": 108,
|
||||||
|
"default_branch": "master",
|
||||||
|
"open_issues_count": 0,
|
||||||
|
"is_template": true,
|
||||||
|
"topics": [
|
||||||
|
"octocat",
|
||||||
|
"atom",
|
||||||
|
"electron",
|
||||||
|
"api"
|
||||||
|
],
|
||||||
|
"has_issues": true,
|
||||||
|
"has_projects": true,
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pages": false,
|
||||||
|
"has_downloads": true,
|
||||||
|
"archived": false,
|
||||||
|
"disabled": false,
|
||||||
|
"visibility": "public",
|
||||||
|
"pushed_at": "2011-01-26T19:06:43Z",
|
||||||
|
"created_at": "2011-01-26T19:01:12Z",
|
||||||
|
"updated_at": "2011-01-26T19:14:43Z",
|
||||||
|
"permissions": {
|
||||||
|
"admin": false,
|
||||||
|
"push": false,
|
||||||
|
"pull": true
|
||||||
|
},
|
||||||
|
"allow_rebase_merge": true,
|
||||||
|
"template_repository": null,
|
||||||
|
"temp_clone_token": "ABTLWHOULUVAXGTRYU7OC2876QJ2O",
|
||||||
|
"allow_squash_merge": true,
|
||||||
|
"delete_branch_on_merge": true,
|
||||||
|
"allow_merge_commit": true,
|
||||||
|
"subscribers_count": 42,
|
||||||
|
"network_count": 0
|
||||||
|
}
|
||||||
|
}
|
1
__tests__/fixtures/secret.txt
Executable file
1
__tests__/fixtures/secret.txt
Executable file
@ -0,0 +1 @@
|
|||||||
|
bar
|
117
action.yml
Executable file
117
action.yml
Executable file
@ -0,0 +1,117 @@
|
|||||||
|
# https://help.github.com/en/articles/metadata-syntax-for-github-actions
|
||||||
|
name: Build and push Docker images
|
||||||
|
description: Build and push Docker images with Buildx
|
||||||
|
author: docker
|
||||||
|
branding:
|
||||||
|
icon: 'anchor'
|
||||||
|
color: 'blue'
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
add-hosts:
|
||||||
|
description: "List of a customs host-to-IP mapping (e.g., docker:10.180.0.1)"
|
||||||
|
required: false
|
||||||
|
allow:
|
||||||
|
description: "List of extra privileged entitlement (e.g., network.host,security.insecure)"
|
||||||
|
required: false
|
||||||
|
attests:
|
||||||
|
description: "List of attestation parameters (e.g., type=sbom,generator=image)"
|
||||||
|
required: false
|
||||||
|
build-args:
|
||||||
|
description: "List of build-time variables"
|
||||||
|
required: false
|
||||||
|
build-contexts:
|
||||||
|
description: "List of additional build contexts (e.g., name=path)"
|
||||||
|
required: false
|
||||||
|
builder:
|
||||||
|
description: "Builder instance"
|
||||||
|
required: false
|
||||||
|
cache-from:
|
||||||
|
description: "List of external cache sources for buildx (e.g., user/app:cache, type=local,src=path/to/dir)"
|
||||||
|
required: false
|
||||||
|
cache-to:
|
||||||
|
description: "List of cache export destinations for buildx (e.g., user/app:cache, type=local,dest=path/to/dir)"
|
||||||
|
required: false
|
||||||
|
cgroup-parent:
|
||||||
|
description: "Optional parent cgroup for the container used in the build"
|
||||||
|
required: false
|
||||||
|
context:
|
||||||
|
description: "Build's context is the set of files located in the specified PATH or URL"
|
||||||
|
required: false
|
||||||
|
file:
|
||||||
|
description: "Path to the Dockerfile"
|
||||||
|
required: false
|
||||||
|
labels:
|
||||||
|
description: "List of metadata for an image"
|
||||||
|
required: false
|
||||||
|
load:
|
||||||
|
description: "Load is a shorthand for --output=type=docker"
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
network:
|
||||||
|
description: "Set the networking mode for the RUN instructions during build"
|
||||||
|
required: false
|
||||||
|
no-cache:
|
||||||
|
description: "Do not use cache when building the image"
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
no-cache-filters:
|
||||||
|
description: "Do not cache specified stages"
|
||||||
|
required: false
|
||||||
|
outputs:
|
||||||
|
description: "List of output destinations (format: type=local,dest=path)"
|
||||||
|
required: false
|
||||||
|
platforms:
|
||||||
|
description: "List of target platforms for build"
|
||||||
|
required: false
|
||||||
|
provenance:
|
||||||
|
description: "Generate provenance attestation for the build (shorthand for --attest=type=provenance)"
|
||||||
|
required: false
|
||||||
|
pull:
|
||||||
|
description: "Always attempt to pull all referenced images"
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
push:
|
||||||
|
description: "Push is a shorthand for --output=type=registry"
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
sbom:
|
||||||
|
description: "Generate SBOM attestation for the build (shorthand for --attest=type=sbom)"
|
||||||
|
required: false
|
||||||
|
secrets:
|
||||||
|
description: "List of secrets to expose to the build (e.g., key=string, GIT_AUTH_TOKEN=mytoken)"
|
||||||
|
required: false
|
||||||
|
secret-files:
|
||||||
|
description: "List of secret files to expose to the build (e.g., key=filename, MY_SECRET=./secret.txt)"
|
||||||
|
required: false
|
||||||
|
shm-size:
|
||||||
|
description: "Size of /dev/shm (e.g., 2g)"
|
||||||
|
required: false
|
||||||
|
ssh:
|
||||||
|
description: "List of SSH agent socket or keys to expose to the build"
|
||||||
|
required: false
|
||||||
|
tags:
|
||||||
|
description: "List of tags"
|
||||||
|
required: false
|
||||||
|
target:
|
||||||
|
description: "Sets the target stage to build"
|
||||||
|
required: false
|
||||||
|
ulimit:
|
||||||
|
description: "Ulimit options (e.g., nofile=1024:1024)"
|
||||||
|
required: false
|
||||||
|
github-token:
|
||||||
|
description: "GitHub Token used to authenticate against a repository for Git context"
|
||||||
|
default: ${{ github.token }}
|
||||||
|
required: false
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
imageid:
|
||||||
|
description: 'Image ID'
|
||||||
|
digest:
|
||||||
|
description: 'Image digest'
|
||||||
|
metadata:
|
||||||
|
description: 'Build result metadata'
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: 'node20'
|
||||||
|
main: 'dist/index.js'
|
||||||
|
post: 'dist/index.js'
|
3
codecov.yml
Executable file
3
codecov.yml
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
comment: false
|
||||||
|
github_checks:
|
||||||
|
annotations: false
|
69
dev.Dockerfile
Executable file
69
dev.Dockerfile
Executable file
@ -0,0 +1,69 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
ARG NODE_VERSION=20
|
||||||
|
|
||||||
|
FROM node:${NODE_VERSION}-alpine AS base
|
||||||
|
RUN apk add --no-cache cpio findutils git
|
||||||
|
WORKDIR /src
|
||||||
|
|
||||||
|
FROM base AS deps
|
||||||
|
RUN --mount=type=bind,target=.,rw \
|
||||||
|
--mount=type=cache,target=/src/node_modules \
|
||||||
|
yarn install && mkdir /vendor && cp yarn.lock /vendor
|
||||||
|
|
||||||
|
FROM scratch AS vendor-update
|
||||||
|
COPY --from=deps /vendor /
|
||||||
|
|
||||||
|
FROM deps AS vendor-validate
|
||||||
|
RUN --mount=type=bind,target=.,rw <<EOT
|
||||||
|
set -e
|
||||||
|
git add -A
|
||||||
|
cp -rf /vendor/* .
|
||||||
|
if [ -n "$(git status --porcelain -- yarn.lock)" ]; then
|
||||||
|
echo >&2 'ERROR: Vendor result differs. Please vendor your package with "docker buildx bake vendor-update"'
|
||||||
|
git status --porcelain -- yarn.lock
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
EOT
|
||||||
|
|
||||||
|
FROM deps AS build
|
||||||
|
RUN --mount=type=bind,target=.,rw \
|
||||||
|
--mount=type=cache,target=/src/node_modules \
|
||||||
|
yarn run build && mkdir /out && cp -Rf dist /out/
|
||||||
|
|
||||||
|
FROM scratch AS build-update
|
||||||
|
COPY --from=build /out /
|
||||||
|
|
||||||
|
FROM build AS build-validate
|
||||||
|
RUN --mount=type=bind,target=.,rw <<EOT
|
||||||
|
set -e
|
||||||
|
git add -A
|
||||||
|
cp -rf /out/* .
|
||||||
|
if [ -n "$(git status --porcelain -- dist)" ]; then
|
||||||
|
echo >&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"'
|
||||||
|
git status --porcelain -- dist
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
EOT
|
||||||
|
|
||||||
|
FROM deps AS format
|
||||||
|
RUN --mount=type=bind,target=.,rw \
|
||||||
|
--mount=type=cache,target=/src/node_modules \
|
||||||
|
yarn run format \
|
||||||
|
&& mkdir /out && find . -name '*.ts' -not -path './node_modules/*' | cpio -pdm /out
|
||||||
|
|
||||||
|
FROM scratch AS format-update
|
||||||
|
COPY --from=format /out /
|
||||||
|
|
||||||
|
FROM deps AS lint
|
||||||
|
RUN --mount=type=bind,target=.,rw \
|
||||||
|
--mount=type=cache,target=/src/node_modules \
|
||||||
|
yarn run lint
|
||||||
|
|
||||||
|
FROM deps AS test
|
||||||
|
RUN --mount=type=bind,target=.,rw \
|
||||||
|
--mount=type=cache,target=/src/node_modules \
|
||||||
|
yarn run test --coverage --coverageDirectory=/tmp/coverage
|
||||||
|
|
||||||
|
FROM scratch AS test-coverage
|
||||||
|
COPY --from=test /tmp/coverage /
|
36
dist/index.js
generated
vendored
Executable file
36
dist/index.js
generated
vendored
Executable file
File diff suppressed because one or more lines are too long
1
dist/index.js.map
generated
vendored
Executable file
1
dist/index.js.map
generated
vendored
Executable file
File diff suppressed because one or more lines are too long
2009
dist/licenses.txt
generated
vendored
Executable file
2009
dist/licenses.txt
generated
vendored
Executable file
File diff suppressed because it is too large
Load Diff
1
dist/sourcemap-register.js
generated
vendored
Executable file
1
dist/sourcemap-register.js
generated
vendored
Executable file
File diff suppressed because one or more lines are too long
53
docker-bake.hcl
Executable file
53
docker-bake.hcl
Executable file
@ -0,0 +1,53 @@
|
|||||||
|
group "default" {
|
||||||
|
targets = ["build"]
|
||||||
|
}
|
||||||
|
|
||||||
|
group "pre-checkin" {
|
||||||
|
targets = ["vendor-update", "format", "build"]
|
||||||
|
}
|
||||||
|
|
||||||
|
group "validate" {
|
||||||
|
targets = ["lint", "build-validate", "vendor-validate"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "build" {
|
||||||
|
dockerfile = "dev.Dockerfile"
|
||||||
|
target = "build-update"
|
||||||
|
output = ["."]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "build-validate" {
|
||||||
|
dockerfile = "dev.Dockerfile"
|
||||||
|
target = "build-validate"
|
||||||
|
output = ["type=cacheonly"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "format" {
|
||||||
|
dockerfile = "dev.Dockerfile"
|
||||||
|
target = "format-update"
|
||||||
|
output = ["."]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "lint" {
|
||||||
|
dockerfile = "dev.Dockerfile"
|
||||||
|
target = "lint"
|
||||||
|
output = ["type=cacheonly"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "vendor-update" {
|
||||||
|
dockerfile = "dev.Dockerfile"
|
||||||
|
target = "vendor-update"
|
||||||
|
output = ["."]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "vendor-validate" {
|
||||||
|
dockerfile = "dev.Dockerfile"
|
||||||
|
target = "vendor-validate"
|
||||||
|
output = ["type=cacheonly"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "test" {
|
||||||
|
dockerfile = "dev.Dockerfile"
|
||||||
|
target = "test-coverage"
|
||||||
|
output = ["./coverage"]
|
||||||
|
}
|
3
docs/advanced/cache.md
Executable file
3
docs/advanced/cache.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Cache
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/cache/)
|
3
docs/advanced/copy-between-registries.md
Executable file
3
docs/advanced/copy-between-registries.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Copy images between registries
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/copy-image-registries/)
|
3
docs/advanced/dockerhub-desc.md
Executable file
3
docs/advanced/dockerhub-desc.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Update Docker Hub repo description
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/update-dockerhub-desc/)
|
3
docs/advanced/export-docker.md
Executable file
3
docs/advanced/export-docker.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Export image to Docker
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/export-docker/)
|
3
docs/advanced/isolated-builders.md
Executable file
3
docs/advanced/isolated-builders.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Isolated builders
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/configure-builder/#isolated-builders)
|
3
docs/advanced/local-registry.md
Executable file
3
docs/advanced/local-registry.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Local registry
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/local-registry/)
|
3
docs/advanced/multi-platform.md
Executable file
3
docs/advanced/multi-platform.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Multi-platform image
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/multi-platform/)
|
3
docs/advanced/named-contexts.md
Executable file
3
docs/advanced/named-contexts.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Named contexts
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/named-contexts/)
|
3
docs/advanced/push-multi-registries.md
Executable file
3
docs/advanced/push-multi-registries.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Push to multi-registries
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/push-multi-registries/)
|
3
docs/advanced/secrets.md
Executable file
3
docs/advanced/secrets.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Secrets
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/secrets/)
|
3
docs/advanced/share-image-jobs.md
Executable file
3
docs/advanced/share-image-jobs.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Share built image between jobs
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/share-image-jobs/)
|
3
docs/advanced/tags-labels.md
Executable file
3
docs/advanced/tags-labels.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Handle tags and labels
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/manage-tags-labels/)
|
3
docs/advanced/test-before-push.md
Executable file
3
docs/advanced/test-before-push.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# Test your image before pushing it
|
||||||
|
|
||||||
|
This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/test-before-push/)
|
30
jest.config.ts
Executable file
30
jest.config.ts
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
import fs from 'fs';
|
||||||
|
import os from 'os';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-build-push-action-'));
|
||||||
|
|
||||||
|
process.env = Object.assign({}, process.env, {
|
||||||
|
TEMP: tmpDir,
|
||||||
|
GITHUB_REPOSITORY: 'docker/build-push-action',
|
||||||
|
RUNNER_TEMP: path.join(tmpDir, 'runner-temp'),
|
||||||
|
RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache')
|
||||||
|
}) as {
|
||||||
|
[key: string]: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
clearMocks: false,
|
||||||
|
testEnvironment: 'node',
|
||||||
|
moduleFileExtensions: ['js', 'ts'],
|
||||||
|
testMatch: ['**/*.test.ts'],
|
||||||
|
transform: {
|
||||||
|
'^.+\\.ts$': 'ts-jest'
|
||||||
|
},
|
||||||
|
moduleNameMapper: {
|
||||||
|
'^csv-parse/sync': '<rootDir>/node_modules/csv-parse/dist/cjs/sync.cjs'
|
||||||
|
},
|
||||||
|
collectCoverageFrom: ['src/**/{!(main.ts),}.ts'],
|
||||||
|
coveragePathIgnorePatterns: ['lib/', 'node_modules/', '__mocks__/', '__tests__/'],
|
||||||
|
verbose: true
|
||||||
|
};
|
49
package.json
Executable file
49
package.json
Executable file
@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"name": "docker-build-push",
|
||||||
|
"description": "Build and push Docker images",
|
||||||
|
"main": "lib/main.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "ncc build src/main.ts --source-map --minify --license licenses.txt",
|
||||||
|
"lint": "yarn run prettier && yarn run eslint",
|
||||||
|
"format": "yarn run prettier:fix && yarn run eslint:fix",
|
||||||
|
"eslint": "eslint --max-warnings=0 .",
|
||||||
|
"eslint:fix": "eslint --fix .",
|
||||||
|
"prettier": "prettier --check \"./**/*.ts\"",
|
||||||
|
"prettier:fix": "prettier --write \"./**/*.ts\"",
|
||||||
|
"test": "jest",
|
||||||
|
"all": "yarn run build && yarn run format && yarn test"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/docker/build-push-action.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"actions",
|
||||||
|
"docker",
|
||||||
|
"build",
|
||||||
|
"push"
|
||||||
|
],
|
||||||
|
"author": "Docker Inc.",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@actions/core": "^1.10.1",
|
||||||
|
"@docker/actions-toolkit": "^0.12.0",
|
||||||
|
"handlebars": "^4.7.7"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/csv-parse": "^1.2.2",
|
||||||
|
"@types/node": "^20.5.9",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^6.6.0",
|
||||||
|
"@typescript-eslint/parser": "^6.6.0",
|
||||||
|
"@vercel/ncc": "^0.38.0",
|
||||||
|
"eslint": "^8.48.0",
|
||||||
|
"eslint-config-prettier": "^9.0.0",
|
||||||
|
"eslint-plugin-jest": "^27.2.3",
|
||||||
|
"eslint-plugin-prettier": "^5.0.0",
|
||||||
|
"jest": "^29.6.4",
|
||||||
|
"prettier": "^3.0.3",
|
||||||
|
"ts-jest": "^29.1.1",
|
||||||
|
"ts-node": "^10.9.1",
|
||||||
|
"typescript": "^5.2.2"
|
||||||
|
}
|
||||||
|
}
|
216
src/context.ts
Executable file
216
src/context.ts
Executable file
@ -0,0 +1,216 @@
|
|||||||
|
import * as core from '@actions/core';
|
||||||
|
import * as handlebars from 'handlebars';
|
||||||
|
import {Context} from '@docker/actions-toolkit/lib/context';
|
||||||
|
import {GitHub} from '@docker/actions-toolkit/lib/github';
|
||||||
|
import {Inputs as BuildxInputs} from '@docker/actions-toolkit/lib/buildx/inputs';
|
||||||
|
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit';
|
||||||
|
import {Util} from '@docker/actions-toolkit/lib/util';
|
||||||
|
|
||||||
|
export interface Inputs {
|
||||||
|
addHosts: string[];
|
||||||
|
allow: string[];
|
||||||
|
attests: string[];
|
||||||
|
buildArgs: string[];
|
||||||
|
buildContexts: string[];
|
||||||
|
builder: string;
|
||||||
|
cacheFrom: string[];
|
||||||
|
cacheTo: string[];
|
||||||
|
cgroupParent: string;
|
||||||
|
context: string;
|
||||||
|
file: string;
|
||||||
|
labels: string[];
|
||||||
|
load: boolean;
|
||||||
|
network: string;
|
||||||
|
noCache: boolean;
|
||||||
|
noCacheFilters: string[];
|
||||||
|
outputs: string[];
|
||||||
|
platforms: string[];
|
||||||
|
provenance: string;
|
||||||
|
pull: boolean;
|
||||||
|
push: boolean;
|
||||||
|
sbom: string;
|
||||||
|
secrets: string[];
|
||||||
|
secretFiles: string[];
|
||||||
|
shmSize: string;
|
||||||
|
ssh: string[];
|
||||||
|
tags: string[];
|
||||||
|
target: string;
|
||||||
|
ulimit: string[];
|
||||||
|
githubToken: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getInputs(): Promise<Inputs> {
|
||||||
|
return {
|
||||||
|
addHosts: Util.getInputList('add-hosts'),
|
||||||
|
allow: Util.getInputList('allow'),
|
||||||
|
attests: Util.getInputList('attests', {ignoreComma: true}),
|
||||||
|
buildArgs: Util.getInputList('build-args', {ignoreComma: true}),
|
||||||
|
buildContexts: Util.getInputList('build-contexts', {ignoreComma: true}),
|
||||||
|
builder: core.getInput('builder'),
|
||||||
|
cacheFrom: Util.getInputList('cache-from', {ignoreComma: true}),
|
||||||
|
cacheTo: Util.getInputList('cache-to', {ignoreComma: true}),
|
||||||
|
cgroupParent: core.getInput('cgroup-parent'),
|
||||||
|
context: core.getInput('context') || Context.gitContext(),
|
||||||
|
file: core.getInput('file'),
|
||||||
|
labels: Util.getInputList('labels', {ignoreComma: true}),
|
||||||
|
load: core.getBooleanInput('load'),
|
||||||
|
network: core.getInput('network'),
|
||||||
|
noCache: core.getBooleanInput('no-cache'),
|
||||||
|
noCacheFilters: Util.getInputList('no-cache-filters'),
|
||||||
|
outputs: Util.getInputList('outputs', {ignoreComma: true}),
|
||||||
|
platforms: Util.getInputList('platforms'),
|
||||||
|
provenance: BuildxInputs.getProvenanceInput('provenance'),
|
||||||
|
pull: core.getBooleanInput('pull'),
|
||||||
|
push: core.getBooleanInput('push'),
|
||||||
|
sbom: core.getInput('sbom'),
|
||||||
|
secrets: Util.getInputList('secrets', {ignoreComma: true}),
|
||||||
|
secretFiles: Util.getInputList('secret-files', {ignoreComma: true}),
|
||||||
|
shmSize: core.getInput('shm-size'),
|
||||||
|
ssh: Util.getInputList('ssh'),
|
||||||
|
tags: Util.getInputList('tags'),
|
||||||
|
target: core.getInput('target'),
|
||||||
|
ulimit: Util.getInputList('ulimit', {ignoreComma: true}),
|
||||||
|
githubToken: core.getInput('github-token')
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getArgs(inputs: Inputs, toolkit: Toolkit): Promise<Array<string>> {
|
||||||
|
const context = handlebars.compile(inputs.context)({
|
||||||
|
defaultContext: Context.gitContext()
|
||||||
|
});
|
||||||
|
// prettier-ignore
|
||||||
|
return [
|
||||||
|
...await getBuildArgs(inputs, context, toolkit),
|
||||||
|
...await getCommonArgs(inputs, toolkit),
|
||||||
|
context
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getBuildArgs(inputs: Inputs, context: string, toolkit: Toolkit): Promise<Array<string>> {
|
||||||
|
const args: Array<string> = ['build'];
|
||||||
|
await Util.asyncForEach(inputs.addHosts, async addHost => {
|
||||||
|
args.push('--add-host', addHost);
|
||||||
|
});
|
||||||
|
if (inputs.allow.length > 0) {
|
||||||
|
args.push('--allow', inputs.allow.join(','));
|
||||||
|
}
|
||||||
|
if (await toolkit.buildx.versionSatisfies('>=0.10.0')) {
|
||||||
|
await Util.asyncForEach(inputs.attests, async attest => {
|
||||||
|
args.push('--attest', attest);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
await Util.asyncForEach(inputs.buildArgs, async buildArg => {
|
||||||
|
args.push('--build-arg', buildArg);
|
||||||
|
});
|
||||||
|
if (await toolkit.buildx.versionSatisfies('>=0.8.0')) {
|
||||||
|
await Util.asyncForEach(inputs.buildContexts, async buildContext => {
|
||||||
|
args.push('--build-context', buildContext);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
await Util.asyncForEach(inputs.cacheFrom, async cacheFrom => {
|
||||||
|
args.push('--cache-from', cacheFrom);
|
||||||
|
});
|
||||||
|
await Util.asyncForEach(inputs.cacheTo, async cacheTo => {
|
||||||
|
args.push('--cache-to', cacheTo);
|
||||||
|
});
|
||||||
|
if (inputs.cgroupParent) {
|
||||||
|
args.push('--cgroup-parent', inputs.cgroupParent);
|
||||||
|
}
|
||||||
|
if (inputs.file) {
|
||||||
|
args.push('--file', inputs.file);
|
||||||
|
}
|
||||||
|
if (!BuildxInputs.hasLocalExporter(inputs.outputs) && !BuildxInputs.hasTarExporter(inputs.outputs) && (inputs.platforms.length == 0 || (await toolkit.buildx.versionSatisfies('>=0.4.2')))) {
|
||||||
|
args.push('--iidfile', BuildxInputs.getBuildImageIDFilePath());
|
||||||
|
}
|
||||||
|
await Util.asyncForEach(inputs.labels, async label => {
|
||||||
|
args.push('--label', label);
|
||||||
|
});
|
||||||
|
await Util.asyncForEach(inputs.noCacheFilters, async noCacheFilter => {
|
||||||
|
args.push('--no-cache-filter', noCacheFilter);
|
||||||
|
});
|
||||||
|
await Util.asyncForEach(inputs.outputs, async output => {
|
||||||
|
args.push('--output', output);
|
||||||
|
});
|
||||||
|
if (inputs.platforms.length > 0) {
|
||||||
|
args.push('--platform', inputs.platforms.join(','));
|
||||||
|
}
|
||||||
|
if (await toolkit.buildx.versionSatisfies('>=0.10.0')) {
|
||||||
|
if (inputs.provenance) {
|
||||||
|
args.push('--provenance', inputs.provenance);
|
||||||
|
} else if ((await toolkit.buildkit.versionSatisfies(inputs.builder, '>=0.11.0')) && !BuildxInputs.hasDockerExporter(inputs.outputs, inputs.load)) {
|
||||||
|
// if provenance not specified and BuildKit version compatible for
|
||||||
|
// attestation, set default provenance. Also needs to make sure user
|
||||||
|
// doesn't want to explicitly load the image to docker.
|
||||||
|
if (GitHub.context.payload.repository?.private ?? false) {
|
||||||
|
// if this is a private repository, we set the default provenance
|
||||||
|
// attributes being set in buildx: https://github.com/docker/buildx/blob/fb27e3f919dcbf614d7126b10c2bc2d0b1927eb6/build/build.go#L603
|
||||||
|
args.push('--provenance', BuildxInputs.resolveProvenanceAttrs(`mode=min,inline-only=true`));
|
||||||
|
} else {
|
||||||
|
// for a public repository, we set max provenance mode.
|
||||||
|
args.push('--provenance', BuildxInputs.resolveProvenanceAttrs(`mode=max`));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (inputs.sbom) {
|
||||||
|
args.push('--sbom', inputs.sbom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await Util.asyncForEach(inputs.secrets, async secret => {
|
||||||
|
try {
|
||||||
|
args.push('--secret', BuildxInputs.resolveBuildSecretString(secret));
|
||||||
|
} catch (err) {
|
||||||
|
core.warning(err.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
await Util.asyncForEach(inputs.secretFiles, async secretFile => {
|
||||||
|
try {
|
||||||
|
args.push('--secret', BuildxInputs.resolveBuildSecretFile(secretFile));
|
||||||
|
} catch (err) {
|
||||||
|
core.warning(err.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (inputs.githubToken && !BuildxInputs.hasGitAuthTokenSecret(inputs.secrets) && context.startsWith(Context.gitContext())) {
|
||||||
|
args.push('--secret', BuildxInputs.resolveBuildSecretString(`GIT_AUTH_TOKEN=${inputs.githubToken}`));
|
||||||
|
}
|
||||||
|
if (inputs.shmSize) {
|
||||||
|
args.push('--shm-size', inputs.shmSize);
|
||||||
|
}
|
||||||
|
await Util.asyncForEach(inputs.ssh, async ssh => {
|
||||||
|
args.push('--ssh', ssh);
|
||||||
|
});
|
||||||
|
await Util.asyncForEach(inputs.tags, async tag => {
|
||||||
|
args.push('--tag', tag);
|
||||||
|
});
|
||||||
|
if (inputs.target) {
|
||||||
|
args.push('--target', inputs.target);
|
||||||
|
}
|
||||||
|
await Util.asyncForEach(inputs.ulimit, async ulimit => {
|
||||||
|
args.push('--ulimit', ulimit);
|
||||||
|
});
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getCommonArgs(inputs: Inputs, toolkit: Toolkit): Promise<Array<string>> {
|
||||||
|
const args: Array<string> = [];
|
||||||
|
if (inputs.builder) {
|
||||||
|
args.push('--builder', inputs.builder);
|
||||||
|
}
|
||||||
|
if (inputs.load) {
|
||||||
|
args.push('--load');
|
||||||
|
}
|
||||||
|
if (await toolkit.buildx.versionSatisfies('>=0.6.0')) {
|
||||||
|
args.push('--metadata-file', BuildxInputs.getBuildMetadataFilePath());
|
||||||
|
}
|
||||||
|
if (inputs.network) {
|
||||||
|
args.push('--network', inputs.network);
|
||||||
|
}
|
||||||
|
if (inputs.noCache) {
|
||||||
|
args.push('--no-cache');
|
||||||
|
}
|
||||||
|
if (inputs.pull) {
|
||||||
|
args.push('--pull');
|
||||||
|
}
|
||||||
|
if (inputs.push) {
|
||||||
|
args.push('--push');
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
}
|
116
src/main.ts
Executable file
116
src/main.ts
Executable file
@ -0,0 +1,116 @@
|
|||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as stateHelper from './state-helper';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import * as actionsToolkit from '@docker/actions-toolkit';
|
||||||
|
import {Context} from '@docker/actions-toolkit/lib/context';
|
||||||
|
import {Docker} from '@docker/actions-toolkit/lib/docker/docker';
|
||||||
|
import {Exec} from '@docker/actions-toolkit/lib/exec';
|
||||||
|
import {GitHub} from '@docker/actions-toolkit/lib/github';
|
||||||
|
import {Inputs as BuildxInputs} from '@docker/actions-toolkit/lib/buildx/inputs';
|
||||||
|
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit';
|
||||||
|
import {ConfigFile} from '@docker/actions-toolkit/lib/types/docker';
|
||||||
|
|
||||||
|
import * as context from './context';
|
||||||
|
|
||||||
|
actionsToolkit.run(
|
||||||
|
// main
|
||||||
|
async () => {
|
||||||
|
const inputs: context.Inputs = await context.getInputs();
|
||||||
|
const toolkit = new Toolkit();
|
||||||
|
|
||||||
|
await core.group(`GitHub Actions runtime token ACs`, async () => {
|
||||||
|
try {
|
||||||
|
await GitHub.printActionsRuntimeTokenACs();
|
||||||
|
} catch (e) {
|
||||||
|
core.warning(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await core.group(`Docker info`, async () => {
|
||||||
|
try {
|
||||||
|
await Docker.printVersion();
|
||||||
|
await Docker.printInfo();
|
||||||
|
} catch (e) {
|
||||||
|
core.info(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await core.group(`Proxy configuration`, async () => {
|
||||||
|
let dockerConfig: ConfigFile | undefined;
|
||||||
|
let dockerConfigMalformed = false;
|
||||||
|
try {
|
||||||
|
dockerConfig = await Docker.configFile();
|
||||||
|
} catch (e) {
|
||||||
|
dockerConfigMalformed = true;
|
||||||
|
core.warning(`Unable to parse config file ${path.join(Docker.configDir, 'config.json')}: ${e}`);
|
||||||
|
}
|
||||||
|
if (dockerConfig && dockerConfig.proxies) {
|
||||||
|
for (const host in dockerConfig.proxies) {
|
||||||
|
let prefix = '';
|
||||||
|
if (Object.keys(dockerConfig.proxies).length > 1) {
|
||||||
|
prefix = ' ';
|
||||||
|
core.info(host);
|
||||||
|
}
|
||||||
|
for (const key in dockerConfig.proxies[host]) {
|
||||||
|
core.info(`${prefix}${key}: ${dockerConfig.proxies[host][key]}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (!dockerConfigMalformed) {
|
||||||
|
core.info('No proxy configuration found');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!(await toolkit.buildx.isAvailable())) {
|
||||||
|
core.setFailed(`Docker buildx is required. See https://github.com/docker/setup-buildx-action to set up buildx.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stateHelper.setTmpDir(Context.tmpDir());
|
||||||
|
|
||||||
|
await core.group(`Buildx version`, async () => {
|
||||||
|
await toolkit.buildx.printVersion();
|
||||||
|
});
|
||||||
|
|
||||||
|
const args: string[] = await context.getArgs(inputs, toolkit);
|
||||||
|
const buildCmd = await toolkit.buildx.getCommand(args);
|
||||||
|
await Exec.getExecOutput(buildCmd.command, buildCmd.args, {
|
||||||
|
ignoreReturnCode: true
|
||||||
|
}).then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
throw new Error(`buildx failed with: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const imageID = BuildxInputs.resolveBuildImageID();
|
||||||
|
const metadata = BuildxInputs.resolveBuildMetadata();
|
||||||
|
const digest = BuildxInputs.resolveDigest();
|
||||||
|
|
||||||
|
if (imageID) {
|
||||||
|
await core.group(`ImageID`, async () => {
|
||||||
|
core.info(imageID);
|
||||||
|
core.setOutput('imageid', imageID);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (digest) {
|
||||||
|
await core.group(`Digest`, async () => {
|
||||||
|
core.info(digest);
|
||||||
|
core.setOutput('digest', digest);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (metadata) {
|
||||||
|
await core.group(`Metadata`, async () => {
|
||||||
|
core.info(metadata);
|
||||||
|
core.setOutput('metadata', metadata);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// post
|
||||||
|
async () => {
|
||||||
|
if (stateHelper.tmpDir.length > 0) {
|
||||||
|
await core.group(`Removing temp folder ${stateHelper.tmpDir}`, async () => {
|
||||||
|
fs.rmSync(stateHelper.tmpDir, {recursive: true});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
7
src/state-helper.ts
Executable file
7
src/state-helper.ts
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
import * as core from '@actions/core';
|
||||||
|
|
||||||
|
export const tmpDir = process.env['STATE_tmpDir'] || '';
|
||||||
|
|
||||||
|
export function setTmpDir(tmpDir: string) {
|
||||||
|
core.saveState('tmpDir', tmpDir);
|
||||||
|
}
|
3
test/Dockerfile
Executable file
3
test/Dockerfile
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM alpine
|
||||||
|
RUN echo "Hello world!"
|
3
test/addhost.Dockerfile
Executable file
3
test/addhost.Dockerfile
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM busybox
|
||||||
|
RUN cat /etc/hosts
|
3
test/cgroup.Dockerfile
Executable file
3
test/cgroup.Dockerfile
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM alpine
|
||||||
|
RUN cat /proc/self/cgroup
|
19
test/go/Dockerfile
Executable file
19
test/go/Dockerfile
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
FROM golang:alpine AS base
|
||||||
|
ENV CGO_ENABLED=0
|
||||||
|
RUN apk add --no-cache file git
|
||||||
|
WORKDIR /src
|
||||||
|
|
||||||
|
FROM base AS build
|
||||||
|
RUN --mount=type=bind,target=/src \
|
||||||
|
--mount=type=cache,target=/root/.cache/go-build \
|
||||||
|
go build -ldflags "-s -w" -o /usr/bin/app .
|
||||||
|
|
||||||
|
FROM scratch AS binary
|
||||||
|
COPY --from=build /usr/bin/app /bin/app
|
||||||
|
|
||||||
|
FROM alpine AS image
|
||||||
|
COPY --from=build /usr/bin/app /bin/app
|
||||||
|
EXPOSE 8080
|
||||||
|
ENTRYPOINT ["/bin/app"]
|
3
test/go/go.mod
Executable file
3
test/go/go.mod
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
module github.com/docker/build-push-action/test/go
|
||||||
|
|
||||||
|
go 1.18
|
14
test/go/main.go
Executable file
14
test/go/main.go
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintf(w, "Hello, Go!")
|
||||||
|
})
|
||||||
|
log.Fatal(http.ListenAndServe(":8080", nil))
|
||||||
|
}
|
20
test/multi-sudo.Dockerfile
Executable file
20
test/multi-sudo.Dockerfile
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM --platform=$BUILDPLATFORM golang:alpine AS build
|
||||||
|
ARG TARGETPLATFORM
|
||||||
|
ARG BUILDPLATFORM
|
||||||
|
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log
|
||||||
|
RUN apk --update --no-cache add \
|
||||||
|
shadow \
|
||||||
|
sudo \
|
||||||
|
&& addgroup -g 1200 buildx \
|
||||||
|
&& adduser -u 1200 -G buildx -s /sbin/nologin -D buildx \
|
||||||
|
&& echo 'buildx ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \
|
||||||
|
&& rm -rf /tmp/* /var/cache/apk/*
|
||||||
|
|
||||||
|
USER buildx
|
||||||
|
RUN sudo chown buildx. /log
|
||||||
|
USER root
|
||||||
|
|
||||||
|
FROM alpine
|
||||||
|
COPY --from=build /log /log
|
||||||
|
RUN ls -al /log
|
9
test/multi.Dockerfile
Executable file
9
test/multi.Dockerfile
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM --platform=$BUILDPLATFORM golang:alpine AS build
|
||||||
|
|
||||||
|
ARG TARGETPLATFORM
|
||||||
|
ARG BUILDPLATFORM
|
||||||
|
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log
|
||||||
|
|
||||||
|
FROM alpine
|
||||||
|
COPY --from=build /log /log
|
4
test/named-context-base.Dockerfile
Executable file
4
test/named-context-base.Dockerfile
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
FROM debian
|
||||||
|
RUN echo "Hello debian!"
|
4
test/named-context.Dockerfile
Executable file
4
test/named-context.Dockerfile
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
FROM alpine
|
||||||
|
RUN cat /etc/*release
|
9
test/nocachefilter.Dockerfile
Executable file
9
test/nocachefilter.Dockerfile
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM busybox AS base
|
||||||
|
RUN echo "Hello world!" > /hello
|
||||||
|
|
||||||
|
FROM alpine AS build
|
||||||
|
COPY --from=base /hello /hello
|
||||||
|
RUN uname -a
|
||||||
|
|
||||||
|
FROM build
|
9
test/proxy.Dockerfile
Executable file
9
test/proxy.Dockerfile
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM alpine
|
||||||
|
RUN apk add --no-cache curl net-tools
|
||||||
|
ARG HTTP_PROXY
|
||||||
|
ARG HTTPS_PROXY
|
||||||
|
RUN printenv HTTP_PROXY
|
||||||
|
RUN printenv HTTPS_PROXY
|
||||||
|
RUN netstat -aptn
|
||||||
|
RUN curl --retry 5 --retry-all-errors --retry-delay 0 --connect-timeout 5 --proxy $HTTP_PROXY -v --insecure --head https://www.google.com
|
4
test/secret.Dockerfile
Executable file
4
test/secret.Dockerfile
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM busybox
|
||||||
|
RUN --mount=type=secret,id=MYSECRET \
|
||||||
|
echo "MYSECRET=$(cat /run/secrets/MYSECRET)"
|
3
test/shmsize.Dockerfile
Executable file
3
test/shmsize.Dockerfile
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM busybox
|
||||||
|
RUN mount | grep /dev/shm
|
3
test/ulimit.Dockerfile
Executable file
3
test/ulimit.Dockerfile
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM busybox
|
||||||
|
RUN ulimit -a
|
22
tsconfig.json
Executable file
22
tsconfig.json
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"target": "es6",
|
||||||
|
"module": "commonjs",
|
||||||
|
"strict": true,
|
||||||
|
"newLine": "lf",
|
||||||
|
"outDir": "./lib",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"useUnknownInCatchVariables": false,
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"./__mocks__/**/*",
|
||||||
|
"./__tests__/**/*",
|
||||||
|
"./lib/**/*",
|
||||||
|
"node_modules",
|
||||||
|
"jest.config.ts"
|
||||||
|
]
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user