CentOS7+Git+碼雲+TP(php) WebHook自動同步部署更新代碼到阿里雲服務器_菜鳥詳情圖文教程

阿里雲服務器:oneinstack一鍵PHP環境

一、搭建碼雲好倉庫 (略過)

教程:https://blog.csdn.net/haibo0668/article/details/90403673

二、服務器搭建Git  oneinstack已經安裝好GIT,版本是:1.8.3

 查看git版本

git --version

2.1 在服務器上生成公鑰 (就像在你自己電腦生成公鑰一樣子)

生成公鑰的目的,是爲了更安全更方便的SSH拉取方式,同時讓git命令語句更簡潔。

部署公鑰允許以只讀的方式訪問倉庫,SSH主要用於倉庫在生產服務器的部署上,免去HTTP方式每次操作都要輸入密碼和普通SSH方式擔心不小心修改倉庫代碼的麻煩。

部署公鑰配置後的機器,只支持clone與pull等只讀操作。如果您想要對倉庫進行寫操作,請 添加個人公鑰

2.1.0 生成公鑰

sudo -u www ssh-keygen -t rsa -C "[email protected]" 

注意:www表示有權限執行PHP的用戶 

2.1.1 如何查看服務器上執行PHP的用戶(www)

xshell下執行 "ps aux|grep php-fpm"

ps aux | grep php-fpm

去找你php-fpm的配置文件,看圖

查看這個文件,查看用戶和組名稱

郵箱可以不同於碼雲帳號,默認三次回車即可生成 ssh key 

sudo -u www ssh-keygen -t rsa -C "[email protected]" 

說明:你也可以不輸入文件名,使用默認文件名(推薦),那麼就會生成 id_rsa 和 id_rsa.pub 兩個祕鑰文件。

接着又會提示你輸入兩次密碼(該密碼是你push文件的時候要輸入的密碼,而不是github管理者的密碼),
當然,你也可以不輸入密碼,直接按回車。那麼push的時候就不需要輸入密碼,直接提交到github上了,
 

2.1.2 出現錯誤:無法創建目錄“/home/www/.ssh”

Generating public/private rsa key pair.
Enter file in which to save the key (/home/www/.ssh/id_rsa): 
Could not create directory '/home/www/.ssh': Permission denied
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Passphrases do not match.  Try again.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
open /home/www/.ssh/id_rsa failed: No such file or directory.
Saving the key failed: /home/www/.ssh/id_rsa.

2.1.3 使用命令查看用戶的家目錄位置

位置:www:x:1001:1001::/home/www:/bin/bash

2.1.4 解決無法創建目錄“/home/www/.ssh”

用FTP軟件查看/home文件夾裏邊,什麼東西都沒有,空白一片

所以需要創建WWW文件夾

[root@ixxxxxxxxxxZ ~]# cd /home
[root@ixxxxxxxxxxZ home]# ls
[root@ixxxxxxxxxxZ home]# ls -l
total 0
[root@ixxxxxxxxxxZ home]# mkdir www
[root@ixxxxxxxxxxZ home]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Aug  2 15:51 www
[root@ixxxxxxxxxxZ home]# sudo chown www.www /home/www/

參考一個外國朋友方案:https://stackoverflow.com/questions/15860189/could-not-create-directory-home-hadoop-ssh-permission-denied

我花了大約1小時就完成了這件事,最後得到了解決方案。這是由於許可問題。你必須爲你的'hadoop用戶'使用chown。

1.首先製作hadoop目錄。
cd / home 
mkdir hadoop
然後檢查'ls -l'。它給出的結果如下:
drwxr-xr-x 2 hadoop hadoop 4096 8月22日22:17 hadoop

2. sudo chown hadoop.hadoop / home / hadoop /
3.然後運行關鍵生成器的剩餘命令。

再生成公鑰一次

sudo -u www ssh-keygen -t rsa -C "[email protected]" 

生成成功

 2.1.5  修改剛剛生成的公鑰

記下生成公鑰的目錄:

Your identification has been saved in /home/www/.ssh/id_rsa.
Your public key has been saved in /home/www/.ssh/id_rsa.pub.

2.1.6 查看公鑰 

cat /home/www/.ssh/id_rsa.pub
說明:
cat 查看
/home/www/.ssh/id_rsa.pub  剛剛上面生成公鑰的完整路徑

