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实现自动发布_第1张图片

初始化walle

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

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

Walle实现自动发布_第2张图片

Walle实现自动发布_第3张图片
修改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实现自动发布_第4张图片

Walle实现自动发布_第5张图片

这个时候就可以点 项目管理 --> 新建项目
Walle实现自动发布_第6张图片

这里要说明一下这些选项的定义了.

  • 项目名字: 自己定义一个
  • 测试环境: 测试环境,预发布环境,线上环境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实现自动发布_第7张图片
    配置完成之后下来,点击开启审核并确定
    Walle实现自动发布_第8张图片

这里就可以点击刚刚创建好的walle_test项目测试一下了,如下显示成功了.
Walle实现自动发布_第9张图片

确保项目已经提交到git仓库之后,这回就可以部署应用了.
点击 我的上线单 --> 创建上线单
Walle实现自动发布_第10张图片

然后点击 walle_test这个项目

Walle实现自动发布_第11张图片
填写上线单名称,

  • 版本选取: 这里就一个版本,有多个可以选择
  • 全量/增量: 全部部署还是指定部署
    然后点 提交
    Walle实现自动发布_第12张图片

因为这里是实验环境,自己给自己审核了

审核完毕就可以点击上线了
Walle实现自动发布_第13张图片
等进度条走完就可以部署完成了,如果一直卡在这里不动说明配置不对出问题了,而且这个错误是在检测的时候无法检测出来的,主要的一个坑点是: 目标的部署目录在walle里面要写全文件路径,而目标机器中只要创建部署目录的父目录并确保有对应权限就行了.

典型的错误如下:
Walle实现自动发布_第14张图片

这是因为目标机器上的www用户没有权限去执行操作,改成root用户去执行就OK 了.
Walle实现自动发布_第15张图片
这个地方改成root就可以了,

Walle实现自动发布_第16张图片
看到这里就能成功啦.可以到目标机器上去看看.
Walle实现自动发布_第17张图片
这个就是部署上线了,我们可以多次发布,如果发现某次发布有问题可以进行项目的回滚.
Walle实现自动发布_第18张图片
新建一个上线单,然后和上面部署步奏一样,审核并上线.
Walle实现自动发布_第19张图片
二次发布中目标机器发现有问题,则可以立即回滚回来
Walle实现自动发布_第20张图片
这里可以点击walle_test_3.0这个上线单点击回滚

Walle实现自动发布_第21张图片
然后回滚发布点击上线
Walle实现自动发布_第22张图片
去目标机器查看是否回滚成功
Walle实现自动发布_第23张图片

这样就全部完成啦!