105 lines
3.6 KiB
YAML
105 lines
3.6 KiB
YAML
# 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 推送成功"
|
||
'
|