02.26 Walle實現自動發佈

walle是啥?能幹啥?有啥用?這些我都不會去一一道來,如果你還沒有明白前面提出的三個問題就不用往下看了,這裡這回將walle安裝了怎麼去使用.如果都要面面俱到不是一兩篇博客可以解決的問題,如果希望將walle部署到生產環境中,這篇博客或許能給你點啟發,下面給出的網站完全可以解決前面的幾個問題了.直接開始吧.

- walle官方網站

http://www.walle-web.io/

- walle1.x官方安裝教程

https://walle-web.io/docs/1/installation.html

- centos7安裝walle

https://www.jianshu.com/p/9ee126684641?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=weixin

- gitlab安裝

https://www.jianshu.com/p/1502aaed3ee6?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=weixin

###前期準備

- 系統centos6.5

- walle機器必須先部署LNMP/LAMP環境,這裡使用LNMP

- gitlab非必須,不會安裝嫌麻煩的可以直接使用git或者github

- 實驗之前,先關閉selinux和iptable 源碼包自行下載

- 實驗使用3臺虛擬機

gitlab機器: node4 192.168.19.140

walle機器: node1 192.168.19.139

模擬部署機器: node5 192.168.19.141

- 三臺機器上創建可以免密登錄的用戶: www

- 方便實驗將主機信息寫入hosts文件中,(非必須)

```

[www@node4 ~]$ cat /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.19.139 node1

10.10.21.131 node2

10.10.23.147 node3

192.168.19.140 node4

192.168.19.141 node5

```

###創建免密登錄用戶

這裡因為本人設置的這幾臺虛擬機中root的密鑰要一致,所以是直接copy了系統中root用戶的密鑰來實現的,如果你想創建用戶只是使用改用戶在創建密鑰也行

**直接copy密鑰對方法,三臺主機上都要運行**

```

useradd www

mkdir /home/www/.ssh

cp ~/.ssh/authorized_keys /home/www/.ssh

cp ~/.ssh/id_rsa /home/www/.ssh

chown -R www.www /home/www/.ssh

chmod 0770 /home/www/.ssh

chmod 0600 /home/www/.ssh/*

```

**自行創建密鑰對思路**

```

#創建密鑰,一路回車就行,具體用法自行man

su - www

ssh-keygen

#將密鑰copy到需要的主機上, -i 後面跟公鑰文件

ssh-copy-id [-i [identity_file]] [user@]machine

```

###walle機器安裝LNMP

**卸載系統自帶應用**

```

rpm -qa | grep php

rpm -qa | grep mysql

rpm -e --nodeps php-common-5.3.3-26.el6.x86_64

rpm -e --nodeps php-pdo-5.3.3-26.el6.x86_64

rpm -e --nodeps php-cli-5.3.3-26.el6.x86_64

rpm -e --nodeps php-xml-5.3.3-26.el6.x86_64

rpm -e --nodeps php-pear-1.9.4-4.el6.noarch

rpm -e --nodeps php-gd-5.3.3-26.el6.x86_64

rpm -e --nodeps php-5.3.3-26.el6.x86_64

rpm -e --nodeps mysql-5.1.71-1.el6.x86_64

rpm -e --nodeps mysql-connector-odbc-5.1.5r1144-7.el6.x86_64

rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86_64}

#清除了檢查一下,確保清除乾淨

[root@node1 ~]# rpm -qa | grep php

[root@node1 ~]# rpm -qa | grep mysql

[root@node1 ~]#

```

**下載源碼包並解壓**

由於有的源碼包鏈接會隨時間推移而失效,這裡就不放鏈接了,自行查找安裝下載吧

```

[root@node1 ~]# cd /usr/local/src/

[root@node1 src]# ls

mysql-5.6.35.tar.gz php-5.6.30.tar.gz nginx-1.12.2

nginx-1.12.2.tar.gz walle-web-v1.x-master.zip

```

```

tar -zxf mysql-5.6.35.tar.gz

tar -zxf nginx-1.12.1.tar.gz

tar -zxf php-5.6.30.tar.gz

```

**安裝依賴環境**

這裡給出的本人系統上安裝時需要用到的,因為系統初始化安裝中存在差異如果在源碼編譯安裝報錯是請自行安裝對應的依賴包

