19 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
Jeffery 5058a5dd4a docs(README 與 CD workflow): 重建 README 並為 cd.yaml 補逐行註解 2026-06-30 12:13:29 +08:00
Jeffery 4622ff3001 refactor(Dockerfile): 重整為多階段六步流程並改用 node-slim 基底縮小映像 2026-06-30 12:13:29 +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 175 additions and 14 deletions
+53 -7
View File
@@ -1,35 +1,81 @@
# =============================================================================
# 用途:這是 Gitea Actions 的 CD(持續部署)workflow。
# 當有 commit push 到 master 分支時觸發,流程分兩個 job 依序執行:
# 1. release-tag-version:釋出並標註成品版本,取得版本號。
# 2. docker-build-push:依上一步取得的版本號 docker build 映像檔,
# 並 push 到倉庫;倉庫主機由 vars.SERVER_DOMAIN 提供,
# 登入帳密由 secrets.USERNAME / secrets.PASSWORD 提供。
# 更新日期:2026/06/30 12:24:01
# =============================================================================
# workflow 名稱,會顯示在 Gitea Actions 介面上,方便辨識此流程
name: CD
# 觸發條件區塊,定義哪些事件會啟動此 workflow
on:
# 監聽 push 事件(有提交被推送到倉庫時)
push:
# 限定只有 push 到下列分支時才觸發,避免其他分支誤觸發部署
branches:
# 僅針對 master 分支(正式主線)觸發 CD
- master
# 工作(job)區塊,定義此 workflow 包含的所有 job
jobs:
# 第一個 job:負責釋出並標註成品版本,產出版本號供後續 job 使用
release-tag-version:
# job 的顯示名稱,呈現在 Actions 介面
name: Release Tag Version
# 指定執行此 job 的 runner 標籤(自架的 ubuntu runner
runs-on: ubuntu
# 定義此 job 對外輸出的值,供其他 job 透過 needs 引用
outputs:
# 將下方 id 為 release-tag-version 的 step 所輸出的 version
# 暴露為此 job 的 version 輸出,後續 docker-build-push 會用到
version: ${{ steps.release-tag-version.outputs.version }}
# 此 job 的執行步驟清單
steps:
# 步驟:執行外部 composite action 來釋出並標註成品版本
- name: 釋出並標註成品版本
# 設定 step 的 id,讓 outputs 能以 steps.release-tag-version 引用其輸出
id: release-tag-version
# 使用 Gitea 上的共用 composite action 取得版本號;
# 版本以變數 vars.ACTION_RELEASE_TAG_VERSION 釘選,便於統一管理 action 版本
uses: https://gitea.jsc.idv.tw/composite-actions/release-tag-version@${{ vars.ACTION_RELEASE_TAG_VERSION }}
# 第二個 job:建置 Docker 映像檔並推送到倉庫
docker-build-push:
# job 的顯示名稱
name: Docker Build & Push
# 指定執行此 job 的 runner 標籤(自架的 ubuntu runner
runs-on: ubuntu
# 宣告此 job 相依於 release-tag-version
# 確保版本號先產生完成才執行,並可透過 needs 取得其 outputs
needs: release-tag-version
env:
SERVER: gitea.jsc.idv.tw
USERNAME: jiantw83
PASSWORD: ${{ secrets.TOKEN }}
# 此 job 的執行步驟清單
steps:
# 步驟:取出原始碼到 runner 工作目錄,後續 docker build 需要 Dockerfile 等檔案
- name: 取得存取庫
# 使用官方 checkout action;版本以變數 vars.ACTION_CHECKOUT_VERSION 釘選
uses: actions/checkout@${{ vars.ACTION_CHECKOUT_VERSION }}
# 步驟:登入 Docker 倉庫,取得推送映像檔的權限
- name: 登入倉庫
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: 建置映像檔
run: docker build -t $SERVER/${{ gitea.repository }}:${{ needs.release-tag-version.outputs.version }} .
# image 名稱由 vars.SERVER_DOMAIN(倉庫主機)與 gitea.repository(倉庫名稱)組成、
# 以 needs.release-tag-version.outputs.version(上一個 job 產生的版本號)為 tag,
# 對當前目錄(.)的 Dockerfile 進行 build
run: docker build -t ${{ vars.SERVER_DOMAIN }}/${{ gitea.repository }}:${{ needs.release-tag-version.outputs.version }} .
# 指定以 bash 執行此指令
shell: bash
# 步驟:將建置完成的映像檔推送到倉庫
- name: 推送映像檔
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
+32 -7
View File
@@ -1,15 +1,40 @@
FROM ubuntu:latest
# =============================================================================
# 用途:本 Dockerfile 採「單階段建置(single-stage build)」產出 codex CLI 映像。
# 以 node-slim 為基底,透過 npm 全域安裝 @openai/codex CLI 套件,
# 並額外安裝 ca-certificates 以支援 HTTPS 連線,
# 最終映像預設執行 `codex --version`。
# 更新日期:2026/07/01 09:58:04
# =============================================================================
# syntax 指示詞:指定使用 dockerfile:1 前端語法,啟用 BuildKit 進階功能(必須置於檔首第一行有效指令)
# syntax=docker/dockerfile:1
# 1. 參數處理:映像檔版本與套件版本皆直接寫死,無可調參數需以 ARG 注入(略)
# ---- 單一建置階段:安裝 codex CLI 套件 ----
# FROM node:22-slim:以 node 22 slim 版為基底開啟唯一建置階段(slim 版較精簡)
FROM node:22-slim
# ENV DEBIAN_FRONTEND=noninteractive:設定 Debian 套件管理為非互動模式,避免 apt 安裝時跳出互動提示而卡住建置
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update \
&& apt install -y --no-install-recommends \
# 2. 安裝套件:先以 apt 安裝 codex 進行 HTTPS 連線所需的 ca-certificates,再以 npm 全域安裝 @openai/codex CLI
# 官方 node image 的全域安裝前綴為 /usr/local,套件與其相依落於 /usr/local/lib/node_modulesbin symlink 落於 /usr/local/bin
# (單階段無跨階段 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 \
nodejs \
npm \
&& npm install -g @openai/codex \
&& apt clean \
&& npm cache clean --force \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
CMD ["codex", "--version"]
# 3. 複製檔案:本映像為純 CLI 工具安裝,無專案原始碼需複製(略)
# 4. 執行程序:codex 為預編譯 npm 套件,無 build / compile / transpile 步驟(略)
# 5. 縮小映像檔:單階段下透過「slim 基底 + --no-install-recommends + 安裝與清理合併於同層(見步驟 2)」達成縮小,故此處無獨立清理指令
# 6. 設定入口:CMD 置於最後,語意與原檔一致
# CMD:容器啟動時的預設執行指令,預設執行 `codex --version` 顯示版本(exec form,不經 shell);可於 docker run 時覆寫
CMD ["codex", "--version"]
+90
View File
@@ -0,0 +1,90 @@
# codex
> 更新時間(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 倉庫。
## 專案列表
### 專案描述
| 專案名稱 | 專案描述 |
| --- | --- |
| [codex](https://gitea.jsc.idv.tw/images/codex/src/branch/develop) | 以多階段建置打包 @openai/codex CLI 的 Docker 映像檔專案,提供 `Dockerfile` 與 Gitea Actions CD 流程;此專案未公開可列入 README 的功能。 |
### 參考專案
| 專案名稱 | 參考專案列表 |
| --- | --- |
| [codex](https://gitea.jsc.idv.tw/images/codex/src/branch/develop) | 無 |
### NuGet 套件
| 專案名稱 | NuGet 套件列表 |
| --- | --- |
| [codex](https://gitea.jsc.idv.tw/images/codex/src/branch/develop) | 無 |
## 功能列表
本專案為 Docker 映像檔建置專案,未公開可列入 README 的程式方法(public methodconstructorextension methodoperator)。實際交付內容為下列容器映像檔的建置與發佈設定,使用方式詳見「使用範例」。
## 使用範例
### 建置映像檔
於專案根目錄(含 `Dockerfile`)執行:
```bash
docker build -t codex .
```
- 預設使用 `node:22-slim` 作為 build 與 runtime 基底,並全域安裝 `@openai/codex`
- 建議啟用 BuildKit(檔首已宣告 `# syntax=docker/dockerfile:1`):`DOCKER_BUILDKIT=1 docker build -t codex .`
### 執行容器
```bash
# 顯示 codex 版本(映像檔預設 CMD)
docker run --rm codex
# 覆寫預設指令,改執行其他 codex 子指令
docker run --rm codex codex --help
```
### 以 build 參數覆寫預設值
`Dockerfile` 將可調參數集中於檔首 `ARG`,可於建置時覆寫:
```bash
# 指定 node 版本
docker build --build-arg NODE_VERSION=20 -t codex:node20 .
# 指定要安裝的 npm 套件(預設 @openai/codex
docker build --build-arg CODEX_PACKAGE=@openai/codex@latest -t codex:latest .
```
| 參數 | 預設值 | 說明 |
| --- | --- | --- |
| `NODE_VERSION` | `22` | node 基底映像版本(同時套用於 build 與 runtime 階段) |
| `BUILD_IMAGE` | `node:${NODE_VERSION}-slim` | build 階段基底映像 |
| `RUNTIME_IMAGE` | `node:${NODE_VERSION}-slim` | runtime 階段基底映像 |
| `CODEX_PACKAGE` | `@openai/codex` | 要全域安裝的 npm 套件名稱 |
### CI/CD 自動發佈(Gitea Actions
`.gitea/workflows/cd.yaml` 定義 CD 流程:當 push 到 `master` 分支時觸發,依序執行兩個 job
1. **Release Tag Version**:以共用 composite action 釋出並標註成品版本,輸出 `version`
2. **Docker Build & Push**:checkout 原始碼 → 登入倉庫 → 建置並推送映像檔。
其中倉庫主機與登入認證皆由 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 的輸出。