2.1.7 把公鑰填入到碼雲上

2.1.8 驗證公鑰是否生效,是否可以鏈接碼雲了

sudo -u www ssh -T [email protected]

 

 

四、初始化  (我們需要先在服務器上clone一次,以後都可以實現自動部署了)

Clone克隆代碼

4.1 初始化方法一:初次使用,先克隆一次代碼到網站目錄(推薦這個)

一定要先進入網站根目錄(比如正面webhook文件夾)

sudo -u www git clone 碼雲倉庫SSH地址  /網站根目錄
sudo -u www git clone [email protected]:xxxx/cms.git /data/wwwroot/default/webhook

 

4.2 初始化方法二:初次使用,先克隆一次代碼到網站目錄

# 進入需要自動部署的目錄xxx (就是服務器上放代碼的地方)
cd xxx
# 初始化
git init
# 添加遠程倉庫
git remote add origin GIT倉庫地址

git報錯:'fatal:remote origin already exists'怎麼處理?

4.2.1、先刪除

1

$ git remote rm origin

4.2.2、再次執行添加就可以了。

git報錯:fatal: remote origin already exists.

遠程來源已經存在

 

成功

 

五、碼雲WebHook通知服務器拉取代碼webhook.php

注意:

自動更新到阿里雲服務器代碼

5.1 更新語句一:把遠程和服務器同名分支更新,由本地當前分支決定,默認是把遠程master分支更新到阿里服務器的master分支中

echo shell_exec("cd {$savePath} && git pull {$gitPath} 2>&1");

例子:如果本地(阿里雲服務器)上,默認當前分支是master,那麼就把碼雲的master分支代碼更新過來

 

5.2 更新語句二   初始化後自動更新代碼纔有用

 echo shell_exec("cd $savePath && git checkout -f && git pull $branch 2>&1");

git命令:https://blog.csdn.net/haibo0668/article/details/99690269

 

代碼一:從碼雲自動更新到服務器一個文件夾

    //用於Gitee碼雲通過WebHooks實現自動同步代碼部署
    public function webhook()
    {

		// 先做一下測試
		// 測試ls是否能用
		// $output = shell_exec('ls -lart');
		// echo "<pre>$output</pre>";
		// echo shell_exec("ls -a");
        error_reporting(1);
	
		//git webhook 自動部署腳本
		//項目存放物理路徑,第一次clone時,必須保證該目錄爲空
		$savePath = "/data/wwwroot/default/cms.fn321.cn/application/2020";//更新鋒牛代碼
		//$savePath = "/data/wwwroot/default/cms.fn321.cn/application";//更新鋒牛代碼
		//$savePath8 = "/data/wwwroot/default/www.4008338788.com/application";//更衆聯牛代碼
		// $gitPath  = "https://gitee.com/fn321/cms.git";//代碼倉庫
		$gitPath  = "[email protected]:fn321/cms.git";//代碼倉庫 一定要使用ssh方式不然每次都得輸入密碼
		$branch = "refs/heads/develop";//同步那個分支

		//密碼
		$password = 'fn321@20190801/com';
		 
		//獲取請求參數
		$request = file_get_contents('php://input');
		if (empty($request)) {
			die('request is empty');
		}
		 
		//echo $request;
		//驗證密碼是否正確
		$content = json_decode($request, true);
		if ($content['password'] != md5($password)) {
			header("HTTP/1.1 403 Forbidden");
			die('非法提交');
		}
		
        //運行代碼 拉取碼雲最代碼到阿里服務器上
		//說明: 
		//1.shell_exec()即PHP用於執行系統命令的函數,
		//2.cd $dir:進入上面設置的項目倉庫文件夾中,
		//3.git checkout -f 撤銷本地的修改,
		//4.git pull origin master  從碼雲的項目倉庫master分支拉取最新代碼,注意origin爲遠程倉庫的別名,要與 git remote add 遠程倉庫,
		//5.別名 倉庫地址 中的遠程倉庫別名保持一致
//      echo shell_exec("cd {$savePath} && git checkout -f && git pull {$branch} 2>&1"); //更新鋒牛代碼
        //echo shell_exec("cd {$savePath8} && git checkout -f && git pull {$branch} 2>&1"); //更衆聯牛代碼
        echo shell_exec("cd {$savePath} && git pull {$gitPath} {$branch} 2>&1");//只能拉取遠程碼雲master分支到阿里雲服務器上,其它分支不會拉取
		die('done ' . date('Y-m-d H:i:s', time()));

    }