```

yum -y groupinstall Development tools

yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio libaio-devel perl-Data-Dumper net-tools

yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel libxml2* libmysql*

```

**安裝mysql5.6**

源碼包默認下載位置在`/usr/local/scr`路徑下,也是默認操作目錄,這裡為了減少篇幅,就不把命令執行過程意義列出了,如果編譯出現報錯可以複製報錯信息去百度一下,排錯也是一種能力體現.

```

cd /usr/local/src

useradd -s /sbin/nologin mysql

mkdir -p /data/mysql

chown -R mysql.mysql /data/mysql

mkdir -p /var/lib/mysql

chown -R mysql.mysql /var/lib/mysql

mv mysql-5.6.35 /usr/local/mysql

cd /usr/local/mysql

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc

/-DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1

/-DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock

/-DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1

/-DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

```

很多地方編譯mysql5.6都沒有寫`make install`就執行初始化了,這樣會導致報錯,這裡單獨拿出來說明一下

```

//沒有make install後面的初始化會報錯

make install

```

**初始化mysql**

初始化mysql並複製配置文件

```

chmod 755 ./scripts/mysql_install_db

./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

cp support-files/my-default.cnf /etc/my.cnf

cp support-files/mysql.server /etc/init.d/mysql.server

chmod 755 /etc/init.d/mysql.server

```

修改`/etc/my.cnf`文件

```

//修改mysql配置,可以不改,cmake編譯已經定義默認值了,但是要與啟動腳本定義的參數一致,否則啟動失敗

vim /etc/my.cnf

datadir = /data/mysql

socket = /var/lib/mysql/mysql.sock

pid-file=/data/mysqld/mysqld.pid

//這裡要看cmake時的默認sock文件路徑,也可以指定pid文件(記得改用戶和用戶組)

```

**啟動並初始化mysql**

沒有進行初始化mysql後面會報錯的

```

/etc/init.d/mysql.server start

/usr/local/mysql/bin/mysql_secure_installation

```

###php5.6安裝

**進入目錄編譯安裝**

如下的編譯選項基本都是必須的選項,編譯報錯就百度吧

```

cd /usr/local/src/php-5.6.30

./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/var/lib/mysql --with-openssl --with-zlib --enable-sockets -enable-mbstring=all

make && make install

```

添加環境變量或添加軟連只要系統能識別到php相關命令就OK

```

ln -s /usr/local/php-fpm/bin/php /usr/local/bin/php

echo "export PATH=/usr/local/php-fpm/bin:$PATH" >> /etc/profile

```

**複製啟動腳本及配置文件**

```

cp php.ini-production /usr/local/php-fpm/etc/php.ini

cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

chmod 755 /etc/init.d/php-fpm

```

**修改配置文件***

這裡php使用tcp/ip方式與nginx通訊的,如果想用sockect方式自行百度哈

子需要修改運行用戶,用戶組及listend的ip端口就好

```

vim /usr/local/php-fpm/etc/php-fpm.conf

user = www

group = www

listen = 127.0.0.1:9000

```

**加入開機啟動**

```

/usr/local/php-fpm/sbin/php-fpm -t

chkconfig --add php-fpm

chkconfig php-fpm on

service php-fpm start

```

###nginx安裝

**進入目錄編譯安裝**

還是老樣子,報錯找度娘

```

cd /usr/local/src/nginx-1.12.2/

./configure --prefix=/usr/local/nginx --user=www --group=www

make && make install

```

**添加啟動腳本**

`vim /etc/init.d/nginx`

