在上一节的部署中,把在开发阶段写好的代码手动方式上传提交到我们的服务器进行手动部署。 那后续的我们的服务的更新是不是还要继续的采取手动的方式呐?后续如果是多台服务器需要做负载的话,怎么同步多台服务器的代码和服务的重启呐?
手动的方式,在现代构建服务方式肯定是不行,简单的单纯一两天服务器还好,多的时候,肯定是繁琐,所以才应运而生的运维岗位人员。
那回溯上面的问题,什么是 CI/CD。
CI 的意思是 持续构建 通常主要负责负责拉取代码库中的代码后,执行预设好一些脚本,开始构建相关服务制品 ,并将服务制品推送至到制品库里面。CI层主要的是负责代码构建,和保存制品,保持到我们的仓库。通常相关的工具有:SVN和githug cil等。
CD 的主要是负责 持续部署(Continuous Deployment) 和 持续交付(Continuous Delivery)
supervisor 分服务端和客户端:
PS:supervisor只能管理非后台进行运行的程序,所以可以用 supervisor, 像redis要用supervisor管理的话,则不能配置成进程后台运行,否则管理不了
pip install supervisor
echo_supervisord_conf > /etc/supervisord.conf
vim /etc/supervisord.conf
在后面添加
[program:text]
command=pipenv run gunicorn -w 4 -b 0.0.0.0:5111 main:app ; supervisord将要执行的运行python服务的命令
directory=/data/www/text
stdout_logfile=/data/logs/supervisord/text_supervisord.log ; supervisord当前这个test服务运行产生的日志存储路径,方便我们查看运行情况
socket-timeout=3
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=QUIT
[inet_http_server] ; inet (TCP) server disabled by default
port=192.168.1.6:9002 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server)) 帐号
password=123 ; (default is no password (open server))密码
supervisord
supervisorctl
启动celery:supervisorctl start text
重启celery:supervisorctl restart text
停止celery:supervisorctl stop text
因为后端服务一般我们会多开几个服务进程进行API接口的提供,在使用Supervisor进行进程管理的时候,会经常需要对相关进程进行管理。
所以我们可以把同一个相同的所属的进程组进行归类:
创建对应的需要包含的进程配置文件:
[include]
files = /etc/supervisor/config.d/*.ini
[root@web1 etc]#
示例:
[group:qingtingysjs]
programs=qingting-ysj-11086,qingting-ysj-11087,qingting-ysj-11088
[program:qingting-ysj-11086]
command=/usr/bin/uwsgi /etc/uwsgi/qingting-ysj-11086.ini ; supervisord将要执行的运行python服务的命令
directory=/data/www/qt_ysj_iread_web_server
stdout_logfile=/data/logs/supervisord/qt_ysj_iread_web_server_supervisord.log ; supervisord当前这个test服务运行产生的日志存储路径,方便我们查看运行情况
socket-timeout=3
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=QUIT
[program:qingting-ysj-11087]
command=/usr/bin/uwsgi /etc/uwsgi/qingting-ysj-11087.ini ; supervisord将要执行的运行python服务的命令
directory=/data/www/qt_ysj_iread_web_server
stdout_logfile=/data/logs/supervisord/qt_ysj_iread_web_server_supervisord.log ; supervisord当前这个test服务运行产生的日志存储路径,方便我们查看运行情况
socket-timeout=3
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=QUIT
[program:qingting-ysj-11088]
command=/usr/bin/uwsgi /etc/uwsgi/qingting-ysj-11088.ini ; supervisord将要执行的运行python服务的命令
directory=/data/www/qt_ysj_iread_web_server
stdout_logfile=/data/logs/supervisord/qt_ysj_iread_web_server_supervisord.log ; supervisord当前这个test服务运行产生的日志存储路径,方便我们查看运行情况
socket-timeout=3
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=QUIT
管理命令:
停止组(需要带上冒号):
supervisor> stop qingtingysjs:
也可以具体到某个进程:
supervisor> stop qingtingysjs:qingting-ysj-11086
也可以使用*号:
supervisor> restart qingtingysjs: *
输入安装命令:
yum install -y subversion
查看svn安装的版本:
svnserve --version
1.创建svn管理目录:
mkdir /data/svn
2.进入svn管理目录:
cd /data/svn
3.创建svn项:
svnadmin create test
说明:test是svn当前仓库项的模块名称,每个svn的这个名称都是唯一的,不然可能无法登录使用
4.进入创建仓库
cd test
5.查看具体仓库文件信息,
[root@web-1 test]# ll
total 24
drwxr-xr-x 2 root root 4096 Dec 14 11:53 conf
drwxr-sr-x 6 root root 4096 Nov 15 2017 db
-r--r--r-- 1 root root 2 Jul 26 2017 format
drwxr-xr-x 2 root root 4096 Sep 19 2017 hooks
drwxr-xr-x 2 root root 4096 Jul 26 2017 locks
-rw-r--r-- 1 root root 229 Jul 26 2017 README.txt
6: 进入到conf下,修改/data/svn/test/conf文件夹下的配置文件
[root@web-1 conf]# ll
total 12
-rw-r--r-- 1 root root 1190 Dec 14 11:53 authz
-rw-r--r-- 1 root root 389 Dec 14 11:53 passwd
-rw-r--r-- 1 root root 3082 Dec 12 2016 svnserve.conf
[root@web-1 conf]#
修改authz文件,主要是配置能读取仓库的用户名和相关用户读写权限等
[test:/]
admin = rw
xiaozhong = rw
修改passwd文件,主要是配置用户名对应的用户密码,因为我们的服务仓库的时候 需要用户名和密码才能连接我们的SVN仓库 将password文件替换成下面内容:(用户名=密码)
[users]
admin = 123456
xiaozhong = 123456
修改svnserve.conf 配置仓库的验证认证信息
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
7.在/data/svn/test/hooks/目录下创建post-commit勾子文件(post-commit文件没有扩展名),用于svn更新成功以后,执行相关同步脚本命令,自动同步到对应的代码目录
touch post-commit
编写相关的命令脚本:
写入执行的命令
--------------
#!/bin/sh
export.UTF-8
/usr/bin/svn up /data/www/test
/usr/bin/supervisorctl restart test
说明: 【1】/usr/bin/svn up/data/www/test 这个命令是运行更新指令,本地代码通过svn更新到服务器以后,勾子会运行它来同步到指定的/data/www/test目录
【2】/usr/bin/supervisorctlrestart test 因为我们用的是supervisord来管理pythonweb服务的,代码更新完成以后并未生效,需要重新服务才行,这个命令是用来重启指定的supervisord进程的,它们帮我们将对应的uwsgi进程进行重启操作
8.给想换个勾子post-commit文件相关的可执行权限:
chmod +x /data/svn/test/hooks/post-commit
9.(服务我们的SVN服务没有启动的话,已启动可跳过)启动svn服务:/usr/bin/svnserve -d -r /data/svn
ps:其中 -d 表示守护进程, -r 表示在后台执行 /data/svn 为仓库存放的目录
附带相关服务关停
查看相关启动的之后的进程情况
ps -ef|grep svnserve
root 4967 1 0 Aug23 ? 00:00:00 svnserve -d -r repository/
这里 kill -9 4967杀死进程,此4967为进程号
SVN的关闭和重启:
killall svnserve //停止
或kill -9 进程id
[root@localhost password]# /usr/bin/svnserve -d -r /data/svn // 启动
10.配置test项目服务器端svn同步设置(钩子函数中我们的同步到本地的是)
/usr/bin/svn up /data/www/test
可以先在本地进行检出一次,查看情况
重新检出的时候出现的提示信息
[root@localhost test]# svn checkout svn://localhost/test /data/www/test
已跳过 '/data/www/test/main.py' --节点处于冲突状态
取出版本 7。
[root@localhost test]# svnrevert /data/www/test/main.py
已恢复“/data/www/test/main.py”
[root@localhost test]#
svn checkout svn://localhost/xxxx /data/www/xxxxx
先删除上次上传的测试的文件,避免出现冲突------
输入命令:svn checkout svn://localhost/test /data/www/test (在服务器端对test项进行svn检出操作)
可能存在的问题:
11 .本地开发环境下,线上代码仓库的检出,用于本地开发和线上仓库的对比。
Windows下安装TortoiseSVN-1.7.3.22386-win32-svn-1.7.2
安装完成后,链接SVN仓库进行代码检出
客户端本地的checkout
12 .对于版本更新,可以使用对比工具进行对比后,进行提交更新
纯属个人实践中相关经验之谈,如有纰漏,还希望大佬们多多提点!
小钟同学 | 文 【原创】| QQ:308711822
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。