Artifact
Artifact 就是「程式碼經過建置後產生、可以被保存與交付的成品」,讓後面的部署流程不用重新猜你的程式怎麼變成可執行狀態


假設有一個 React 專案
1 | my-app/ |
轉成某種「可以被執行或部署的結果」
Pipeline 會執行
1 | ## 根據 package.json 安裝專案需要的套件, 執行後會產生或更新 node_modules/ package-lock.json |
這個階段會把原始碼轉成某種「可以被執行或部署的結果」
1 | dist/ |
將建置結果打包
系統可能會把 build 出來的結果壓成一包
1 | ## 這行是在把 dist/ 資料夾壓縮成一個檔案 app.tar.gz |
或產生
1 | app.jar |
這個打包後的東西,就是常見的 artifact,CI/CD 會把這個成品上傳到某個地方保存,例如
- GitHub Actions Artifacts
- GitLab Job Artifacts
- Jenkins Archive Artifacts
- Nexus
- Artifactory
- S3
- Container Registry

後續的部署 job 就可以直接下載它
部署階段下載 artifact
1 | download artifact |
也就是拿已經 build 好的成品 → 放到測試環境 / 正式環境,這樣可以確保「測試過的那一份」跟「部署出去的那一份」是同一份


Docker image 也可以被視為一種 artifact,只是它包的不只是程式,還包含執行環境。在現代部署裡,很多團隊不是上傳 .zip 或 .jar,而是 build Docker image
1 | docker build -t my-api:1.0.0 . |
這時候 artifact 就可能是 registry.example.com/my-api:1.0.0,也就是一個 container image
它裡面可能包含
- 應用程式
- runtime
- 環境依賴
- 啟動指令
- 檔案結構

所以 Docker image 可以理解成更完整的 artifact,一般 zip artifact 比較像只包程式成品,而 Docker image 是連執行這個程式需要的環境也一起包好

有一個 ASP.NET Core Web API 專案
1 | MyApi/ |
1 | ## 根據 .csproj 還原 NuGet 套件 |
最後部署端拿到 app.tar.gz
解壓縮後得到
1 | publish/ |
就可以用 dotnet publish/MyApi.dll,或由 systemd / IIS / Docker / Kubernetes 去啟動它


All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.


