# syntax=docker/dockerfile:1

# ============================================================================
# 用途：建置「Calculate Next Version」Gitea/GitHub Docker action 的執行映像；
#       採兩階段建置（build 整理產物、runtime 以 slim 基底縮小映像），
#       runtime 額外安裝 git 供主程式讀取 repo tag，最終以 entrypoint.sh 啟動 node 主程式。
# 更新時間：2026/07/16 09:16:51
# ============================================================================

# 1. 參數處理：node 版本以 ARG 注入（預設最新版；--node-version 可覆寫）
# 置於第一個 FROM 之前的全域 ARG，兩個 FROM 皆可引用；
# NODE_VERSION 決定 build 階段基底、NODE_RUNTIME 決定 runtime 階段基底。
# 需人工確認：latest / slim 皆為浮動 tag，未鎖定版本，重建結果可能隨上游更新而改變（不可重現建置）。
ARG NODE_VERSION=latest

# runtime 基底 tag（slim 變體，體積較小）；同屬全域 ARG，供第二個 FROM 引用。
ARG NODE_RUNTIME=slim

# ---- build 階段：整理產物 ----
# 以完整版 node 映像作為 build 階段基底，僅用來集中整理 action 產物，
# 不會進入最終映像，因此體積不影響結果。
FROM node:${NODE_VERSION} AS build

# 設定工作目錄為 /action，後續 COPY/RUN 皆以此為基準路徑。
WORKDIR /action

# 2. 安裝套件：無外部相依，僅使用 node 內建模組，故無 npm install

# 3. 複製檔案：帶入主程式與入口
# 複製 src/（index.js / logger.js / version.js 等主程式模組）到 /action/src/。
COPY src/ /action/src/

# 複製容器入口腳本，負責輸出啟動訊息並以 exec 啟動 node 主程式。
COPY entrypoint.sh /action/entrypoint.sh

# 4. 執行程序：賦予 entrypoint 執行權限
# 確保 entrypoint.sh 可被容器直接執行（避免來源檔案系統權限遺失時 ENTRYPOINT 失敗）。
RUN chmod +x /action/entrypoint.sh

# 5. 縮小映像檔：runtime 改用 slim 基底，只帶必要產物；主程式需呼叫 git 讀 tag
# 第二階段為最終映像，捨棄 build 階段中不必要的內容以縮小體積。
FROM node:${NODE_RUNTIME} AS runtime

# 安裝 git（slim 基底未內建），主程式需以 git 指令讀取 repo 的 tag 計算版號；
# --no-install-recommends 避免拉入非必要套件，安裝後清除 apt 快取以縮小 layer。
RUN apt-get update \
    && apt-get install -y --no-install-recommends git \
    && rm -rf /var/lib/apt/lists/*

# 設定最終映像的工作目錄為 /action。
WORKDIR /action

# 自 build 階段複製整理好的產物（src/ 與 entrypoint.sh）到最終映像。
COPY --from=build /action /action

# 6. 設定入口：以 entrypoint.sh 啟動 node 主程式
# 使用 exec 形式的 ENTRYPOINT；entrypoint.sh 內以 exec node 取代 shell，
# 正確傳遞訊號與 exit code；與 action.yml 的 entrypoint 設定一致。
ENTRYPOINT ["/action/entrypoint.sh"]
