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)

这样就全部完成啦!


分享到:


相關文章: