自動佈署伺服器環境,並利用 Git 實現原生程式碼自動同步到伺服器!

Jourdon發表於2018-04-01

這裡說的自動佈署是兩方面的,第一部分是指令碼自動佈署伺服器環境,第二部份是自動佈署程式碼,完成這兩部分,在我理解,就算是完成自動部署了。

我們要做的,就是本地寫完程式碼提交 git 後,使用git push 自動將程式碼推送到測試或生產環境的站點目錄。
好的,開工吧!

LNMP線上環境自動佈署指令碼

使用 此指令碼 可在一臺全新的 Ubuntu 14.04 LTS 或者 Ubuntu 16 上自動部署適合 Laravel 使用的 LNMP 生產環境。
按照此 文件 安裝即可。

但是此方法在使用中會有一些小問題

  1. 網易映象加速後會出現一些安裝錯誤
    可能是網易映象沒有更新完全。
    需要將網易映象地址更新為其它地址,可以參考 Ubuntu 官方模版 來更新映象。
    我使用的是阿里雲的映象替換了網易的映象。
    vi /etc/apt/sources.list

    更新為

    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    ##測試版源
    deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    # 原始碼
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    ##測試版源
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    # Canonical 合作夥伴和附加
    deb http://archive.canonical.com/ubuntu/ xenial partner
    deb http://extras.ubuntu.com/ubuntu/ xenial main
  2. 正常安裝後Nginx 啟動前需要把 apache 解除安裝掉,然後再啟動 Nginx .
    apt-get purge apache2
    service nginx restart
  3. redis 預設沒有啟動
    service redis-server start  // 啟動 redis
    service redis-server status  // 檢視 redis
    service redis-server  stop  // 停止 redis

配置Git自動部署

建立Git遠端倉庫

我們用一個獨立的路徑來做遠端倉庫。
然後在倉庫的路徑下,建立一個git裸倉庫:

cd /home/ubuntu/repo/
git init --bare blog.git

git 預設是禁止 push 的,所有要設定允許 push

vi config

修改或新增如下內容:

[receive]
        denyCurrentBranch = ignore

編輯自動部署指令碼

自動部署用到 git hooks ,在 git 路徑下有個 hooks 資料夾,裡面有一些示例。我們把 post-update.sample 重新命名為 post-update ,並進行編輯:

mv post-update.sample post-update
vi post-update
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".

#exec git update-server-info

unset GIT_DIR

NowPath=`pwd`

DeployPath="/home/ubuntu/www/blog"

cd $DeployPath
git pull origin master
composer install

cd $NowPath

echo 'deploy success'
exit 0

這樣每當 push master 分支到伺服器時,都會自動切換到 DeployPath ,也就是 Nginx root 路徑,執行 git pull origin master 從倉庫拉去最新 master 分支,並執行 composer install ,如果專案 composer 有變更則安裝,沒有變更則不會安裝。

部署路徑初始化

先把空的倉庫克隆到 home/ubuntu/www/ 路徑下 :

git clone  /home/ubuntu/repo/blog.git

伺服器的配置就級別完成了,此 blog 即為你的站點目錄

推送git倉庫

進入本地共享資料夾,執行

git clone root@server_ip:/home/ubuntu/repo/blog.git blog_back

將遠端的空倉庫克隆下來。名稱為 blog_back,防止與本地 blog 目錄衝突。
ok,現在我們來建立一個專案

本地建立專案並提交 Git

composer create-project --prefer-dist laravel/laravel blog
mv blog_back/.git  blog/.git  //將 .git 目錄拷貝過來即可在此目錄操作 git
cd  blog
git add -A
git commit -m 'init'
git push origin master //此時輸入伺服器密碼即可將本地專案推送到伺服器上

這裡我使用的是預設的 root 使用者,我們可以單獨設定一個 git 使用者,也可以使用公鑰的形式,類似於 github 的方式。

安裝 Composer

開啟命令列並依次執行下列命令安裝最新版本的 Composer

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
//下載安裝指令碼 - composer-setup.php - 到當前目錄。
php composer-setup.php //執行安裝過程。
php -r "unlink('composer-setup.php');"  //刪除安裝指令碼

執行第一條命令下載下來的 composer-setup.php 指令碼將簡單地檢測 php.ini 中的引數設定,如果某些引數未正確設定則會給出警告;然後下載最新版本的 composer.phar 檔案到當前目錄。
開啟命令列視窗並執行如下命令將前面下載的 composer.phar 檔案移動到 /usr/local/bin/ 目錄下面:

sudo mv composer.phar /usr/local/bin/composer

程式監控器 Supervisor 配置

專案中有些指令碼需要在後臺執行,比如佇列、HorizonSupervisor可以監控後臺指令碼的執行,再產生異常或是停止後自動重啟,保證了指令碼不會被異常中斷。定時任備也可以直接用 Supervisor 來執行,Supervisor 還可以寫入執行成功或失敗的日誌,方便檢視。
此指令碼預設安裝了 supervisor ,我們只需設定好啟動即可。

配置

/etc/supervisor/conf.d/ 下新建一個配置檔案 horizon.conf,寫入以下內容

[program:horizon]
process_name=%(program_name)s_%(process_num)02d
command=php /home/ubuntu/www/site/artisan horizon  //啟動指令碼命令。
autostart=true  //隨著supervisord的啟動而啟動
autorestart=true //自動重啟
user=ubuntu  // 使用者組
numprocs=1 // 啟動程式,根據指令碼決定
redirect_stderr=true  //重定向stderr到stdout
stdout_logfile=/var/log/supervisor/horizon.log  //日誌 注意日誌目錄的許可權

接下來就可以啟動 supervisord 了。

supervisord -c /etc/supervisord.conf  //啟動
supervisorctl shutdown //關閉
supervisorctl reload  //重新載入配置

好了。到這裡自動佈署就完成了,接下來就是盡情的敲程式碼吧!

我的小站 茄盒網

Good Good Study , Day Day Up!!

相關文章