代碼二:從碼雲自動同時候更新到幾個服務器文件夾中

例子:同時更新到服務器2020和2021文件中

    //用於Gitee碼雲通過WebHooks實現自動同步代碼部署
    public function webhook()
    {

		// 先做一下測試
		// 測試ls是否能用
		// $output = shell_exec('ls -lart');
		// echo "<pre>$output</pre>";
		// echo shell_exec("ls -a");
        error_reporting(1);
	
		//git webhook 自動部署腳本
		//項目存放物理路徑,第一次clone時,必須保證該目錄爲空
		$savePath = "/data/wwwroot/default/xxxx.cn/application/2020";
		$savePath1 = "/data/wwwroot/default/xxxxx.cn/application/2021";
		// $gitPath  = "https://gitee.com/fn321/cms.git";//代碼倉庫
		$gitPath  = "[email protected]:fn321/cms.git";//代碼倉庫 一定要使用ssh方式不然每次都得輸入密碼
		$branch = "refs/heads/develop";//同步那個分支

		//密碼
		$password = '190801com';
		 
		//獲取請求參數
		$request = file_get_contents('php://input');
		if (empty($request)) {
			die('request is empty');
		}
		 
		//echo $request;
		//驗證密碼是否正確
		$content = json_decode($request, true);
		if ($content['password'] != $password) {
			header("HTTP/1.1 403 Forbidden");
			die('非法提交');
		}
		
        //運行代碼 拉取碼雲最代碼到阿里服務器上
		//說明: 1.shell_exec()即PHP用於執行系統命令的函數,
		//2.cd $dir:進入上面設置的項目倉庫文件夾中,
		//3.git checkout -f 撤銷本地的修改,
		//4.git pull origin master  從碼雲的項目倉庫master分支拉取最新代碼,注意origin爲遠程倉庫的別名,要與 git remote add 遠程倉庫,
		//5.別名 倉庫地址 中的遠程倉庫別名保持一致

		echo shell_exec("cd {$savePath} && git pull {$gitPath} {$branch} 2>&1");//只能拉取遠程碼雲master分支到阿里雲服務器上,其它分支不會拉取
        echo shell_exec("cd {$savePath1} && git pull {$gitPath} {$branch} 2>&1");//只能拉取遠程碼雲master分支到阿里雲服務器上,其它分支不會拉取
		die('done ' . date('Y-m-d H:i:s', time()));

    }

注意:2020和2021兩個文件夾裏邊都上傳一樣子的.GIT文件纔行,就是說要創建一個倉庫,但是這個倉庫同時存在兩個文件夾中

同一個.GIT

 

關鍵函數:shell_exec

webhooks用到的php代碼中使用了 shell_exec 函數,一般配置php會禁止這個函數,需要打開 shell_exec 函數;

參考:解決PHP調用exec或shell_exec的問題 https://blog.csdn.net/Qiang1370373713/article/details/84539990

注意:開放shell_exec這個php函數是非常危險的,因此切記不要在生產環境開放這個函數,更加不能用root權限去執行php。 
建議將以下代碼放到一個單獨配置的測試用網站環境,除log日誌文件以外,此環境下所有文件禁止www用戶的寫入和修改。

5.1 開啓 shell_exec 函數;

  • 找到php.ini文件 (我自己的路徑:/usr/local/php/etc)
  • 查詢disable_function
  • 刪除shell_exec,
  • 保存
  • 重啓PHP
  • 重啓php 隨便一個
    service php-fpm restart
    service nginx reload

5.2 測試服務器shell_exec函數是否開啓

https://cms.xxxx.cn/webhook.php代碼中寫

 

		// 先做一下測試
		// 測試ls是否能用
		$output = shell_exec('ls -lart');
		echo "<pre>$output</pre>";

結果:

這個一定要勾上

5.3 測試拉碼雲代碼

5.3.1 錯誤:error: cannot open .git/FETCH_HEAD: Permission denied(無法打開。git/fetch_head:權限被拒絕)

一種情況是:權限的問題

二種情況是:在服務器放在放代碼那個文件夾中沒有初始化git沒有成功,找不到.git文件夾(相當在本地服務器上建立倉庫)

查看.git是否存在  

