zoukankan      html  css  js  c++  java
  • Walle实现自动发布

    walle是啥?能干啥?有啥用?这些我都不会去一一道来,如果你还没有明白前面提出的三个问题就不用往下看了,这里这回将walle安装了怎么去使用.如果都要面面俱到不是一两篇博客可以解决的问题,如果希望将walle部署到生产环境中,这篇博客或许能给你点启发,下面给出的网站完全可以解决前面的几个问题了.直接开始吧.

    前期准备

    • 系统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

    初始化walle

    cd /data/www/walle-web/walle-web
    
    ./yii walle/setup # 需要输入yes
    

    walle初始化.jpg

    walle安装成功.jpg
    修改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
    walle登录界面.jpg

    walle登录成功界面.jpg

    这个时候就可以点 项目管理 --> 新建项目
    walle新建项目.jpg

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

    • 项目名字: 自己定义一个
    • 测试环境: 测试环境,预发布环境,线上环境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
      配置完成之后下来,点击开启审核并确定
      walle项目.png

    这里就可以点击刚刚创建好的walle_test项目测试一下了,如下显示成功了.
    walle项目测试成功.png

    确保项目已经提交到git仓库之后,这回就可以部署应用了.
    点击 我的上线单 --> 创建上线单
    walle新建上线单.png

    然后点击 walle_test这个项目

    walle编辑上线单.png
    填写上线单名称,

    • 版本选取: 这里就一个版本,有多个可以选择
    • 全量/增量: 全部部署还是指定部署
      然后点 提交
      walle审核.png

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

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

    典型的错误如下:
    权限不对的报错.jpg

    这是因为目标机器上的www用户没有权限去执行操作,改成root用户去执行就OK 了.
    目标机器指定的用户.jpg
    这个地方改成root就可以了,

    walle部署成功.png
    看到这里就能成功啦.可以到目标机器上去看看.
    目标机器部署成功.png
    这个就是部署上线了,我们可以多次发布,如果发现某次发布有问题可以进行项目的回滚.
    新建2次提交单.jpg
    新建一个上线单,然后和上面部署步奏一样,审核并上线.
    2次发布.jpg
    二次发布中目标机器发现有问题,则可以立即回滚回来
    发布回滚.jpg
    这里可以点击walle_test_3.0这个上线单点击回滚

    回滚审核.jpg
    然后回滚发布点击上线
    回滚成功.jpg
    去目标机器查看是否回滚成功
    目标回滚成功啦.jpg

    这样就全部完成啦!

  • 相关阅读:
    angularjs的$on、$emit、$broadcast
    angularjs中的路由介绍详解 ui-route(转)
    ionic入门教程-ionic路由详解(state、route、resolve)(转)
    Cocos Creator 加载使用protobuf第三方库,因为加载顺序报错
    Cocos Creator 计时器错误 cc.Scheduler: Illegal target which doesn't have uuid or instanceId.
    Cocos Creator 构造函数传参警告 Can not instantiate CCClass 'Test' with arguments.
    Cocos Creator 对象池NodePool
    Cocos Creator 坐标系 (convertToWorldSpaceAR、convertToNodeSpaceAR)
    Cocos Creator 常驻节点addPersistRootNode
    Cocos Creator 配合Tiled地图的使用
  • 原文地址:https://www.cnblogs.com/Bjwf125/p/12781203.html
Copyright © 2011-2022 走看看