mirror of
https://github.com/elgohr/Publish-Docker-Github-Action.git
synced 2026-03-12 18:07:12 -04:00
✨ Support building multi-platform images
This commit is contained in:
@@ -4,7 +4,7 @@ LABEL "maintainer"="Lars Gohr"
|
|||||||
|
|
||||||
RUN apk update \
|
RUN apk update \
|
||||||
&& apk upgrade \
|
&& apk upgrade \
|
||||||
&& apk add --no-cache git
|
&& apk add --no-cache git sudo
|
||||||
|
|
||||||
ADD entrypoint.sh /entrypoint.sh
|
ADD entrypoint.sh /entrypoint.sh
|
||||||
ENTRYPOINT ["/entrypoint.sh"]
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
@@ -14,6 +14,7 @@ RUN apk add --no-cache coreutils bats
|
|||||||
ADD test.bats /test.bats
|
ADD test.bats /test.bats
|
||||||
ADD mock.sh /usr/local/bin/docker
|
ADD mock.sh /usr/local/bin/docker
|
||||||
ADD mock.sh /usr/bin/date
|
ADD mock.sh /usr/bin/date
|
||||||
|
ADD mock.sh /usr/bin/sudo
|
||||||
RUN /test.bats
|
RUN /test.bats
|
||||||
|
|
||||||
FROM runtime
|
FROM runtime
|
||||||
|
|||||||
11
README.md
11
README.md
@@ -188,6 +188,17 @@ with:
|
|||||||
no_push: ${{ github.event_name == 'push' }}
|
no_push: ${{ github.event_name == 'push' }}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### platforms
|
||||||
|
Use `platforms` when you want to build a multi-platform image (separated by comma).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
with:
|
||||||
|
name: myDocker/repository
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
```
|
||||||
|
|
||||||
### Tags
|
### Tags
|
||||||
|
|
||||||
This action supports multiple options that tags are handled.
|
This action supports multiple options that tags are handled.
|
||||||
|
|||||||
@@ -44,6 +44,9 @@ inputs:
|
|||||||
tags:
|
tags:
|
||||||
description: 'Use tags when you want to bring your own tags (separated by comma)'
|
description: 'Use tags when you want to bring your own tags (separated by comma)'
|
||||||
required: false
|
required: false
|
||||||
|
platforms:
|
||||||
|
description: 'Use platforms to build multi-platform images (separated by comma)'
|
||||||
|
required: false
|
||||||
tag_names:
|
tag_names:
|
||||||
description: 'Use tag_names when you want to push tags/release by their git name'
|
description: 'Use tag_names when you want to push tags/release by their git name'
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ main() {
|
|||||||
sanitize "${INPUT_PASSWORD}" "password"
|
sanitize "${INPUT_PASSWORD}" "password"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if uses "${INPUT_PLATFORMS}"; then
|
||||||
|
enableExperimentalDocker
|
||||||
|
fi
|
||||||
|
|
||||||
registryToLower
|
registryToLower
|
||||||
nameToLower
|
nameToLower
|
||||||
|
|
||||||
@@ -84,6 +88,11 @@ sanitize() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enableExperimentalDocker() {
|
||||||
|
echo $'{"experimental": true}' | sudo dd status=none of=/etc/docker/daemon.json
|
||||||
|
sudo service docker restart
|
||||||
|
}
|
||||||
|
|
||||||
registryToLower(){
|
registryToLower(){
|
||||||
INPUT_REGISTRY=$(echo "${INPUT_REGISTRY}" | tr '[A-Z]' '[a-z]')
|
INPUT_REGISTRY=$(echo "${INPUT_REGISTRY}" | tr '[A-Z]' '[a-z]')
|
||||||
}
|
}
|
||||||
@@ -190,7 +199,12 @@ build() {
|
|||||||
for TAG in ${TAGS}; do
|
for TAG in ${TAGS}; do
|
||||||
BUILD_TAGS="${BUILD_TAGS}-t ${INPUT_NAME}:${TAG} "
|
BUILD_TAGS="${BUILD_TAGS}-t ${INPUT_NAME}:${TAG} "
|
||||||
done
|
done
|
||||||
docker build ${INPUT_BUILDOPTIONS} ${BUILDPARAMS} ${BUILD_TAGS} ${CONTEXT}
|
if uses "${INPUT_PLATFORMS}"; then
|
||||||
|
local PLATFORMS="--platform ${INPUT_PLATFORMS}"
|
||||||
|
docker buildx build ${PLATFORMS} ${INPUT_BUILDOPTIONS} ${BUILDPARAMS} ${BUILD_TAGS} ${CONTEXT}
|
||||||
|
else
|
||||||
|
docker build ${INPUT_BUILDOPTIONS} ${BUILDPARAMS} ${BUILD_TAGS} ${CONTEXT}
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
push() {
|
push() {
|
||||||
|
|||||||
20
test.bats
20
test.bats
@@ -6,6 +6,7 @@ setup(){
|
|||||||
|
|
||||||
declare -A -p MOCK_RETURNS=(
|
declare -A -p MOCK_RETURNS=(
|
||||||
['/usr/local/bin/docker']=""
|
['/usr/local/bin/docker']=""
|
||||||
|
['sudo']=""
|
||||||
) > mockReturns
|
) > mockReturns
|
||||||
|
|
||||||
export GITHUB_REF='refs/heads/master'
|
export GITHUB_REF='refs/heads/master'
|
||||||
@@ -20,6 +21,7 @@ teardown() {
|
|||||||
unset INPUT_DOCKERFILE
|
unset INPUT_DOCKERFILE
|
||||||
unset INPUT_REGISTRY
|
unset INPUT_REGISTRY
|
||||||
unset INPUT_CACHE
|
unset INPUT_CACHE
|
||||||
|
unset INPUT_PLATFORMS
|
||||||
unset GITHUB_SHA
|
unset GITHUB_SHA
|
||||||
unset INPUT_PULL_REQUESTS
|
unset INPUT_PULL_REQUESTS
|
||||||
unset MOCK_ERROR_CONDITION
|
unset MOCK_ERROR_CONDITION
|
||||||
@@ -654,6 +656,24 @@ teardown() {
|
|||||||
/usr/local/bin/docker logout"
|
/usr/local/bin/docker logout"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "it supports building multiple platforms" {
|
||||||
|
export GITHUB_REF='refs/heads/main'
|
||||||
|
export INPUT_PLATFORMS='linux/amd64,linux/arm64'
|
||||||
|
|
||||||
|
run /entrypoint.sh
|
||||||
|
|
||||||
|
expectStdOutContains "::set-output name=tag::latest"
|
||||||
|
|
||||||
|
expectMockCalledContains "/usr/bin/sudo dd status=none of=/etc/docker/daemon.json
|
||||||
|
/usr/bin/sudo service docker restart
|
||||||
|
/usr/local/bin/docker login -u USERNAME --password-stdin
|
||||||
|
/usr/local/bin/docker buildx build --platform linux/amd64,linux/arm64 -t my/repository:latest .
|
||||||
|
/usr/local/bin/docker push my/repository:latest
|
||||||
|
/usr/local/bin/docker inspect --format={{index .RepoDigests 0}} my/repository:latest
|
||||||
|
/usr/local/bin/docker logout"
|
||||||
|
expectMockArgs '/usr/bin/sudo {"experimental": true}'
|
||||||
|
}
|
||||||
|
|
||||||
expectStdOutIs() {
|
expectStdOutIs() {
|
||||||
local expected=$(echo "${1}" | tr -d '\n')
|
local expected=$(echo "${1}" | tr -d '\n')
|
||||||
local got=$(echo "${output}" | tr -d '\n')
|
local got=$(echo "${output}" | tr -d '\n')
|
||||||
|
|||||||
Reference in New Issue
Block a user