[Devops] 基于 Gitlab+Jenkins+Ansible+Supervisor实现Go项目自动化部署

GitLab 安装

GitLab 安装方式可以参考官方给出的教程:https://about.gitlab.com/installation/

注:推荐使用 Docker 安装。

GitLab CI/CD

参考:搭建GitLab-CI

GitLab 通知 Jenkins 部署

触发器参考:Gitlab-提交代码触发-Jenkins-部署

Jenkins 安装 GitLab、Ansible 插件

  • 安装插件的路径:系统管理 –> 插件管理

插件信息:

1
2
3
4
* GitLab
This plugin integrates GitLab to Jenkins by faking a GitLab CI Server.
* Ansible plugin
Invoke Ansible Ad-Hoc commands and playbooks.

屏幕快照 2018-09-21 下午4.27.46

Jenkins 创建部署项目

在 Jenkins 页面点击 新建任务 来创建一个需要部署的项目任务。

屏幕快照 2018-09-21 下午4.31.00

配置项目的功能工作路径(workspace)

点击 General 标签中的高级选项,使用自定义的工作空间,填入自定义工作空间路径:/data/go/src/project

源码管理

选择 Git 将 Gitlab 的项目路径和密钥信息填写好,并制定部署的分支信息。

构建触发器

触发器参考:Gitlab-提交代码触发-Jenkins-部署

构建

构建部署只要的作用可以是构建源码的二进制程序,发送到目标服务器,并在目标服务器运行起来程序。构建和运行程序可以直接将 shell 写在Jenkins或写在部署服务器的文件中,然后运行这个文件。或者通过 Ansible 来管理这些文件。

使用 Ansible

增加构建步骤 选择 Invoke Ansible Playbook 选项,然后配置 playbook 文件的路径。

屏幕快照 2018-09-21 下午4.45.47

注:构建步骤也支持多个部署,同时执行 Shell 和 Ansible,按照配置的顺序执行。

Ansible 编写配置

我习惯将项目相关的配置文件统一放在 /data/devops/projectname 目录下。

模版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
---
- name: handlers projectname
hosts: dev
user: root
tasks:
- name: Creates directory
file: path=/data/website/project/ state=directory
- name: Creates directory config
file: path=/data/website/project/config/ state=directory
- name: Creates directory log
file: path=/data/logs/project/ state=directory
- name: copy app
copy: src=/data/go/src/project/projectname dest=/data/website/project/ owner=root group=root mode=0755
- name: copy config
copy: src=/data/devops/project/config.dev.ini dest=/data/website/project/config/config.ini owner=root group=root mode=0644
- name: copy supervisor config
copy: src=/data/devops/project/supervisor.ini dest=/etc/supervisord.d/supervisor_project.ini owner=root group=root mode=0644
notify: reread config
- name: copy run
copy: src=/data/devops/project/run.sh dest=/data/init_start/project.sh owner=root group=root mode=0755
- name: copy supervisor sh
copy: src=/data/devops/project/supervisor.sh dest=/data/sh/supervisor_project.sh owner=root group=root mode=0755
- name: restart app
supervisorctl: name=project state=restarted
- name: copy lograte
copy: src=/data/devops/project/logratate dest=/etc/logrotate.d/project owner=root group=root mode=0644
notify: run lograte
handlers:
- name: run lograte
shell: logrotate -f /etc/logrotate.d/project

一个项目包含的配置文件:

  • supervisor.ini supervisor 的配置文件
  • supervisor.sh supervisor 重启
  • lograte 日志切割的配置文件

Supervisor 配置

[Linux] 应用进程管理工具 supervisord