進行到服務器放代碼那個文件夾(本例放到2020文件夾中,路徑:/default/cms.xxxx.cn/application/2020)

把初始化的倉庫.git文件夾用戶名和用戶組修改爲www www

修改:

方法一:如果你服務器是oneinstack配置的,使用官方說明:https://oneinstack.com/docs/lnmpstack-image-guide/

網站根目錄權限遵循:
文件644, 文件夾755 ,權限用戶和用戶組www
如出現文件權限問題時,請執行下面3條命令:


chown -R www.www /data/wwwroot/
find /data/wwwroot/ -type d -exec chmod 755 {} \;
find /data/wwwroot/ -type f -exec chmod 644 {} \;

結果:

方法二:環境自己配置

# 這裏以www用戶爲例
# 假設/wwwroot/web爲網站根目錄
sudo chown -R www:www /wwwroot/web

5.3.2  錯誤:Host key verification failed.

Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

解決方法:如果遇到 Host Key Verification Failed,就執行:

sudo -u www ssh-keyscan -t rsa gitee.com >> /home/www/.ssh/known_hosts
sudo -u www ssh-keyscan -t rsa 120.55.226.24 >> /home/www/.ssh/known_hosts

六  成功

From gitee.com:fnxxxxx/cms
 * branch            HEAD       -> FETCH_HEAD
done 2019-08-03 11:42:51

表明成功,已經從碼雲中拉到最新代碼到你自己服務器指定的位置上

 

七、實踐例子(前提是公鑰已經生成)

7.1 在服務上創建application文件夾 手動在服務器創建(裏邊不能上傳內容,保留空白)
7.2 給權限

chown -R www.www /data/wwwroot/
find /data/wwwroot/ -type d -exec chmod 755 {} \;
find /data/wwwroot/ -type f -exec chmod 644 {} \;

7.3 進入application文件夾(一定要先進入這個文件夾)

cd /data/wwwroot/default/cms.xxx.cn/application


7.4 創建.GIT本地倉庫(就是服務器上創建git庫) 同時初始化了庫,同時還更新了一次代碼

sudo -u www git clone [email protected]:xxx/cms.git /data/wwwroot/default/cms.xxxx.cn/application

格式:sudo -u www git clone 自己GIT網址 服務器倉庫文件夾地址(絕對地址)

7.5 切換本地分支(阿里服務器倉庫)  

情況一(默認情況):如果你從碼雲master分支更新到阿里服務器master分支 就可以直接用了

情況二:如果你從碼雲develop分支更新到阿里服務器develop分支

git branch
git checkout -b develop

7.6 更新權限,避免新創建的文件和更新沒有修改權限

chown -R www.www /data/wwwroot/
find /data/wwwroot/ -type d -exec chmod 755 {} \;
find /data/wwwroot/ -type f -exec chmod 644 {} \;

7.7 如果創建不成功,只能刪除阿里服務器的.GIT庫再7.1開始再來一次

rm -rf .git

 

八、實踐例子二   全新阿里服務器(公鑰按前面的步驟生成)

8.1 在服務上創建application文件夾 手動在服務器創建(裏邊不能上傳內容,保留空白)

8.2 要初始化GIT,增加用戶名和郵箱

git init
git config user.name "xxx"
git config user.email "[email protected]"

特別出現錯誤

From gitee.com:xxxxx/cms
 * branch            xxxx -> FETCH_HEAD

*** Please tell me who you are.

Run

  git config --global user.email "[email protected]"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

一定要要用上面代碼初始化GIT

8.3 切換阿里服務器的分支,要切換服務器分支與自己碼雲要同步一樣子分支名稱,

如果沒有創建,阿里服務器默認是master分支,也會默認同步碼雲master 分支

//查看分支
git branch
//創始400xxx並切換到400xxx分支
git checkout -b 400xxx

8.4 第一次拉代碼

sudo -u www git clone [email protected]:xxx/cms.git /data/wwwroot/default/www.xxx.com/application

 

教程參考:https://blog.csdn.net/haibo0668/article/details/102982414

 

參考:

https://blog.csdn.net/u012830303/article/details/82255431

https://blog.csdn.net/Qiang1370373713/article/details/87889009

https://blog.csdn.net/zmzwll1314/article/details/77678293

https://blog.csdn.net/huang3513/article/details/52837075

https://blog.csdn.net/hebin199118/article/details/80449067

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章