程序员必知:学习Walle(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 程序员必知:学习Walle(一)

一、概述

Walle 一个web部署系统工具,配置简单、功能完善、界面流畅、开箱即用!支持git、svn版本管理,支持各种web代码发布,PHP,Python,JAVA等代码的发布、回滚,可以通过web来一键完成。

功能列表:

用户分身份注册、登录

开发者发起上线任务申请、部署

管理者审核上线任务

支持多项目部署

支持多项目多任务并行

快速回滚

项目的用户权限管理

部署前准备任务pre-deploy(前置检查)

代码检出后处理任务post-deploy(如vendor)

同步后更新软链前置任务pre-release

发布完毕后收尾任务post-release(如重启)

执行sql构建(不要担心忘记测试环境sql同步)

线上文件指纹确认

支持git、svn版本管理

二、原理

宿主机、目标机群、操作用户关系如下图所示,宿主机(walle所在的机器),是一个中间机器,是代码托管与远程目//代码效果参考:http://www.zidongmutanji.com/zsjx/357471.html

标机群的纽带。所以宿主机需要与代码托管(github/gitlab)和远程目标机群都建立ssh-key信任。

上线流程图:

三、安装

环境说明:

主机名 ip地址 部署 系统

linux-node1 192.168.56.11 walle、LNMP Centos 7.4 x86_64

linux-node2 192.168.56.12 LNMP Centos 7.4 x86_64

walle依赖于LAMP或者LNMP环境,在数据库中创建walle库:

create database walle;

grant all privileges on walle. to walle@'%' identified by '123456';

1.代码检出

【root@linux-node1 ~】# mkdir -p /data/www/walle-web cd /data/www/walle-web # 新建目录

【root@linux-node1 ~】# git clone git@github.com/meolu/walle-web.git . # 代码检出

2.设置mysql连接

【root@linux-node1 walle-web】# vim config/local.php

'db' => 【

'dsn' => 'mysql:host=127.0.0.1;dbname=walle', # 新建数据库walle

'username' => 'walle', # 连接的用户名

'password' => '123456', # 连接的密码

】,

3.安装composer

【root@linux-node1 ~】# curl -sS | php

【root@linux-node1 ~】# mv composer.phar /usr/local/bin/composer # PATH目录

4.安装vendor

【root@linux-node1 www】# cd walle-web

【root@linux-node1 walle-web】# composer install --prefer-dist --no-dev --optimize-autoloader -vvvv

5.初始化项目

【root@linux-node1 walle-web】# ./yii walle/setup # 需要你的yes

6.配置nginx

【root@linux-node1 www】# vim /usr/local/nginx/conf/vhost/walle.conf

server {

listen 82;

server_name 192.168.56.11; # 改你的host

root /data/www/walle-web/web; # 根目录为web

index index.php;

# 建议放内网

# allow 192.168.0.0/24;

# deny all;

location / {

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

}

location ~ .php$ {

try_files $uri = 404;

fastcgi_pass 127.0.0.1:9000;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

默认用户名密码:Admin admin

四、配置项目

1、基本要求

宿主机php进程用户www(假如,可通过配置的检测查看或ps aux|grep php)的ssh-key要加入git/gitlab的deploy-keys。此处是www用户的id_rsa.pub,添加到gitlab上的SSH-KEYS

【www@linux-node1 ~】$ cat .ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp/n0aWNws9KlFUTCFk7j1kSMz4mi8RVUl8amYuW/NNuuB9Ee3MRX0ZgJUgRpJDWM/xtHgCxAU9eg+3cTXCED7946aRaCY1ekK+eWfG+FiWzXLzDrUub2lJ071m3Pfsh6ExljwETObxiiSldrrgTStBbknYl/tTiGKM3vlGckVlDO8czUbpsLLot2ayQjQl3yHOhZcZbSkYk18i9MIp91fB3VPFhedyJfUJUouhiWJ4RjkbCdMCTCfBSMIxTNP9OvdjGmbDsG2+4YbfXZjQUJgwm9/oafAlpF1IQBdatnPFEL1QTocm+clt+EvyV2HpOksswx+UTHoJiZXdzuJaPAx www@linux-node1.example.com

宿主机php进程用户www(假如,可通过配置的检测查看或ps aux|grep php)要加入目标机群部署用户www_remote(配置中)ssh-key信任,也就是ssh-keys免秘钥登陆

【www@linux-node1 ~】$ sh-copy-id -i ~/.ssh/id_rsa.pub www@192.168.56.12

【www@linux-node1 ~】$ ssh www@192.168.56.12

Last login: Thu Jan 25 10:30:45 2018 from linux-node1

【www@linux-node2 ~】$

2、配置项目

这里创建三个项目,可以通过检测来测试是否正常:

注意:这里3个项目的宿主机是linux-node1,所以在设置代码检出仓库,统一为一个仓库即可,这里设置为/data/git,所属也为www用户。检测报错,可以通过报错提示进行修改,通常的报错有检测代码目录、远程代码目录所属问题,gitlab的ssh-key认证问题,宿主机和远程主机的ssh信任问题。

3、高级任务配置

高级任务方便用户自定义一些操作,无论是在代码检出前后,还是切换版本前后。

(1)Java配置实例

pre_deploy任务

echo pre_deploy ] /tmp/cmd # 初始化一些东西,自由发挥

post_deploy任务

mvn package -Dmaven.test.skip=true # 编译java

mvn clean # 打扫

mv WEB-INF/config.Properties.test WEB-INF/config.Properties # 切换环境相应的配置

rm -rf src # 甚至删除无用代码

pre_release任务

./xx.sh stop # 暂停服务

post_release任务

./xx.sh start # 启动服务

五、Nginx虚拟主机配置

【root@linux-node2 app】# cd /etc/nginx/conf.d/

【root@linux-node2 conf.d】# ls

jxs.conf wap.conf

【root@linux-node2 conf.d】# cat

server {

listen 80;

server_name

root /data/web/www;

index index.html index.htm;

access_log /var/log/nginx/eshop_access.log main;

location ~ .php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

【root@linux-node2 conf.d】# cat jxs.conf

server {

listen 80;

server_name jxs.123.com;

root /data/web/jxs;

index index.html index.htm;

access_log /var/log/nginx/jxs_access.log main;

location ~ .php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

【root@linux-node2 conf.d】# cat wap.conf

server {

listen 80;

server_name m.123.com;

root /data/web/wap;

index index.html index.htm;

access_log /var/log/nginx/wap_access.log main;

location ~ .php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

View Code

六、上线发布

我的上线单-->创建上线单-->选择项目

提交完成,点击上线后,点击部署即可发布

下面可以看到宿主机linux-node1中的检出代码库的变化:

【root@linux-node1 git】# pwd

/data/git

【root@linux-node1 git】# tree

.

└── test

├── jxs

│?? └── index.html

├── wap

│?? └── index.html

└── www

├── app

│?? ├── 1.txt

│?? └── index.php

├── index.htm

└── index.html

5 directories, 6 files

也可以看到远程目标主机的网站代码目录,都是通过软连接的方式链接到发布版本库中的数据

【www@linux-node2 app】$ cd /data/web/

【www@linux-node2 web】$ ll

total 0

lrwxrwxrwx 1 www www 37 Jan 25 14:40 jxs -> /data/jxs/release/jxs/20180125-144001

lrwxrwxrwx 1 www www 37 Jan 25 14:40 wap -> /data/wap/release/wap/20180125-144026

lrwxrwxrwx 1 www www 37 Jan 26 09:45 www -> /data/www/release/www/20180126-094529

【www@linux-node2 web】$

总结:

walle发布代码实现,walle安装在宿主机上,通过拉取gitlab上的代码,而后通过rsync同步到远程目标主机的代码版本库目录中,远程目标主机同时修改软链接,链接到最新的代码版本,回滚的操作也是通过链接不同的代码版本库中进行实现。

######################################################################

目录

walle 2.0

1、walle原理

1.1、walle原理图

1.2、权限设计模型

2、部署walle

2.1、依赖检查安装

2.2、walle部署

3、Walle使用

3.1、用户配置

3.2、项目配置

3.3、做一次上线流程

3.4、版本的回滚

walle 2.0

walle官方文档

1、walle原理

1.1、walle原理图

walle有2个版本,walle 1.x版本使用PHP语言编写,walle 2.x版本使用python重写,两个版本不相兼容。walle 2.0支持各种web代码发布,如php、java、python、go等代码的发布、回滚,都可以通过web UI一键完成。首先看一张walle的原理图:

从上图可以看到左侧部分是代码托管的仓库,如:git、svn等常用的仓库类型。中间部分为宿主机,宿主机用于部署walle发布平台,是代码托管服务器和线上目标服务器的中间枢纽。所以这里的宿主机,也可以成为常用语中的代码发布服务器。

宿主机既然作为发布服务器,则需要和代码托管(github/gitlab/svn)以及远程的目标服务器建立ssh-key信任。

1.2、权限设计模型

walle 2.x版本的权限角色分为SUPER(超管)、OWNER(所有者)、MASTER(负责人)、DEVELOPER(开发者)、REPORTER(访客)。其操作的资源包括:空间、项目、上线单(任务)、环境、用户等。

Super:walle的管理人员,负责平台运维、开通空间并分配空间给owner

Owner:空间所有者,业务线负责,如大数据,新建项目并分配项目master,增加各方向leader作为空间的master

Master:

具体子方向leader:空间master作为一个部门的具体子方向leader,管理该方向的服务器、项目等。为Owner分担具体事务。

具体项目的leader:项目master作为一个具体项目的leader,辅助Master审核上线单等。

Developer:普通开发者,提交上线单、上线

Reporter:鸡肋角色,不知道用来干嘛

权限码表如下:

权限模型的解释

用户的角色分为两种:space/role、project/role。空间的Master权限是空间级别,项目的Master权限是项目级别

一个空间space下只有一个用户组,由Owner管理,空间下的项目用户权限继承于空间用户组。但也可以单独设定项目的用户角色。

一个用户必须先分配一个空间,方可登录系统。

用户所有操作均在登录空间下,或有多个空间可以切换

2、部署walle

需要注意的环境需求:

Linux + Bash(git、ssh)

意味着不支持win,也不要装在mac,兼容性问题

Python 3.5+ 和 Python 2.7+

MySQL 5.6.5以上,否则会在安装时报错

在MySQL 5.6.5版本之前,Automatic Initialization and Updating只适用于TIMESTAMP,而且一张表中,最多允许一个TIMESTAMP字段采用该特性。从MySQL 5.6.5开始,Automatic Initialization and Updating同时适用于TIMESTAMP和DATETIME,且不限制数量。

将所有目标主机 加入 宿主机(walle安装所在机器)ssh免密登录配置

2.1、依赖检查安装

更换阿里源

cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

wget -O /etc/yum.repos.d/CentOS-Base.repo

wget -P /etc/yum.repos.d/

yum clean all

yum makecache

安装epel源

yum install -y

安装mariaDB

yum install -y mariadb-devel gcc gcc-c++ python-devel

2.2、walle部署

从安全性考虑,建议部署在内网!!!或者做其他的访问控制类型,避免出现安全性隐患问题。

源码下载

【root@localhost ~】# mkdir -pv /data/web/ cd /data/web

【root@localhost web】# git clone #克隆walle 2.x源码

配置Nginx

【root@localhost web】# cd /usr/local/nginx/conf/vhost/

【root@localhost vhost】# cat walle.conf

upstream webservers {

server 192.168.56.11:5000 weight=1; #域名设置,需要配置python的访问端口

}

server {

listen 82;

server_name 192.168.56.11;

index index.php index.html index.htm;

location / {

try_files $uri $uri/ /index.html;

add_header access-control-allow-origin ;

root /data/web/walle-web/fe; # 前端代码已集成到walle-web,即walle-web/fe的绝对路径

}

location ^~ /api/ {

add_header access-control-allow-origin ;

proxy_pass

proxy_set_header X-Forwarded-Host $host:$server_port;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Origin $host:$server_port;

proxy_set_header Referer $host:$server_port;

}

location ^~ /socket.io/ {

add_header access-control-allow-origin ;

proxy_pass

proxy_set_header X-Forwarded-Host $host:$server_port;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Origin $host:$server_port;

proxy_set_header Referer $host:$server_port;

proxy_set_header Host $http_host;

proxy_set_header X-NginX-Proxy true;

# WebScoket Support

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

}

}

安装

【root@localhost vhost】# cd /data/web/walle-web/

【root@localhost walle-web】# sh admin.sh init

# 注意:安装mysqlclient失败,需要先安装libmysqlclient-dev(ubuntu)

# 注意:安装失败请指定python路径. mac 可能会有用anaconda的python,找到自己系统的python 2.7追加参数指定 -p /usr/bin/python2.7 即可

# vi admin.sh +20

# virtualenv --no-site-packages -p /usr/local/bin/python2.7 venv

修改代码中的配置,带@TODO就是可能需要修改的地方

【root@localhost walle-web】# vim walle/config/settings_prod.py

# -- coding: utf-8 --

"""

walle-web

Application configuration.

注意: 带了 @TODO 的地方可能需要你的调整

:copyright: ? 2015-2019 walle-web.io

:created time: 2018-11-24 07:05:35

:author: wushuiyong@walle-web.io

"""

import os

from walle.config.settings import Config

class ProdConfig(Config):

"""Production configuration."""

ENV = 'prod'

DEBUG = False

SQLALCHEMY_ECHO = False

# 服务启动 @TODO

# HOST 修改为与 nginx server_name 一致.

# 后续在web hooks与通知中用到此域名.

HOST = '192.168.56.11'

PORT = 5000

# https True, http False

SSL = False

# 数据库设置 @TODO

SQLALCHEMY_DATABASE_URI = ''

# 本地代码检出路径(用户查询分支, 编译, 打包) #TODO

CODE_BASE = '/tmp/walle/codebase/'

# 日志存储路径 @TODO

# 默认为walle-web项目下logs, 可自定义路径, 需以 / 结尾

# LOG_PATH = '/var/logs/walle/'

LOG_PATH = os.path.join(Config.PROJECT_ROOT, 'logs')

LOG_PATH_ERROR = os.path.join(LOG_PATH, 'error.log')

LOG_PATH_INFO = os.path.join(LOG_PATH, 'info.log')

LOG_FILE_MAX_BYTES = 100 1024 1024

# 邮箱配置 @TODO

MAIL_PORT = 465

MAIL_USE_SSL = True

MAIL_USE_TLS = False

MAIL_DEFAULT_SENDER = 'service@walle-web.io'

MAIL_USERNAME = 'service@walle-web.io'

MAIL_PASSWORD = 'Ki9y3U82'

数据库配置和写入数据

MySQL 5.6.5以上,否则会在安装时报错。在MySQL 5.6.5版本之前,Automatic Initialization and Updating只适用于TIMESTAMP,而且一张表中,最多允许一个TIMESTAMP字段采用该特性。从MySQL 5.6.5开始,Automatic Initialization and Updating同时适用于TIMESTAMP和DATETIME,且不限制数量。

【root@localhost walle-web】# mysql -uroot -p

Enter password:

Welcome

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
缓存 JavaScript 前端开发
因为不熟悉npm基础知识,我被同事笑话了
【10月更文挑战第17天】因为不熟悉npm基础知识,我被同事笑话了
因为不熟悉npm基础知识,我被同事笑话了
|
7月前
|
前端开发 JavaScript API
【独家揭秘】Bottle框架为何能俘获开发者的心?三大实战案例带你领略Web开发新境界!
【8月更文挑战第31天】Bottle是一款轻量级Python Web框架,以简单高效著称,秉持极简设计,适合快速开发小型项目或构建API服务。本文通过具体代码示例展示Bottle框架的独特魅力,从安装到创建应用、路由设置、模板渲染及表单处理等方面进行详细介绍,帮助读者轻松上手并掌握Bottle的应用技巧。
137 1
|
7月前
|
数据库 开发者 数据库管理
【惊艳登场】Bottle框架凭什么成为Web开发新宠儿?一个实战案例告诉你背后的秘密!
【8月更文挑战第31天】Bottle是一个简洁高效的Web框架,适用于构建轻量级应用。本文通过开发一个在线笔记应用,展示了Bottle的核心特性和优势。从环境搭建、路由设置到数据库操作,详细介绍了用户注册、登录、笔记创建及管理等功能的实现过程。通过简洁的语法和灵活的路由机制,Bottle让开发者能快速构建功能完备的应用,提升开发效率。
74 0
|
9月前
|
缓存 中间件 调度
经验大分享:Sinatra源码学习
经验大分享:Sinatra源码学习
49 0
|
Oracle Java 关系型数据库
神级程序员都在用什么工具?
神级程序员都在用什么工具?
147 0
|
10月前
|
JSON 开发者 数据格式
揭秘5.3k⭐开发者的秘密武器:it-tools在线工具集,你不可不知!
揭秘5.3k⭐开发者的秘密武器:it-tools在线工具集,你不可不知!
85 0
|
SQL 前端开发 JavaScript
不可不知的八个出色的Java项目
不可不知的八个出色的Java项目
245 0
|
XML 缓存 JSON
看SpringCloudEureka源码前懂得这些知识事半功倍
看SpringCloudEureka源码前懂得这些知识事半功倍
看SpringCloudEureka源码前懂得这些知识事半功倍
|
移动开发 架构师 前端开发
爆红Github!再来一个小白练手项目,20个项目随你造!
新手上路最开始用的就是基础的 HTML+CSS+JS 三件套,而在框架和库越来越多的现在,更多的时候使用它们来提高效率是常见的选择。