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
初始化walle
cd /data/www/walle-web/walle-web
./yii walle/setup # 需要输入yes
修改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 git@192.168.19.140:test/testgroup.git
测试成功
[www@node5 test]$ git clone git@192.168.19.140: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
这个时候就可以点 项目管理 --> 新建项目
这里要说明一下这些选项的定义了.
- 项目名字: 自己定义一个
- 测试环境: 测试环境,预发布环境,线上环境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_test项目测试一下了,如下显示成功了.
确保项目已经提交到git仓库之后,这回就可以部署应用了.
点击 我的上线单 --> 创建上线单
然后点击 walle_test这个项目
填写上线单名称,
- 版本选取: 这里就一个版本,有多个可以选择
- 全量/增量: 全部部署还是指定部署
然后点 提交
因为这里是实验环境,自己给自己审核了
审核完毕就可以点击上线了
等进度条走完就可以部署完成了,如果一直卡在这里不动说明配置不对出问题了,而且这个错误是在检测的时候无法检测出来的,主要的一个坑点是: 目标的部署目录在walle里面要写全文件路径,而目标机器中只要创建部署目录的父目录并确保有对应权限就行了.
典型的错误如下:
这是因为目标机器上的www用户没有权限去执行操作,改成root用户去执行就OK 了.
这个地方改成root就可以了,
看到这里就能成功啦.可以到目标机器上去看看.
这个就是部署上线了,我们可以多次发布,如果发现某次发布有问题可以进行项目的回滚.
新建一个上线单,然后和上面部署步奏一样,审核并上线.
二次发布中目标机器发现有问题,则可以立即回滚回来
这里可以点击walle_test_3.0这个上线单点击回滚
然后回滚发布点击上线
去目标机器查看是否回滚成功
这样就全部完成啦!
来源:51CTO
作者:bjwf125
链接:https://blog.51cto.com/79076431/2473851