17 Commits
Author SHA1 Message Date
admin 7fd4eda55c Merge pull request '上線 codex CLI 映像專案並改為單階段 Dockerfile 建置' (#17) from develop into master
CD / Docker Build & Push (push) Successful in 1m14s
CD / Release Tag Version (push) Successful in 3s
Reviewed-on: #17
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-07-01 02:06:31 +00:00
Jeffery 4e481884f8 refactor(Dockerfile): 改為單階段建置並移除映像與套件版本 ARG 2026-07-01 10:04:47 +08:00
admin b6180f765a Merge pull request '重整 Dockerfile 為多階段六步流程並補齊專案文件' (#16) from develop into master
CD / Release Tag Version (push) Successful in 5s
CD / Docker Build & Push (push) Successful in 1m12s
Reviewed-on: #16
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 04:33:51 +00:00
admin 5a4459fb00 Merge pull request '重整 Dockerfile 為多階段六步流程並補齊專案文件' (#14) from ai-review-resolve/develop-20260630-121235 into develop
Reviewed-on: #14
2026-06-30 04:33:04 +00:00
Jeffery 7224e6dbcf docs(README 與 Dockerfile): 同步 CI 說明並更新 Dockerfile 註解日期 2026-06-30 12:31:18 +08:00
Jeffery 5383c6884d chore(CD workflow): 改用 Actions secrets 與 vars 注入倉庫認證 2026-06-30 12:31:18 +08:00
admin 53b5739e06 Merge pull request 'Release Tag Version 加上編號' (#13) from develop into master
CD / Release Tag Version (push) Successful in 11s
CD / Docker Build & Push (push) Successful in 2m12s
Reviewed-on: #13
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 02:32:23 +00:00
admin 6491a35da4 Merge pull request 'fix(codex): 加入 needs 變數' (#12) from develop into master
CD / Release Tag Version (push) Successful in 3s
CD / Docker Build & Push (push) Failing after 3s
Reviewed-on: #12
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 02:28:55 +00:00
admin 6bfc2c1940 Merge pull request 'fix(codex): 修正映像檔推送至倉庫的環境變數' (#11) from develop into master
CD / Docker Build & Push (push) Successful in 3s
CD / Release Tag Version (push) Successful in 4s
Reviewed-on: #11
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 02:25:26 +00:00
admin 7ec855de3d Merge pull request 'fix(codex): 密碼為空' (#10) from develop into master
CD / Release Tag Version (push) Successful in 5s
CD / Docker Build & Push (push) Failing after 11s
Reviewed-on: #10
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 02:21:48 +00:00
admin 4632a709aa Merge pull request 'refactor(codex): 重構 Codex 建置與推送到倉庫' (#9) from develop into master
CD / Release Tag Version (push) Successful in 4s
CD / Docker Build (push) Failing after 13s
Reviewed-on: #9
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 02:19:18 +00:00
admin ffb0369ee1 Merge pull request 'test(gitea): 列出所有變數' (#8) from develop into master
CD / Release Tag Version (push) Successful in 4s
CD / Docker Build (push) Failing after 2s
Reviewed-on: #8
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 02:04:05 +00:00
admin 4bcf4d6473 Merge pull request 'fest(codex): 修改取得存取庫名稱的方法' (#7) from develop into master
CD / Release Tag Version (push) Successful in 5s
CD / Docker Build (push) Failing after 14s
Reviewed-on: #7
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 01:58:48 +00:00
admin 3f99382936 Merge pull request 'fix(codex): 修正編號' (#6) from develop into master
CD / Docker Build (push) Failing after 4s
CD / Release Tag Version (push) Successful in 7s
Reviewed-on: #6
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 01:54:06 +00:00
admin e97e862748 Merge pull request 'feat(codex): 從 gitea 參數取得存取庫名稱' (#5) from develop into master
CD / Release Tag Version (push) Successful in 3s
CD / Docker Build (push) Failing after 9s
Reviewed-on: #5
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 01:52:28 +00:00
admin f23f1674e4 Merge pull request 'feat(codex): 加入標註成本的工作流程' (#4) from develop into master
CD / Release Tag Version (push) Successful in 5s
CD / Docker Build (push) Has been cancelled
Reviewed-on: #4
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 01:44:36 +00:00
admin 3c58fe37e8 Merge pull request 'feat(codex): 部屬 Codex 映像檔' (#2) from develop into master
CD / 部屬映像檔 (push) Has been cancelled
Reviewed-on: #2
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
2026-06-30 01:39:06 +00:00
3 changed files with 50 additions and 67 deletions
+14 -16
View File
@@ -3,8 +3,9 @@
# 當有 commit push 到 master 分支時觸發,流程分兩個 job 依序執行:
# 1. release-tag-version:釋出並標註成品版本,取得版本號。
# 2. docker-build-push:依上一步取得的版本號 docker build 映像檔,
# 並 push 到 gitea.jsc.idv.tw 倉庫。
# 更新日期:2026/06/30 12:00:23
# 並 push 到倉庫;倉庫主機由 vars.SERVER_DOMAIN 提供,
# 登入帳密由 secrets.USERNAME / secrets.PASSWORD 提供。
# 更新日期:2026/06/30 12:24:01
# =============================================================================
# workflow 名稱,會顯示在 Gitea Actions 介面上,方便辨識此流程
@@ -48,14 +49,6 @@ jobs:
# 宣告此 job 相依於 release-tag-version
# 確保版本號先產生完成才執行,並可透過 needs 取得其 outputs
needs: release-tag-version
# 此 job 範圍內的環境變數,供下方 steps 的 run 指令使用
env:
# 目標倉庫主機(Gitea container registry 位址)
SERVER: gitea.jsc.idv.tw
# 登入倉庫所使用的帳號
USERNAME: jiantw83
# 登入倉庫所使用的密碼/權杖,從 Gitea secrets 取得,避免明文外洩
PASSWORD: ${{ secrets.TOKEN }}
# 此 job 的執行步驟清單
steps:
# 步驟:取出原始碼到 runner 工作目錄,後續 docker build 需要 Dockerfile 等檔案
@@ -64,20 +57,25 @@ jobs:
uses: actions/checkout@${{ vars.ACTION_CHECKOUT_VERSION }}
# 步驟:登入 Docker 倉庫,取得推送映像檔的權限
- name: 登入倉庫
# 將密碼透過管線餵給 docker login 的 --password-stdin,避免密碼出現在指令參數中
run: echo $PASSWORD | docker login $SERVER -u $USERNAME --password-stdin
# 登入指令直接以表達式注入認證資訊:
# secrets.PASSWORD 為倉庫密碼、vars.SERVER_DOMAIN 為倉庫主機位址、
# secrets.USERNAME 為登入帳號;
# 密碼透過管線餵給 docker login 的 --password-stdin
# 避免密碼出現在指令參數中而被記錄於 log
run: echo ${{ secrets.PASSWORD }} | docker login ${{ vars.SERVER_DOMAIN }} -u ${{ secrets.USERNAME }} --password-stdin
# 指定以 bash 執行此指令
shell: bash
# 步驟:建置 Docker 映像檔
- name: 建置映像檔
# 以倉庫名稱(gitea.repository)為 image 名稱、上一個 job 產生的 version 為 tag
# image 名稱由 vars.SERVER_DOMAIN(倉庫主機)與 gitea.repository(倉庫名稱)組成、
# 以 needs.release-tag-version.outputs.version(上一個 job 產生的版本號)為 tag,
# 對當前目錄(.)的 Dockerfile 進行 build
run: docker build -t $SERVER/${{ gitea.repository }}:${{ needs.release-tag-version.outputs.version }} .
run: docker build -t ${{ vars.SERVER_DOMAIN }}/${{ gitea.repository }}:${{ needs.release-tag-version.outputs.version }} .
# 指定以 bash 執行此指令
shell: bash
# 步驟:將建置完成的映像檔推送到倉庫
- name: 推送映像檔
# push 與上一步相同名稱與 tag 的映像檔到 SERVER 指定的倉庫
run: docker push $SERVER/${{ gitea.repository }}:${{ needs.release-tag-version.outputs.version }}
# push 與上一步相同名稱與 tag 的映像檔到 vars.SERVER_DOMAIN 指定的倉庫主機
run: docker push ${{ vars.SERVER_DOMAIN }}/${{ gitea.repository }}:${{ needs.release-tag-version.outputs.version }}
# 指定以 bash 執行此指令
shell: bash
+23 -48
View File
@@ -1,65 +1,40 @@
# =============================================================================
# 用途:本 Dockerfile 採「階段建置(multi-stage build)」產出 codex CLI 映像。
# build 階段使用 node-slim 基底,透過 npm 全域安裝 @openai/codex CLI 套件
# runtime 階段同樣改用較小的 node-slim 基底,只帶入 build 階段安裝好的 codex
# 套件與其相依,並額外安裝 ca-certificates 以支援 HTTPS 連線,
# 用途:本 Dockerfile 採「階段建置(single-stage build)」產出 codex CLI 映像。
# node-slim 基底,透過 npm 全域安裝 @openai/codex CLI 套件
# 並額外安裝 ca-certificates 以支援 HTTPS 連線,
# 最終映像預設執行 `codex --version`。
# 更新日期:2026/06/30 12:00:12
# 更新日期:2026/07/01 09:58:04
# =============================================================================
# syntax 指示詞:指定使用 dockerfile:1 前端語法,啟用 BuildKit 進階功能(必須置於檔首第一行有效指令)
# syntax=docker/dockerfile:1
# 1. 參數處理:可調參數集中於檔首,以 ARG 注入
# ARG NODE_VERSIONnode 基底映像的版本號,預設 22,可於 build 時以 --build-arg 覆寫
ARG NODE_VERSION=22
# ARG BUILD_IMAGEbuild 階段的基底映像,預設為 node:<版本>-slimslim 版較精簡)
ARG BUILD_IMAGE=node:${NODE_VERSION}-slim
# ARG RUNTIME_IMAGEruntime 階段的基底映像,預設同樣為 node:<版本>-slim
ARG RUNTIME_IMAGE=node:${NODE_VERSION}-slim
# ARG CODEX_PACKAGE:要全域安裝的 npm 套件名稱,預設 @openai/codexcodex CLI
ARG CODEX_PACKAGE=@openai/codex
# 1. 參數處理:映像檔版本與套件版本皆直接寫死,無可調參數需以 ARG 注入(略)
# ---- build 階段:安裝 codex CLI 套件 ----
# FROM ... AS build:以 BUILD_IMAGE 為基底開啟名為 build 的第一個建置階段(供後續 COPY --from 取用產物
FROM ${BUILD_IMAGE} AS build
# ---- 單一建置階段:安裝 codex CLI 套件 ----
# FROM node:22-slim:以 node 22 slim 版為基底開啟唯一建置階段(slim 版較精簡
FROM node:22-slim
# 2. 安裝套件:以 npm 全域安裝 codex CLI(無本地相依描述檔,故無 manifest 先行 COPY 的 layer 快取最佳化空間)
# ENV DEBIAN_FRONTEND=noninteractive:設定 Debian 套件管理為非互動模式,避免 apt 安裝時跳出互動提示而卡住建置
ENV DEBIAN_FRONTEND=noninteractive
# 2. 安裝套件:先以 apt 安裝 codex 進行 HTTPS 連線所需的 ca-certificates,再以 npm 全域安裝 @openai/codex CLI
# 官方 node image 的全域安裝前綴為 /usr/local,套件與其相依落於 /usr/local/lib/node_modulesbin symlink 落於 /usr/local/bin
# ARG CODEX_PACKAGE:在 build 階段內重新宣告 ARG,使檔首定義的值可在此階段被引用(ARG 作用域以 FROM 為界,跨階段需重新宣告
ARG CODEX_PACKAGE
# RUN npm install -g:全域安裝指定的 codex 套件;接著 npm cache clean --force 清除 npm 快取,
# 避免快取檔殘留於此層(雖然 build 階段產物不會整層帶入 runtime,仍維持乾淨並縮小該層)
RUN npm install -g "${CODEX_PACKAGE}" \
&& npm cache clean --force
# (單階段無跨階段 COPYnpm 建立的 /usr/local/bin/codex symlink 原地保留、指向正確,可正常解析平台原生相依
# RUNapt 安裝 ca-certificates--no-install-recommends 不裝建議套件)→ npm 全域安裝 codex →
# 於同一層合併清理 apt 索引快取與 npm 快取,避免快取檔殘留而膨脹該層
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
&& npm install -g @openai/codex \
&& npm cache clean --force \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 3. 複製檔案:本映像為純 CLI 工具安裝,無專案原始碼需複製(略)
# 4. 執行程序:codex 為預編譯 npm 套件,無 build / compile / transpile 步驟(略)
# ---- 5. 縮小映像檔:runtime 改用較小的 node-slim 基底,只帶執行所需產物 ----
# FROM ... AS runtime:以 RUNTIME_IMAGE 為基底開啟名為 runtime 的最終階段;
# 此階段為最終輸出映像,不含 build 階段的 npm 快取等中間產物,藉此縮小映像體積
FROM ${RUNTIME_IMAGE} AS runtime
# 保留原檔的 ENV 契約:DEBIAN_FRONTEND=noninteractive(並使下方 apt 安裝為非互動)
# ENV DEBIAN_FRONTEND=noninteractive:設定 Debian 套件管理為非互動模式,避免 apt 安裝時跳出互動提示而卡住建置
ENV DEBIAN_FRONTEND=noninteractive
# 保留原檔行為:安裝 ca-certificates 供 codex 進行 HTTPS 連線,安裝後清理 apt 快取縮小該層
# RUN apt-get:更新套件索引後,以 --no-install-recommends 僅安裝 ca-certificates(不裝建議套件,減少體積);
# 安裝完成後 apt-get clean 並刪除 /var/lib/apt/lists/* 套件索引快取,將清理與安裝合併於同一層以縮小該層
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 只帶入執行所需產物:全域安裝的 codex 套件(含其相依)與 bin symlink
# COPY --from=build node_modules:自 build 階段複製全域套件目錄(codex 套件本體與其所有相依)
COPY --from=build /usr/local/lib/node_modules /usr/local/lib/node_modules
# COPY --from=build codex:自 build 階段複製 codex 的可執行檔(bin symlink),使其可於 PATH 中直接呼叫
COPY --from=build /usr/local/bin/codex /usr/local/bin/codex
# 5. 縮小映像檔:單階段下透過「slim 基底 + --no-install-recommends + 安裝與清理合併於同層(見步驟 2)」達成縮小,故此處無獨立清理指令
# 6. 設定入口:CMD 置於最後,語意與原檔一致
# CMD:容器啟動時的預設執行指令,預設執行 `codex --version` 顯示版本(exec form,不經 shell);可於 docker run 時覆寫
CMD ["codex", "--version"]
+13 -3
View File
@@ -1,6 +1,6 @@
# codex
> 更新時間(Asia/Taipei):2026/06/30 12:04:48
> 更新時間(Asia/Taipei):2026/06/30 12:29:20
以多階段建置(multi-stage build)打包 [@openai/codex](https://www.npmjs.com/package/@openai/codex) CLI 的 Docker 映像檔專案。build 階段於 `node:<版本>-slim` 透過 npm 全域安裝 codex CLIruntime 階段改用同樣精簡的 `node-slim` 基底,只帶入 codex 套件與其相依,並額外安裝 `ca-certificates` 以支援 HTTPS 連線,最終映像預設執行 `codex --version`。搭配 `.gitea/workflows/cd.yaml`,當 push 到 `master` 分支時,會自動釋出版本號、建置映像檔並推送到 Gitea 倉庫。
@@ -75,6 +75,16 @@ docker build --build-arg CODEX_PACKAGE=@openai/codex@latest -t codex:latest .
`.gitea/workflows/cd.yaml` 定義 CD 流程:當 push 到 `master` 分支時觸發,依序執行兩個 job
1. **Release Tag Version**:以共用 composite action 釋出並標註成品版本,輸出 `version`
2. **Docker Build & Push**checkout 原始碼 → 登入 `gitea.jsc.idv.tw` 倉庫(帳密來自 secrets)→ 以 `gitea.repository` 為映像名稱、上一步 `version` 為 tag 建置並推送映像檔。
2. **Docker Build & Push**checkout 原始碼 → 登入倉庫 → 建置並推送映像檔。
> 對外契約(CI 倉庫位址 `gitea.jsc.idv.tw`、登入帳號、`secrets.TOKEN`、建置與推送指令)皆沿用原設定,未變更。
其中倉庫主機與登入認證皆由 Gitea 的 Actions 變數/密鑰提供:
| 設定來源 | 用途 |
| --- | --- |
| `vars.SERVER_DOMAIN` | 倉庫主機位址(image 名稱前綴、`docker login` 目標) |
| `secrets.USERNAME` | 登入倉庫的帳號 |
| `secrets.PASSWORD` | 登入倉庫的密碼/權杖(以 `--password-stdin` 餵入,避免出現在指令參數) |
| `vars.ACTION_RELEASE_TAG_VERSION` | 釘選 release-tag-version composite action 版本 |
| `vars.ACTION_CHECKOUT_VERSION` | 釘選 checkout action 版本 |
> 映像檔最終標籤格式為 `${vars.SERVER_DOMAIN}/${gitea.repository}:${version}`,其中 `version` 來自 Release Tag Version job 的輸出。