談到到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
a.備份git
確保/var/opt/gitlab/backups 目錄存在而且gitlab有權限寫入文件web
gitlab-rake gitlab:backup:create
b.還原docker
將備份文件拷貝到/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類型:
a.GitLab-Runner能夠分類兩種類型:Shared Runner(共享型)和Specific Runner(指定型)。
b.Shared Runner:這種Runner(工人)是全部工程都可以用的。只有系統管理員可以建立Shared Runner。
c.Specific Runner:這種Runner(工人)只能爲指定的工程服務。擁有該工程訪問權限的人都可以爲該工程建立Shared Runner。shell
根據上圖能夠看出,gitlab-runner能夠安裝到最終項目部署當服務器上,一個服務器能夠部署多個runner,也能夠單獨一臺服務器專用與common-runner來負責多個項目當部署。數據庫
Pipeline至關於一次總體的構建任務,其中包含有多個流程步驟(Stages),例如檢測進程,清理環境,安裝依賴,測試,編譯,部署到dev/prod環境,進程檢查等,能夠對比jenkins構建工做流來理解。任何提交代碼或者 Merge Request 的合併均可以觸發 一條Pipeline。apache
Stages爲一條Pipeline的基本構成步驟,一條pipeline的全部stages構成來一條完整的CI/CD工做流。
Stages特徵:
a.順序執行,第一個stage執行完畢,第二個stage開始
b.stage串行執行,前面的一個stage執行失敗,後面的全部stage不會執行
c.全部的stage執行都成功,該pipeline任務爲成功。vim
Jobs爲單個stage中的具體執行工做
Jobs特徵:
a.同一個stage的jobs會並行執行
b.同一個stage中的全部jobs都執行成功,該stage爲成功
c.一個stage中的任意一個jobs執行失敗,該stage爲失敗,該stage所在的pipline執行失敗
可參考:https://www.imooc.com/article/276994
在部署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: 從新啓動配置中的全部程序 ...
把myproject 換成all 能夠管理配置中的全部進程
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 | 項目部署服務器 |
根據上圖,咱們能夠清晰當看清楚兩種部署模式,多個項目公用一個gitlab-runner,和將gitlab-runner部署到目標服務器上。因爲存在多個項目,方便後期多項目管理,本次咱們利用到爲公用gitlab-runner。
[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
記錄註冊url和token
# gitlab runner註冊到平臺 sudo gitlab-ci-multi-runner register
此處咱們選擇的爲單機shell執行,若是爲docker能夠選擇docker,註冊完成後能夠返回gitlab web管理界面查看已經註冊的runner。
也能夠對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
在此咱們部署服務分爲五個步驟
項目中到配置指標和變量能夠參考:https://docs.gitlab.com/ee/ci/yaml/README.html
charts直觀的展現來構建到成功及失敗圖表。
至此一個完整到Gitlab runner就配置完成。