CocosCreator 熱更新 使用Gitlab CI/CD自動產生Manifest並部署到Amazon Ec-2遠程伺服器
- 承鑫 郭
- 2020年8月20日
- 讀畢需時 2 分鐘
前言
當版本發布後,熱更新就會變得很頻繁且步驟幾乎是一樣的,就是資源或程式碼更新完後在cocos按建構 => version_generator.js產Manifest => 部署到遠程伺服器,如果這些都要請人力手動來做的話維護成本就會變高,且還有可能操作不當造成不必要的錯誤,所以就把能自動化的東西交給Gitlab的CI/CD做,達到自動化佈署。
PS.目前建構環境還是必須在Windows or Mac且CocosCreator有版本差異,所以建構部分還是先在CocosCreator執行,其他部分走CI/CD流程。
環境準備
1.Amazon Ec2
2.Docker化的Gitlab Runner
3.註冊GitLab Runner
4.SSH設定
如果要使用scp、rsync,或是SSH連線都需要先創建一組SSH Key Pair
本專案使用的是ED25519 SSH 密鑰,他相比RSA有更高效能,更安全
Step1.產SSH密鑰
ssh-keygen -t ed25519 -C "<comment>"
-C 是個標記,通常可使用Email當作標記。
產出流程如下:
記得passphrase必須設定為空,因為自動化沒辦法再使用手動輸入密碼去驗證。
Step2.將密鑰加到GitLab環境變數
點選專案的Settings => CI/CD => Varibles
Key的變數名稱可以自己定義:預設可使用 SSH_PRIVATE_KEY
Key的值是剛剛產出來的"密鑰"。可使用cat或pbcopy指令
Ex.
cat /Users/imac/.ssh/yourkeyname
pbcopy < /Users/imac/.ssh/yourkeyname
Protected必須設定為x,不然CI/CD會抓不到Key
PS.記得把上下列的
------BEGIN OPENSSH PRIVATE KEY-----
-----END OPENSSH PRIVATE KEY-----
一併複製進去,不然CI/CD過程時,會因為被要求passphrase而失敗!就算你沒有設定passphrase也一樣!
Step3.為遠程伺服器加上SSH公鑰作為認證
將剛剛產出的"公鑰"放到遠程伺服器上的~/.ssh/authorized_keys
mkdir -p ~/.ssh
cat yourkeyname >> ~/.ssh/authorized_keys
關閉手動使用密碼認證並打開公鑰驗證避免自動化流程卡住
sudo vim /etc/ssh/sshd_config
PermitRootLogin no
UsePAM no
PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes
重啟SSH Service
sudo systemctl restart sshd.service
問題排解:
CI/CD流程
1.撰寫.gitlab-ci.yml
本專案使用的是最新版Node.js的Docker容器,方便我們做Manifest產出。
當Docker pull一個最新的Node.js環境後,會將整個專案git pull下來,所以當前的路徑就是專案目錄,如果目錄上有version_generator.js可以在.gitlab-ci.yml下
node version_generator.js -v 5.0 -u http://0.0.0.0:7777/versions/ver_3_0/ -s build/jsb-link -d build/jsb-link
產出我們的project.manifest和version.manifest,接著要去ssh-add我們專案上的SSH密鑰,並將./ssh目錄權限做調整,詳細的解說請參考官方文檔。
最後再將我們的src,res,project.manifest和version.manifest經由scp複製到遠端服務器的FTP目錄下就大功告成囉!
build_job:
image: node:10
script:
- node version_generator.js -v 5.0 -u http://0.0.0.0:7777/versions/ver_3_0/ -s build/jsb-link -d build/jsb-link
- 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan ec2-user@0.0.0.0 >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- echo "🚚 開始複製檔案.."
- scp -r build/jsb-link/res ec2-user@0.0.0.0:/usr/share/html
- scp -r build/jsb-link/src ec2-user@0.0.0.0:/usr/share/html
- scp -r build/jsb-link/project.manifest ec2-user@0.0.0.0:/usr/share/html
- scp -r build/jsb-link/version.manifest ec2-user@0.0.0.0:/usr/share/html
- echo "🚴♂️ 完成部署
結語
目前針對CocosCreator的部署提供一個自動化的方向,當專案建構完成後修改.gitlab-ci.yml的遠端版本號,一併commit上git,Gitlab就會觸發Runner啟動Docker化的Nodejs環境來產出Manifest檔並把熱更新資源更新到遠程伺服器的熱更新路徑上,未來希望CocosCreator可以支持在Docker內做“建構”的動作,這樣我們客戶端程式修改完畢後就可以直接Commit到GitLab做完全自動化測試/部署。 參考資料
https://www.cnblogs.com/xubing-613/p/6844564.html
https://s0docs0gitlab0com.icopy.site/ee/ci/ssh_keys/README.html#verifying-the-ssh-host-keys
Comments