```

#!/bin/bash

# chkconfig: - 30 21

# description: http service.

# Source Function Library

. /etc/init.d/functions

# Nginx Settings

NGINX_SBIN="/usr/local/nginx/sbin/nginx"

NGINX_CONF="/usr/local/nginx/conf/nginx.conf"

NGINX_PID="/usr/local/nginx/logs/nginx.pid"

RETVAL=0

prog="Nginx"

start()

{

echo -n $"Starting $prog: "

mkdir -p /dev/shm/nginx_temp

daemon $NGINX_SBIN -c $NGINX_CONF

RETVAL=$?

echo

return $RETVAL

}

stop()

{

echo -n $"Stopping $prog: "

killproc -p $NGINX_PID $NGINX_SBIN -TERM

rm -rf /dev/shm/nginx_temp

RETVAL=$?

echo

return $RETVAL

}

reload()

{

echo -n $"Reloading $prog: "

killproc -p $NGINX_PID $NGINX_SBIN -HUP

RETVAL=$?

echo

return $RETVAL

}

restart()

{

stop

start

}

configtest()

{

$NGINX_SBIN -c $NGINX_CONF -t

return 0

}

case "$1" in

start)

start

;;

stop)

stop

;;

reload)

reload

;;

restart)

restart

;;

configtest)

configtest

;;

*)

echo $"Usage: $0 {start|stop|reload|restart|configtest}"

RETVAL=1

esac

exit $RETVAL

```

**加入開機自啟**

```

chown -R www.www /usr/local/nginx/

chmod 755 /etc/init.d/nginx

chkconfig --add nginx

chkconfig nginx on

```

**修改配置文件**

`vim /usr/local/nginx/conf/nginx.conf` 這裡只給出修改部分,自行對照修改

```

user www www;

server

{

listen 80;

server_name localhost;

index index.html index.htm index.php;

root /usr/local/nginx/html;

location ~ \\.php$

{

include fastcgi_params;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

}

```

**檢查配置文件並啟動服務**

```

/usr/local/nginx/sbin/nginx -t

service nginx start

```

到這裡基礎環境算是搭建好了,現在才是walle安裝的開始啊

###安裝walle

因為這裡使用git工具直接拉取的代碼,所以需要安裝git工具,不安裝就自行下載解壓吧

**創建目錄並拉取應用**

```

mkdir -p /data/www/walle && cd /data/www/walle

chown -R www.www /data/www

yum -y install git

git clone https://github.com/meolu/walle-web-v1.x.git

```

自行使用剛才初始化MySQL的root用戶登錄

```

#這是本人初始化MySQL設置的,請自行替換

/usr/local/mysql/bin/mysql -uroot -p123456

create database walle charset=utf8mb4 collate utf8mb4_unicode_ci;

grant all privileges on walle.* to 'walleuser'@'%' identified by 'wallepass';

flush privileges;

```

**修改walle的配置文件**

`vim /data/www/walle/walle-web-v1.x-master/config/local.php`

要修改的內容與數據庫創建的內容要一致,如下給出修改的部分

```

'components' => [

'db' => [

'dsn' => isset($_ENV['WALLE_DB_DSN']) ? $_ENV['WALLE_DB_DSN'] : 'mysql:host=127.0.0.1;dbname=walle',

'username' => isset($_ENV['WALLE_DB_USER']) ? $_ENV['WALLE_DB_USER'] : 'walleuser',

'password' => isset($_ENV['WALLE_DB_PASS']) ? $_ENV['WALLE_DB_PASS'] : 'wallepass',

],

'ma

```

**下載安裝composer**

這裡php使用絕對路徑,防止系統找不到php命令

```

cd /data/www/walle/walle-web-v1.x/

curl -sS https://getcomposer.org/installer | /usr/local/php-fpm/bin/php

```

如果系統沒有做php到軟連或環境變量修改,這裡安裝會報錯,出現如下圖所示證明安裝成功了.

```

ln -s /usr/local/php-fpm/bin/php /usr/local/bin/php

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

composer install --prefer-dist --no-dev --optimize-autoloader -vvvv

```

