Files
magic-docker/action.yml
T

105 lines
3.6 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# action.yml
name: "magic docker build and push"
description: "一键构建并推送 Docker 镜像:支持自定义 context / dockerfile,或使用内置 preset(vue3、vue3-hash、dotnet10)"
inputs:
registry:
description: "Docker registry URL"
required: true
default: "${{ vars.DOCKER_REGISTRY }}"
user:
description: "Docker registry username"
required: true
default: "${{ vars.DOCKER_USER }}"
pass:
description: "Docker registry password"
required: true
default: "${{ vars.DOCKER_PASS }}"
image:
description: "Docker image name,不含 registry(最终会拼成 <registry>/<image>:<tag>)"
required: true
default: "${{ github.repository }}"
tag:
description: "Docker image tag (default: github.ref_name)"
required: false
default: "${{ github.ref_name }}"
platform:
description: "Build platform (default: linux/amd64)"
required: false
default: "linux/amd64"
context:
description: "构建目录,相对仓库根目录(默认 .)"
required: false
default: "."
dockerfile:
description: "Dockerfile 的完整路径,相对仓库根目录或绝对路径。设置后忽略 preset(默认留空)"
required: false
default: ""
preset:
description: "内置方案:vue3 / vue3-hash / dotnet10。未设置 dockerfile 时生效(默认留空)"
required: false
default: ""
runs:
using: "composite"
steps:
# 编译、nginx 配置都在 preset 的 Dockerfile 里(多阶段构建)
# 优先级:dockerfile > preset > context 下的默认 Dockerfile
- name: build docker image and push
uses: docker://docker:git
env:
DOCKER_BUILDKIT: 1
REGISTRY: ${{ inputs.registry }}
REG_USER: ${{ inputs.user }}
REG_PASS: ${{ inputs.pass }}
IMAGE: ${{ inputs.image }}
TAG: ${{ inputs.tag }}
PLATFORM: ${{ inputs.platform }}
CONTEXT_DIR: ${{ inputs.context }}
DOCKERFILE: ${{ inputs.dockerfile }}
PRESET: ${{ inputs.preset }}
ACTION_PATH: ${{ github.action_path }}
with:
entrypoint: "/bin/sh"
args: |
-c '
set -e
image="$REGISTRY/$IMAGE:$TAG"
dockerfile_path="${DOCKERFILE:-}"
preset="${PRESET:-}"
build_args=""
if [ -n "$dockerfile_path" ]; then
if [ -n "$preset" ]; then
echo "已指定 dockerfile($dockerfile_path),忽略 preset($preset)"
fi
elif [ -n "$preset" ]; then
dockerfile_path="$ACTION_PATH/$preset.Dockerfile"
if [ ! -f "$dockerfile_path" ]; then
echo "未知 preset:$preset(可选:vue3 / vue3-hash / dotnet10)"
exit 1
fi
# preset 的 Dockerfile 用 VERSION 覆盖 package.json 版本 / dotnet Version
build_args="VERSION=$TAG"
echo "使用 preset:$preset"
else
dockerfile_path="$CONTEXT_DIR/Dockerfile"
fi
echo "构建目录:$CONTEXT_DIR"
echo "Dockerfile:$dockerfile_path"
echo "镜像:$image"
set -- --platform "$PLATFORM" -t "$image" -f "$dockerfile_path"
if [ -n "$build_args" ]; then
set -- --build-arg "$build_args" "$@"
fi
docker ps && docker info && \
docker build "$@" "$CONTEXT_DIR" && \
echo "$image 已经构建完了" && \
docker login "$REGISTRY" -u "$REG_USER" -p "$REG_PASS" && \
docker push "$image" && \
echo "$image 推送成功"
'