---
# System prepended metadata

title: CI/CD 筆記

---

# CI/CD 筆記
- CI/CD 簡介
	- CI / CD 用來做什麼
		- 骨子裡就是自動幫你跑指令
		- 先有辦法手動，再想辦法自動化
	- CI 與 CD 的不同
		- CI 用來自動化測試，確保每一次推上版本庫的程式碼是沒問題的
		- CD 是 CI 的再延伸，自動將測試過沒有問題的程式碼部署到環境上
	- CI / CD 工具的架構
		- 舊式架構，以 Jenkins 為例
			- 沒有 Docker 協助管理環境
			- Jenkins 和 build agent 可以放在一起，造成環境混亂
			- 需要自己建立 build agent 的環境，要 PHP 就要在上面自己安裝 PHP，多版本時管理是個問題
		- 新式架構，使用 Docker 管理環境
			- 如 Drone、GitHub Actions 都類似
			- Drone 最激進，全部東西都會開 Docker container 來跑
			- GitHub Actions 允許使用 Docker 開 container 跑或直接執行 nodejs 寫的 script
			- CI/CD 程式本體的 server 和 build agent 一定是分開的
			- build agent 的環境更為單純，因為每次都用 Docker 重新建立
			- 不用再搞非常複雜的 all-in-one build agent 環境
- Live demo - 用一個簡單的 PHP 專案為範例
	- 情境1.，外網可以碰到該 server，可以從 GitHub Actions 用 rsync 部署
		- 架一台跑 PHP + Apache 的 server
		- 從頭寫一個 GitHub Actions workflow YAML，用 [這個](https://github.com/tom19960222/github-actions-demo/blob/a1c08e21898936b93f7244fc4ed63529fa170ead/.github/workflows/deploy.yaml) 當作範例
		- 先只要 checkout + ls 就好
		- Push 一個 commit 上去看看效果
		- 在 web server 上設定 rsync
			- 先看 rsync 用的 action 的[文件](https://github.com/marketplace/actions/rsync-deployments-action)
				- 需要 `host`, `username`, `private key`
			- 產生 ssh key `ssh-keygen -t ed25519`
			- 把 key 丟上 GitHub Actions secrets
				- 順便帶一下為什麼要用 secrets
			- 改寫 workflow YAML，加上 rsync
			- 再 push 一個 commit 看看檔案應該要有變化
	- 情境2.，外網不能直接碰到 server
		- 架一台機器用來跑 PHP + Apache + GitHub Actions self-hosted runner
			- [參考文件](https://docs.github.com/en/actions/hosting-your-own-runners/adding-self-hosted-runners)
			- 要注意 GitHub Actions runner 不能用 root 執行，要先建一個 user，不用 sudo 權限
			- runner 會跑在前景，所以要先教基本的 screen 使用
				- `screen` 開一個新的 screen
				- `Ctrl+A` 然後按 `S` 來暫時脫離 screen
				- `screen -ls` 列出所有正在執行的 screen
				- `screen -r <id>` 來回到 screen
		- 修改 GitHub Actions workflow YAML，改用 self-hosted runner，並把指令從 rsync 換成 copy 就好 (當然用 `rsync -av . <網站根目錄>` 在本機的資料夾之間同步也可以)
		- Push 一個 commit 上去看看效果
	- 回家作業
		- 實作一次看看吧
		- 試試只有推上 master 的時候才觸發 deploy，如果推到其他 branch 則不觸發
		- 有空的話可以看看 git flow 的開發方式

![](https://i.imgur.com/VhQ2Q7w.png)
