這個自動部署溜畅,真是把人折騰的不行,我看其他人搞好容易极祸,結果慈格,我這邊麻煩得很。最后總結遥金,主要原因還會因為對 docker 不熟悉造成的浴捆,網(wǎng)上的很多記錄,只能參考一點點稿械,摸索了一整天选泻,終于實現(xiàn)了,下來重復一下整個流程溜哮,一方面記錄一下,另一方面色解,希望有同樣需求的朋友參考:
Part 1. 環(huán)境描述
通過 docker compose 安裝 LNMP 環(huán)境茂嗓;
git 線上用的是 coding.net
Part 2. 正確流程
以下操作都在服務器環(huán)境進行
1. 進入安裝 php 的 docker 容器
1.1 ssh 登錄服務器
ssh root@192.168.0.0
// @ 后的 ip 是你云服務器外部 ip
1.2 進入安裝 php 的 docker 容器
docker exec -it php /bin/bash
// php:是你自己的容器 name
2. 切換用戶
剛才登陸是用 root 登陸的,但 php 運行時的用戶是 www-data科阎,因此需要切換用戶為 www-data
su - www-data
3. 生成配對公鑰
一定要在 www-data 用戶下生成公鑰
ssh-keygen -t rsa -C account@email.com
// 一路回車就好述吸,不要設置密碼,否則操作 git 時會要求填寫賬號密碼,沒法自動部署
// account@email.com 是你的 coding 郵箱賬號
4. 復制公鑰
參考上圖蝌矛,找到公鑰位置
cd /var/www/.ssh/id_rsa
// 你會看到兩個文件:
// id_rsa:私鑰道批,存在的服務器上,請求時自動驗證入撒;
// id_rsa.pub:公鑰隆豹,將內(nèi)容配置到 git 倉庫(coding.net)
// 查看 id_rsa.pub,復制其中的全部內(nèi)容
cat id_rsa.pub
5. 部署公鑰
此操作在 coding.net 上
1)配置公鑰
6. 確認公鑰配置正確
ssh -T git@e.coding.net
看到以下內(nèi)容茅逮,表示公鑰部署成功
7. 部署 webhook 文件
1)編寫 webhook.php
我是用 php 璃赡,因此 webhook 就是 PHP 文件,我的命名是 webhook.php 献雅,你可以自定義碉考。這里主要用到的是 php 的 shell_exec() / exec() 函數(shù),該函數(shù)是在 php 里執(zhí)行 linux 系統(tǒng)的 shell 腳本(我的是 /bin/bash 解釋器)挺身。以下是簡單的 webhook.php 代碼:
<?php
// 因為我的 webhook.php 文件侯谁,是放在項目里的,因此無須是用 cd 切換目錄章钾,直接執(zhí)行拉取即可墙贱。
// 2>&1:是用來輸入執(zhí)行返回結果的
// 因為我只有 git pull 這一條執(zhí)行項目,因此伍玖,使用了 exec()嫩痰,沒有使用 shell_exec()
$res = exec('git pull 2>&1');
// 打印結果
print $res;
?>
注:將 webhook.php 文件放到服務器上,你項目的地址(流程應該在 git clone 你的項目后窍箍,再復制到項目目錄)
2)配置 webhook
8. 首次拉取文件
1)找到 git 地址串纺,clone 項目到服務器
2) 進入項目上級目錄
git clone git@e.coding.net:……
9. 測試自動部署
可以試著本地 git push 項目了,順利的話椰棘,就能自動部署纺棺。如果沒能成功,繼續(xù)往下看邪狞,看看下面的問題詳解能否解決問題祷蝌。
Part 3. 遇到的問題
1. git not found(git:command not found)
這個問題,就是對 docker 不理解的一個表現(xiàn)帆卓,這個提示很明確沒有找到 git 命令巨朦,因為我的 git 是裝在服務器層面的,而不是裝在 docker 容器里的剑令,所以糊啡,很長時間,沒想明白(明明裝了 git 為啥提示沒有)吁津。
解決辦法:就是在 php 容器的 docker 里裝一次 git 棚蓄。
apt-get update
apt-get install git
2. Please make sure you have the correct access rights and the repository exists.
這個人問題是在裝上 git 后,git pull 拉代碼時出錯的,這個就是公鑰配對的問題梭依。
返回可能只返回:the repository exists
解決辦法:重新部署公鑰
- 刪除 coding 上的 公鑰
- 刪除 .ssh 下的 id_rsa id_rsa.pub known_hosts 三個文件
- 再次執(zhí)行上面的 第 5 步
3. git pull fatal: unpack-objects failed
// 報錯如下
remote: Counting objects: 100, done
remote: Finding sources: 100% (77/77)
remote: Total 77 (delta 20), reused 60 (delta 20)
error: insufficient permission for adding an object to repository database .git/objects
fatal: failed to write object
fatal: unpack-objects failed
這是個 .git 文件夾的歸屬權限問題
解決辦法:給用戶 .git 文件夾賦予更高的權限
chown -R www-data [projectDir]
4. www-data 權限不夠
將你的項目文件開啟更高權限稍算,讓 www-data 訪問
chmod 777 .git