![composer安裝.jpg](https://upload-images.jianshu.io/upload_images/6064401-59d4937019193c87.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**初始化walle**

```

cd /data/www/walle-web/walle-web

./yii walle/setup # 需要輸入yes

```

![walle初始化.jpg](https://upload-images.jianshu.io/upload_images/6064401-1c6087bbaaa91867.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![walle安裝成功.jpg](https://upload-images.jianshu.io/upload_images/6064401-36a93cc02c9d872e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**修改nginx配置**

`vim /usr/local/nginx/conf/nginx.conf` 需要修改的內容如下:

```

server {

listen 80;

server_name 192.168.0.102; # 改你的host,可以是localhosts

root /data/www/walle-web/walle-web/web; # 根目錄為walle的web

index index.php;

location / { #這個要配置,會報404

try_files $uri $uri/ /index.php$is_args$args;

}

location ~ \\.php$ {

try_files $uri = 404;

fastcgi_pass 127.0.0.1:9000; #看php是否是sock模式

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

```

**重啟nginx和php服務**

```

/etc/init.d/php-fpm restart

/etc/init.d/nginx restart

```

**訪問walle網頁**

```

http://ip

用戶密碼都是admin

```

到這裡walle就算安裝成功了,接下來就可以實行walle的部署了,

###walle線上部署

**前提**

測試一下www用戶是否能3臺主機之間免密登錄

```

[www@node1 ~]$ ssh www@node5

Last login: Thu Dec 13 22:27:01 2018 from node4

[www@node5 ~]$ ssh www@node4

Last login: Sun Nov 25 04:55:57 2018 from node5

[www@node4 ~]$ ssh www@node1

The authenticity of host 'node1 (192.168.19.139)' can't be established.

RSA key fingerprint is 45:0b:1c:48:30:28:ef:e9:fd:1a:14:ee:d2:91:eb:3d.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'node1' (RSA) to the list of known hosts.

Last login: Fri Nov 23 07:48:42 2018 from node5

[www@node1 ~]$

```

www用戶配置sudo功能,為了保證線上部署任務能正常運行

使用`visudo`命令添加如下信息

```

visudo

www ALL=(ALL) NOPASSWD: ALL

```

www用戶能密碼拉取gitlab數據,gitlab添加如下:

登錄gitlab --> 點擊頭像 --> settings --> SSH keys 進行添加

- 添加成功了可以上線上機器上(node5)測試是否可以密碼拉取數據庫

```

su - www

mkdir /tmp/test

cd /tmp/test

git su - www

mkdir /tmp/test

cd /tmp/test

git clone [email protected]:test/testgroup.git

```

測試成功

```

[www@node5 test]$ git clone [email protected]:test/testgroup.git

Initialized empty Git repository in /tmp/test/testgroup/.git/

remote: Enumerating objects: 9, done.

remote: Counting objects: 100% (9/9), done.

remote: Compressing objects: 100% (5/5), done.

Receiving objects: 100% (9/9), done.

remote: Total 9 (delta 1), reused 0 (delta 0)

Resolving deltas: 100% (1/1), done.

[www@node5 test]$ ls testgroup/

index.html README.md

```

- 測試模擬線上機器要安裝nginx或httpd服務,這裡就不列舉出來了,實在不會直接yum吧

```

yum -y install nginx

#修改運行用戶

vim /etc/nginx/nginx.conf

user www;

#網頁root目錄設置用戶

chown -R www.www /usr/share/nginx

#配置walle部署倉庫,下面用到的

mkdir -p /usr/local/nginx/html

chown -R www.www /usr/local/nginx/html

service nginx restart

#刪除最終代碼部署目錄,往下有解釋

rm -rf /usr/share/nginx/html

```

**登錄walle網頁**

直接輸入http://ip進行訪問

用戶密碼都是: admin

![walle登錄界面.jpg](https://upload-images.jianshu.io/upload_images/6064401-b5dec8a1c5e96be5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![walle登錄成功界面.jpg](https://upload-images.jianshu.io/upload_images/6064401-383dcfc85d7e56ec.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這個時候就可以點 項目管理 --> 新建項目

![walle新建項目.jpg](https://upload-images.jianshu.io/upload_images/6064401-6c8c721177589ae7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這裡要說明一下這些選項的定義了.

- 項目名字: 自己定義一個

- 測試環境: 測試環境,預發佈環境,線上環境3個選項

- git地址: 項目管理的git地址,需要walle用戶能免密拉取數據

- 代碼檢出倉庫: walle機器代碼檢出倉庫

- 排除文件: 排除倉庫中哪些文件

- 用戶: 部署的用戶,需要有sudo功能,這裡是www用戶

- webroot: 代碼最終部署的目錄,即目標機器的root目錄(`/usr/share/nginx/html`),但是目標機器上只創建`/usr/share/nginx`就好,因為walle會自動軟連到html目錄下,這個地方需要注意一下

- 發佈版本庫: 發佈板存放的地方

- 版本保留數: 保留幾個版本.

- 機器列表:目標機器列表

- pre_deploy: 代碼部署之前的工作,有必要是要使用sudo,因為是www用戶運行的

- post_deploy: 代碼檢出後的工作,注意使用sudo

- pre_release: 同步到目標機器之後,可以執行的命令

- post_release: 部署完成之後執行的命令

- post_release_delay: 這個看官網解釋吧,不常用的功能

- 分支/tag上線: 是branch 還是tag

- 是否開啟審核: 開啟審核

- 是否開啟Ansible: 沒裝ansible這裡先不用

- 是否啟用: 開啟啟用

![walle部署示例.jpg](https://upload-images.jianshu.io/upload_images/6064401-14b68c7a9e229e3a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

配置完成之後下來,點擊開啟審核並確定

![walle項目.png](https://upload-images.jianshu.io/upload_images/6064401-e3eba4ea53544928.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這裡就可以點擊剛剛創建好的walle_test項目測試一下了,如下顯示成功了.

![walle項目測試成功.png](https://upload-images.jianshu.io/upload_images/6064401-1bbac56022f6ee20.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

確保項目已經提交到git倉庫之後,這回就可以部署應用了.

點擊 我的上線單 --> 創建上線單

![walle新建上線單.png](https://upload-images.jianshu.io/upload_images/6064401-ff658007563dcf7b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

然後點擊 walle_test這個項目

![walle編輯上線單.png](https://upload-images.jianshu.io/upload_images/6064401-89a64f8846bb9a04.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

填寫上線單名稱,

- 版本選取: 這裡就一個版本,有多個可以選擇

- 全量/增量: 全部部署還是指定部署

然後點 提交

![walle審核.png](https://upload-images.jianshu.io/upload_images/6064401-0b236f06d06a1bae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

因為這裡是實驗環境,自己給自己審核了

審核完畢就可以點擊上線了

![walle部署上線.png](https://upload-images.jianshu.io/upload_images/6064401-214740a5e666e7a9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

等進度條走完就可以部署完成了,如果一直卡在這裡不動說明配置不對出問題了,而且這個錯誤是在檢測的時候無法檢測出來的,主要的一個坑點是: 目標的部署目錄在walle裡面要寫全文件路徑,而目標機器中只要創建部署目錄的父目錄並確保有對應權限就行了.

典型的錯誤如下:

![權限不對的報錯.jpg](https://upload-images.jianshu.io/upload_images/6064401-be399450510e4eb4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這是因為目標機器上的www用戶沒有權限去執行操作,改成root用戶去執行就OK 了.

![目標機器指定的用戶.jpg](https://upload-images.jianshu.io/upload_images/6064401-4a5212f6ad05d8e7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這個地方改成root就可以了,

![walle部署成功.png](https://upload-images.jianshu.io/upload_images/6064401-22f1e6b5de86bf3a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

看到這裡就能成功啦.可以到目標機器上去看看.

![目標機器部署成功.png](https://upload-images.jianshu.io/upload_images/6064401-ad0beaede93bde59.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這個就是部署上線了,我們可以多次發佈,如果發現某次發佈有問題可以進行項目的回滾.

![新建2次提交單.jpg](https://upload-images.jianshu.io/upload_images/6064401-9cc265306cc4f50a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

新建一個上線單,然後和上面部署步奏一樣,審核並上線.

![2次發佈.jpg](https://upload-images.jianshu.io/upload_images/6064401-a48056cfcfcb7498.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

二次發佈中目標機器發現有問題,則可以立即回滾回來

![發佈回滾.jpg](https://upload-images.jianshu.io/upload_images/6064401-53e6f6dd79620c5c.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這裡可以點擊walle_test_3.0這個上線單點擊回滾

![回滾審核.jpg](https://upload-images.jianshu.io/upload_images/6064401-e0cdc068b021d144.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

然後回滾發佈點擊上線

![回滾成功.jpg](https://upload-images.jianshu.io/upload_images/6064401-aaaef5fb6adbd7c9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

去目標機器查看是否回滾成功

![目標回滾成功啦.jpg](https://upload-images.jianshu.io/upload_images/6064401-a54d9df16a5ef422.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這樣就全部完成啦!


分享到:


相關文章: