# 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 的開發方式 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up