Jenkins + Ansible + Gitlab(一)

版本控制系统    Gitlab Github

持续集成工具    Jenkins

部署工具    Ansible Saltstack Chef

本文通过Jenkins + Ansible + Gitlab实现自动化部署。


Gitlab介绍

Gitlab是一个开源分布式版本控制系统,由Ruby开发,有管理项目源代码、版本控制、代码复用与查找等功能。

  • gitlab与github的区别:
github是分布式在线代码托管仓库,个人版本可直接在线免费使用,企业版本收费且需要服务器安装。

gitlab是分布式在线代码仓库托管软件,分社区免费版本与企业收费版本,都需要服务器安装。
  • gitlab的优势:
1. 开源免费,社区免费版本适合中小型公司;

2. 差异化的版本管理,离线同步以及强大分支管理功能;

3. 便捷的GUI操作界面以及强大账户权限管理功能;

4. 集成度很高,能够集成绝大多数的开发工具;

5. 支持内置HA,保证在高并发下仍旧实现高可用性。
  • gitlab主要服务构成:
Nginx   静态Web服务器

Gitlab-workhorse    轻量级的反向代理服务器

Gitlab-shell    用于处理Git命令和修改authorized keys列表

Logrotate   日志文件管理工具

Postgresql  数据库

Redis   缓存服务器
  • gitlab的工作流程:
1. 创建并克隆项目

2. 创建项目某Feature分支

3. 编写代码并提交至该分支

4. 推送该项目分支至远程Gitlab服务器

5. 进行代码检查并提交Master主分支合并申请

6. 项目领导审查代码并确认合并申请

环境准备

3台机器需要做环境准备。

  • 角色划分:
Jenkins + Ansible   192.168.30.128

test host   192.168.30.129

gitlab  192.168.30.130
  • 关闭防火墙和selinux:
# systemctl stop firewalld && systemctl disable firewalld

# setenforce 0 && sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
  • 添加本地dns:
# vim /etc/hosts

192.168.30.128 jenkins.lzxlinux.com
192.168.30.129 test.lzxlinux.com
192.168.30.130 gitlab.lzxlinux.com

在Windows电脑hosts文件中添加本地dns:

192.168.30.128 jenkins.lzxlinux.com
192.168.30.129 test.lzxlinux.com
192.168.30.130 gitlab.lzxlinux.com

Gitlab安装配置管理

  • 安装gitlab-ce:
# yum install -y curl policycoreutils openssh-server openssh-clients postfix                #安装gitlab组件

# curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash               #配置yum仓库

# systemctl start postfix && systemctl enable postfix               #启动postfix邮件服务

# yum install -y gitlab-ce
  • 证书创建与配置加载:
# mkdir -p /etc/gitlab/ssl

# openssl genrsa -out "/etc/gitlab/ssl/gitlab.lzxlinux.com.key" 2048

# openssl req -new -key "/etc/gitlab/ssl/gitlab.lzxlinux.com.key" -out "/etc/gitlab/ssl/gitlab.lzxlinux.com.csr"

Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:hz
Locality Name (eg, city) [Default City]:hz
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:gitlab.lzxlinux.com
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:
# openssl x509 -req -days 365 -in "/etc/gitlab/ssl/gitlab.lzxlinux.com.csr" -signkey "/etc/gitlab/ssl/gitlab.lzxlinux.com.key" -out "/etc/gitlab/ssl/gitlab.lzxlinux.com.crt"

# openssl dhparam -out /etc/gitlab/ssl/dhparams.pem 2048

# chmod 600 /etc/gitlab/ssl/*

# ll /etc/gitlab/ssl
total 16
-rw------- 1 root root  424 Oct  9 10:45 dhparams.pem
-rw------- 1 root root 1289 Oct  9 10:44 gitlab.lzxlinux.com.crt
-rw------- 1 root root 1078 Oct  9 10:38 gitlab.lzxlinux.com.csr
-rw------- 1 root root 1675 Oct  9 10:37 gitlab.lzxlinux.com.key
  • nginx SSL代理服务配置:
# vim /etc/gitlab/gitlab.rb             #修改下面内容

external_url 'https://gitlab.lzxlinux.com'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.lzxlinux.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.lzxlinux.com.key"
nginx['ssl_dhparam'] = "/etc/gitlab/ssl/dhparams.pem"
  • 初始化gitlab相关服务并完成安装:
# gitlab-ctl reconfigure

# vim /var/opt/gitlab/nginx/conf/gitlab-http.conf               #第一个 server_name gitlab.lzxlinux.com; 下添加该行

rewrite ^(.*)$ https://$host$1 permanent;

# gitlab-ctl restart                #重启gitlab

打开网页,访问gitlab.lzxlinux.com

Jenkins + Ansible + Gitlab(一)_第1张图片

第一次访问提示设置密码,设置密码后登录,默认用户名是root。

Jenkins + Ansible + Gitlab(一)_第2张图片

