谈到到CI/CD,咱们不由会想到Gitlab + Jenkins + Docker等一些列优秀的工具,Jenkins以其丰富的插件及灵活配置已经很是好的知足咱们平常工做中的CI/CD需求,一般的作法为Gitlab配置webhook,开发人员经过push代码或merge request能够触发执行一些列的测试部署上线工做,打通了开发到部署到整个生命周期,完成持续集成持续构建。 在Gitlab 也是具备一套CI/CD到框架,经过简单的注册Gitlab Runner,根据业务测试部署需求撰写 .gitlab-ci.yml文件,便可轻松的实现CI/CD,无需多余的工具介入,方便快捷。 本文对记录下利用Gitlab pipeline+supervisor来实战部署Python对tornado项目。html
Gitlab为一套开源代码仓库管理系统,有CE(社区版)和EE(企业版),相较与共有的代码管理平台Githab,Gitlab经常使用与私有化部署在企业内网,方便对代码仓库及人员的分组及权限管控,轻松方便管理团队开发流程及多人合做开发规范,经过注册Runner,编写.gitlab-ci.yml实现快速项目CI/CD。python
cat > /etc/yum.repos.d/gitlab-ce.repo <<EOF
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el\$releasever/
gpgcheck=0
enabled=1
EOF
复制代码
yum clean all && yum makecache
sudo yum install gitlab-ce #自动安装最新版
sudo yum install gitlab-ce-x.x.x #安装指定版本
复制代码
1.修改gitlab配置文件指定为安装gitlab服务器ip和自定义端口: vim /etc/gitlab/gitlab.r
2.重置并启动GitLab
执行:
gitlab-ctl reconfigure
gitlab-ctl restart
初始帐户: root 密码: 5iveL!fe
自定义密码:
gitlab-rails console production #开始初始化密码
u=User.where(id:1).first 来查找与切换帐号(User.all 能够查看全部用户)
u.password=12345678 设置密码
u.password_confirmation=12345678
u.save!
exit
复制代码
更改仓库存储位置 默认时GitLab的仓库存储位置在“/var/opt/gitlab/git-data/repositories”,在实际生产环境中咱们会新建数据盘,将重要数据存储在单独的数据盘分区中,我这里规划把数据存放在“/data/gitlabdata”目录下。ios
mkdir -pv /data/gitlabdata
vim /etc/gitlab/gitlab.rb
git_data_dirs({ "default" => { "path" => "/data/gitlabdata" } })
1 在没有数据的状况下
[root@gitlab ~]# gitlab-ctl stop
[root@gitlab ~]# gitlab-ctl reconfigure //使修改生效
2.若是 /var/opt/gitlab/git-data 目录已经存在Git仓库数据, 你能够用下面的命令把数据迁移到新的位置:
# 准备迁移以前要中止GitLab服务,防止用户写入数据。
[root@gitlab ~]# gitlab-ctl stop
# 注意 'repositories'后面不带斜杠,而
# '/home/gitlab-data'后面是有斜杠的。
[root@gitlab ~]# rsync -av /var/opt/gitlab/git-data/repositories /data/gitlabdata/
# 若是须要修复权限设置,
# 可运行下面的命令进行修复。
[root@gitlab ~]# gitlab-ctl reconfigure
# 再次检查下 /data/gitlabdata 的目录. 正常状况应该有下面这个子目录:
# repositories
复制代码
确保/var/opt/gitlab/backups 目录存在而且gitlab有权限写入文件git
gitlab-rake gitlab:backup:create
复制代码
将备份文件拷贝到/var/opt/gitlab/backups下
中止相关数据链接服务
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
1. 制定时间戳恢复
从备份恢复
从指定时间戳的备份恢复(backups目录下有多个备份文件时):
sudo gitlab-rake gitlab:backup:restore BACKUP=1500809139
2.从默认备份恢复(backups目录下只有一个备份文件时):
sudo gitlab-rake gitlab:backup:restore
启动Gitlab
sudo gitlab-ctl start
sudo gitlab-ctl reconfigure
修改默认备份目录【可选】
你也能够经过修改/etc/gitlab/gitlab.rb来修改默认存放备份文件的目录:
gitlab_rails['backup_path'] = '/data/gitlabbackup'
/data/gitlabbackup修改成你想存放备份的目录便可, 修改完成以后使用gitlab-ctl reconfigure命令重载配置文件便可
可配合定时任务或上传到对象存储,实现异地代码备份。
复制代码
Gitlab ci/cd是由独立的runner程序完成,runner采用go语言编写,所以能够很好的进行跨平台,一般能够将runner部署到任何gitlab server以外的服务器,从而避免对gitlab server的影响,gitlab runner至关于一个agent安装在目标服务器,或这多个项目公用一个runner,runner服务器单独来执行构建任务。 runner类型:web
根据上图能够看出,gitlab-runner能够安装到最终项目部署当服务器上,一个服务器能够部署多个runner,也能够单独一台服务器专用与common-runner来负责多个项目当部署。docker
Pipeline至关于一次总体的构建任务,其中包含有多个流程步骤(Stages),例如检测进程,清理环境,安装依赖,测试,编译,部署到dev/prod环境,进程检查等,能够对比jenkins构建工做流来理解。任何提交代码或者 Merge Request 的合并均可以触发 一条Pipeline。shell
Stages为一条Pipeline的基本构成步骤,一条pipeline的全部stages构成来一条完整的CI/CD工做流。 Stages特征:数据库
Jobs为单个stage中的具体执行工做 Jobs特征:apache
可参考:www.imooc.com/article/276…vim
在部署Python项目中,启动Django项目或Tornado项目,若是将进程放在前台或是利用nohup &放在后台,gitlab pipeline没法进行退出,能够经过编写脚本部署,可是耗时耗力且须要作单独对进程监控,不便于咱们管理维护,所以利用Superviosr来实现对部署项目start/stop/restart/reload服务管理,经过fork/exec的方式把这些被管理的进程,当supervisor的子进程来启动,完美解决来项目部署对难题。
Superviosr为用Python语言开发对一套通用进程管理系统,可利用pip或yum进行安装,其能将一个普通对命令行进程变为daemon,并监控其进程状态,可经过配置若是监控进程异常退出则自动对其进行重启,同时也拥有web管理界面方便管理查看。
yum install supervisor # 安装
安装完成后配置文件会在/etc/supervisord.conf,对此可自行修改
[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ;socket文件的mode,默认是0700
;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid
;[inet_http_server] ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,若是开放到公网,须要注意安全性
;username=user ;登陆管理后台的用户名
;password=123 ;登陆管理后台的密码
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,若是设成0,表示不限制大小
logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024 ;能够打开的文件描述符的最小值,默认 1024
minprocs=200 ;能够打开的进程数的最小值,默认 200
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;经过UNIX socket链接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 经过HTTP的方式链接supervisord
; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪一个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,须要注意当指定目录不存在时没法正常启动,因此须要手动建立目录(supervisord 会自动建立日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
;包含其它配置文件
[include]
files = supervisord.d/*.conf ;能够指定一个或多个以.conf结束的配置文件
复制代码
一般咱们修改include
中的扩展名为.conf来在其下目录中配置为们自定义的项目。 在supervisord.d中配置咱们对具体项目,例如:
[program:myproject]
command=/data/miniconda3/envs/go2cloud_api_env/bin/python /project/myproject/server.py 8011
user=root
stdout_logfile=/project/go2cloud_api/run.log
autostart=true
autorestart=true
startsecs=60
stopasgroup=true
ikillasgroup=true
startretries=1
redirect_stderr=true
复制代码
supervisord -c /etc/supervisord.conf
复制代码
supervisorctl 是 supervisord的命令行客户端工具
supervisorctl status:查看全部进程的状态
supervisorctl stop myproject:中止es
supervisorctl start myproject:启动myproject
supervisorctl restart myproject: 重启myproject
supervisorctl update :配置文件修改后可使用该命令加载新的配置
supervisorctl reload: 从新启动配置中的全部程序
...
复制代码
注意事项
supervisor不能监控后台进程,command 不能为后台运行命令。
名称 | IP | 软件 | 备注 |
---|---|---|---|
gitlab-server | 10.57.61.138 | gitlab-server | Gitlab 服务器 |
gitlab-common-runner | 10.57.61.11 | gitlab-runner | 公用runner服务器 |
Des-server | 172.21.0.10 | miniconda/supervisor | 项目部署服务器 |
[program:go2cloud_platform]
command=/data/miniconda3/envs/go2cloud_platform/bin/python /project/go2cloud_platform/runserver start all
user=root
stdout_logfile=/var/log/go2cloud_platform.log
autostart=true
autorestart=true
startsecs=60
stopasgroup=true
ikillasgroup=true
startretries=1
redirect_stderr=true
复制代码
# 配置yum源
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
# 安装runner
sudo yum install -y gitlab-ci-multi-runner
复制代码
有的项目为开启pipeline,须要手动开启 settings->General->Visibility, project features, permissions->Pipelines 能够配置全部人或此项目到Members能够配置管理Pipeline
settings->CI/CD>Runners
# gitlab runner注册到平台
sudo gitlab-ci-multi-runner register
复制代码
也能够对runner进行配置。
能够勾选Active,runner为公用对时候,暂停Runner不接受新的jobs 若是没有制定tag,能够运行在未指定tag的做业。
stages:
- clean_env # 清理环境及杀死进程
- deploy_src # 部署源码
- install_dependency # 更新依赖
- restart_server # 重启服务
- check_server # 检测服务
variables:
BASE_DIR: "/go2cloud_platform/"
job clean_env_job:
stage: clean_env
script:
- ssh -o stricthostkeychecking=no root@172.16.100.2 pkill supervisord || true
- ssh -o stricthostkeychecking=no root@172.16.100.2 killall /data/miniconda3/bin/python || true
- ssh -o stricthostkeychecking=no root@172.16.100.2 killall /data/miniconda3/envs/go2cloud_platform/bin/python || true
- ssh -o stricthostkeychecking=no root@172.16.100.2 rm -rf /project${BASE_DIR}*
tags:
- 51common-runner
only:
- dev
when: always
job deploy_src_job:
stage: deploy_src
script:
- scp -r /home/gitlab-runner/builds/QFafrHEq/0/devops/${BASE_DIR}* root@172.16.100.2:/project${BASE_DIR}
- ssh -o stricthostkeychecking=no root@172.16.100.2 cp /project/config/config.yml /project${BASE_DIR}
tags:
- 51common-runner
only:
- dev
when: always
job install_dependency_job:
stage: install_dependency
script:
- ssh -o stricthostkeychecking=no root@172.16.100.2 /data/miniconda3/envs/go2cloud_platform/bin/python -m pip install -r /project${BASE_DIR}requirements/requirements.txt
tags:
- 51common-runner
only:
- dev
when: manual
job restart_server_job:
stage: restart_server
script:
- ssh -o stricthostkeychecking=no root@172.16.100.2 sleep 7
- ssh -o stricthostkeychecking=no root@172.16.100.2 supervisord -c /etc/supervisord.conf
- ssh -o stricthostkeychecking=no root@172.16.100.2 ps -ef |grep supervisord |grep -v grep
tags:
- 51common-runner
only:
- dev
when: always
job check_server_job:
stage: check_server
script:
- ssh -o stricthostkeychecking=no root@172.16.100.2 sleep 7
- ssh -o stricthostkeychecking=no root@172.16.100.2 ps -ef|grep "8088"
tags:
- 51common-runner
only:
- dev
when: always
复制代码
在此咱们部署服务分为五个步骤
项目中到配置指标和变量能够参考:docs.gitlab.com/ee/ci/yaml/…