点击右上方+New porjectProject name输入test-repo,Visibility Level选择默认的Private即可,最后点击Create project创建项目。

Jenkins + Ansible + Gitlab(一)_第3张图片

Jenkins + Ansible + Gitlab(一)_第4张图片

  • gitlab工作流程:

任选一台其它机器,

# yum install -y git

# echo '192.168.30.130 gitlab.lzxlinux.com' >> /etc/hosts

# mkdir /home/repo && cd /home/repo

# git config --global user.name "admin"

# git config --global user.email "[email protected]"

# git -c http.sslVerify=false clone https://gitlab.lzxlinux.com/root/test-repo.git

Cloning into 'test-repo'...
Username for 'https://gitlab.lzxlinux.com': root
Password for 'https://[email protected]': 
warning: You appear to have cloned an empty repository.

# cd test-repo/

# vim test.py
print "This is a test code"

# git add .

# git commit -m "First commit"

[master (root-commit) a52e6f0] First commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.py

# git -c http.sslVerify=false push origin master

Username for 'https://gitlab.lzxlinux.com': root
Password for 'https://[email protected]': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 233 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://gitlab.lzxlinux.com/root/test-repo.git
 * [new branch]      master -> master

刷新浏览器,即可看到刚推送到gitlab服务端的代码。

Jenkins + Ansible + Gitlab(一)_第5张图片


Gitlab的使用

  • 检查gitlab健康状态:

点击左上方Admin AreaMonitoring

System Info     gitlab系统运行情况,内存、磁盘使用

Logs
    application.log     gitlab项目日志
    production.log      gitlab页面访问日志

Health Check        gitlab健康状态检查
  • 创建开发人员与项目领导的账号并分配各自角色权限:

点击左上方Admin AreaNew user,首先创建开发人员的账号。

Jenkins + Ansible + Gitlab(一)_第6张图片

填入用户名和邮箱地址后,其余保持默认,点击Create user创建用户。

Jenkins + Ansible + Gitlab(一)_第7张图片

同样方式创建项目领导的账号。

Jenkins + Ansible + Gitlab(一)_第8张图片

接着将新增用户加入到之前创建的项目test-repo中。点击左侧Projectstest-repoManage access

Jenkins + Ansible + Gitlab(一)_第9张图片

选中dev账号,然后分配Developer角色权限,点击Add to project添加该用户到项目中。

Jenkins + Ansible + Gitlab(一)_第10张图片

同样方法添加lead账号到项目中。接着修改两个账号的密码,设置初始密码为12345678

Jenkins + Ansible + Gitlab(一)_第11张图片

Jenkins + Ansible + Gitlab(一)_第12张图片

  • 开发人员提交代码到feature分支并发出合并master分支申请:

选择之前git提交过代码的机器,

# cd /home/repo

# rm -rf test-repo/

# git -c http.sslVerify=false clone https://gitlab.lzxlinux.com/root/test-repo.git

Cloning into 'test-repo'...
Username for 'https://gitlab.lzxlinux.com': dev             #这里使用dev账号,输入dev的密码
Password for 'https://[email protected]': 
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

# cd test-repo/

# git checkout -b release-1.0
Switched to a new branch 'release-1.0'

# ls
test.py

# vim test.py 
print "This is a test code for release-1.0"

# git add .

# git commit -m "release-1.0"
[release-1.0 b1bfc5a] release-1.0
 1 file changed, 1 insertion(+), 1 deletion(-)

# git -c http.sslVerify=false push origin release-1.0

Username for 'https://gitlab.lzxlinux.com': dev             #使用dev账号push代码到release-1.0
Password for 'https://[email protected]': 
Counting objects: 5, done.
Writing objects: 100% (3/3), 278 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for release-1.0, visit:
remote:   https://gitlab.lzxlinux.com/root/test-repo/merge_requests/new?merge_request%5Bsource_branch%5D=release-1.0
remote: 
To https://gitlab.lzxlinux.com/root/test-repo.git
 * [new branch]      release-1.0 -> release-1.0

接下来使用dev账号登录gitlab,点击Create merge request提交合并申请。

Jenkins + Ansible + Gitlab(一)_第13张图片

Jenkins + Ansible + Gitlab(一)_第14张图片

  • 项目领导审批合并申请:

使用lead账号登录gitlab,登入后右上角有Merge requests消息提示。

Jenkins + Ansible + Gitlab(一)_第15张图片

点击Merge immediately,写入一些内容,最后点击Comment

Jenkins + Ansible + Gitlab(一)_第16张图片

然后点击ProjectsYour projectstest-repo

Jenkins + Ansible + Gitlab(一)_第17张图片

可以看到,release-1.0分支的代码已经合并到master分支。

gitlab的大致使用过程就是这样,开发人员与运维人员各司其职。运维人员负责gitlab系统正常运行,管理账号及项目权限;开发人员负责代码编写,各自分支代码的提交与合并申请。


你可能感兴趣的:(Jenkins,Ansible)