Docker+Vagrant+Gitlab 构建自动化的 CI/CD
如果你的开发流程是下面这个样子的, 那么你一定很好奇, 为什么我提交到仓库的代码可以自动部署并访问到最新的提交内容
这就是近年来兴起的 DevOps 文化, 很方便的解决了开发人员和运维人员每次发布版本需要联调沟通等问题, 缩短了程序发布时间, 可以以更短的周期进行迭代。
所以在收集了很多教程之后, 我也搭建了一个可自动测试,测试用例通过后可自动部署的 CI/CD 流程
实验前准备
- VirtualBox 用来模拟需要用到的服务器(大概4台,云服务器也可以)
- Vagrant 用来编排 VirtualBox 里的虚拟机(一台一台服务器里面配置环境太累了)
- 了解 Vagrant 和 Docker 的简单用法
初始化服务器环境
首先我们要用 VirtualBox 初始化4台centos 系统的Linux主机。
HostName | IP Address | 作用 |
---|---|---|
gitlab | 192.168.33.10 | 安装gitlab服务,提供代码仓库等作用,类似github |
gitlab_dns | 192.168.33.13 | 给其他虚拟机提供统一的DNS查找服务, 不用每台虚拟机配置一份hosts文件 |
gitlab_ci | 192.168.33.11 | 安装 gitlab runner 提供 代码的持续集成服务 |
gitlab_cd | 192.168.33.12 | 安装 gitlab runner 提供 代码的持续部署服务 |
按照上面的表格, 我们设定了4台服务器名称, 也给每台服务器固定了内网地址, 这样我们每次重启系统就不用重新配置网络了。结合这份表格可以用 Vargentfile 启动4台服务器并安装好环境(每台系统我单独配置了一份shell脚本, 让环境直接初始化好)
# -*- mode: ruby -*-
# vi: set ft=ruby :
boxes = [
{
:name => "gitlab",
:eth1 => "192.168.33.10",
:mem => "4096",
:cpu => "2",
:folder => "./gitlab",
:shell => "./gitlab/bootstrap.sh" # 这份shell 是安装 gitlab 服务并自启
},
{
:name => "gitlab_dns",
:eth1 => "192.168.33.13",
:mem => "1024",
:cpu => "1",
:folder => "./gitlab_dns",
:shell => "./gitlab_dns/bootstrap.sh" # 这份shell 是安装 docker 并 通过docker 启动一个dns服务
},
{
:name => "gitlab_ci",
:eth1 => "192.168.33.11",
:mem => "2048",
:cpu => "2",
:folder => "./gitlab_ci",
:shell => "./gitlab_ci/bootstrap.sh" # 这份shell 是安装 docker 和 gitlab runner 组件
},
{
:name => "gitlab_cd",
:eth1 => "192.168.33.12",
:mem => "2048",
:cpu => "2",
:folder => "./gitlab_ci",
:shell => "./gitlab_ci/bootstrap.sh" # 这份shell和ci是同一个脚本
},
]
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
boxes.each do |opts|
config.vm.define opts[:name] do |config|
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", opts[:mem]]
v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
end
config.vm.network :private_network, ip: opts[:eth1]
config.vm.synced_folder opts[:folder], "/mnt", type: "nfs"
config.vm.provision "shell", path: opts[:shell]
end
end
end
如果顺利初始化成功后, 你将有4台服务器, 分别是
- 已经安装好 gitlab 的服务器,提供代码的仓库
- 通过 docker 对外提供dns服务的 gitlab_dns 服务器
- 安装好 gitlab runner 和 docker 的 ci 服务器
- 安装好 gitlab runner 和 docker 的 cd 服务器
以上 Vargentfile 和 shell 文件可以到我的 github 仓库上复制
设置 gitlab
vagrant up
启动成功上述4台虚拟机后,然后配置一下宿主机的 dns ,用来通过域名方式 http://gitlab.example.com/
访问 gitlab 页面, 不配置也可以通过直接访问 ip 地址 192.168.33.10
的形式查看 gitlab
第一次启动需要设置密码, 然后可以通过 默认用户名root 和设置的密码登陆 gitlab, 登陆成功后需要像使用 github 一样添加宿主机的公钥到网站上, 放便后面我们对代码的 pull 和 push
添加一个项目
能顺利进入 gitlab 了, 那么顺利成章的需要测试一下我们是否能够初始化项目并且成功pull 和 push 操作, 这里有一份 go 代码, 来当作这次ci cd 实验的准备
# main.go
func main() {
http.HandleFunc("/", httpFunc.SayHello) //设置访问的路由
err := http.ListenAndServe(":9090", nil) //设置监听的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
# httpFunc/helloHandler.go
func SayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!") //这个写入到w的是输出到客户端的
}
# test/main_test.go
func TestHelloWorld(t *testing.T) {
mux := http.NewServeMux()
mux.HandleFunc("/", httpFunc.SayHello)
r, _ := http.NewRequest(http.MethodGet, "/", nil)
w := httptest.NewRecorder()
mux.ServeHTTP(w, r)
resp := w.Result()
if resp.StatusCode != http.StatusOK {
t.Errorf("Response code is %v", resp.StatusCode)
}
body, _ := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if string(body) != "Hello World!" {
t.Errorf("Response Body is %s", string(body))
}
}
本地执行单元测试检验下我们的代码是否有问题
go test .
ok code/test 0.109s
So, 我们可以在 gitlab 上新建一个仓库 gohttp 来上传了
gitlab runner 设置
首先进入我们的 gitlab ci 服务器 vagrant ssh gitlab_ci
配置 dns
sudo vim /etc/resolv.conf
nameserver 192.168.33.13 # 添加这一行
然后ping一下域名是否能成功
ping gitlab.example.com
dns 配置好之后可以设置 gitlab runner 了
进入 gitlab.example.com, 查看 runner 的 token
进入 gitlab_ci 虚拟机
[vagrant@localhost ~]$ sudo gitlab-ci-multi-runner register
Runtime platform arch=amd64 os=linux pid=3016 revision=8fa89735 version=13.6.0
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://gitlab.example.com/ # gitlab 域名
Enter the registration token:
dPLFPqnA1dw2vzkAaENG # gitlab 项目的 token
Enter a description for the runner:
[localhost.localdomain]:
Enter tags for the runner (comma-separated):
golang-test # runner 的 tag
Registering runner... succeeded runner=dPLFPqnA
Enter an executor: kubernetes, shell, ssh, virtualbox, docker+machine, docker-ssh+machine, custom, docker, docker-ssh, parallels:
docker # runner 的 环境
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
然后刷新gitlab 页面, 可以看到 runner 已经注册成功了
同样的步骤可以在 gitlab_cd 服务器上执行一遍, 不过这次我们的 runner 环境要选择shell,
至此, 我们有了一个 tag 为 golang-test 的 runner 来执行 我们 go 项目的 ci (自动测试用), tag 为 docker-deploy 的项目进行 cd (自动部署用)
在项目下新增 dockerfile 用来在docker 中运行我们的项目
FROM golang AS build-env
ADD . /app
WORKDIR /app
RUN GOOS=linux GOARCH=386 go build -o gohttp main.go
FROM alpine
COPY --from=build-env /app/gohttp /usr/local/bin/gohttp
EXPOSE 9090
CMD [ "gohttp" ]
新增 .gitlab-ci.yml 让 gitlab runner 运行
stages:
- test
- deploy
test-job:
stage: test
tags:
- golang-test
script:
- go test ./test
deploy-job:
stage: deploy
tags:
- docker-deploy
script:
- docker build -t gohttp .
- if [ $(docker ps -aq --filter name=helloworld) ]; then docker rm -f helloworld;fi
- docker run -d -p 9090:9090 --name helloworld gohttp
然后将改动 push 到 master 分支, 然后进入 CICD 看板, 可以看到已经在帮我们做ci和cd了
测试通过后会自动部署, 部署成功后可以访问 gitlab_cd 服务器的 ip 和应用程序的端口形式看到部署的应用, 同时也可以在 gitlab dns 服务器上为 cd 服务器添加一个 host 域名, 这样可以直接用域名访问程序
至此, cicd 已经搭建完成, 我在本地经过多次 修改代码 然后 git push 到 gitlab 上, 程序都能相应的执行和部署到 cd服务器的 9090 端口, 大功告成!
Docker+Vagrant+Gitlab 构建自动化的 CI/CD的更多相关文章
- 使用gitlab自带的ci/cd实现.net core应用程序的部署
这两天在折腾持续集成和交付,公司考虑使用gitlab自带的ci/cd来处理,特此记下来整个流程步骤. 好记性不如一支烂笔头---尼古拉斯-古人言 第一步: 安装gitlab,这个自然不用多说 第二步: ...
- 用 GitHub Action 构建一套 CI/CD 系统
缘起 Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 r ...
- 使用jenkins SonarQube gitlab 构建自动化发布系统
目前持续集成的生态越来越完善,工具也有很多,开源的或商业的.如: 最最流行的,也是使用最多的 Jenkins 有着持续集成DNA的ThoughtWorks GO.理念:"Deployment ...
- 软工2021个人阅读作业#2——构建之法和CI/CD的运用
项目 内容 这个作业属于哪个课程 2021学年春季软件工程(罗杰 任健) 这个作业的要求在哪里 2021年软工-热身阅读作业#2 我在这个课程的目标是 了解和掌握现代软件开发和项目管理技术,锻炼在大规 ...
- git 客户端连接gitlab 实现简单的CI/CD
1. git 客户端的安装 下载: https://git-scm.com/download/win 截至最近:20180728最新版本 2.18的下载地址 https://github-produc ...
- 浩若烟海事半功倍|利用Docker容器技术构建自动化分布式web测试集群Selenium Grid
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_195 "世界上有那么多城市,城市里有那么多的酒馆,可她,却偏偏走进了我的-",这是电影<卡萨布拉卡> ...
- GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
预期目标 源代码管理 借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等. 自动化部署 源代码产生变更时(如签入),自动化编译并发布到指定服务器中部署, ...
- 前端初探 Gitlab CI/CD
前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就是其中一项,那么什么是 C ...
- Gitlab CI/CD
Gitlab CI/CD 前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就 ...
随机推荐
- 字体:等宽字体与比例字体 - Monospaced font & Proportional font
字体:等宽字体与比例字体 - Monospaced font & Proportional font 量子波儿 2013-08-24 16:54:12 7101 收藏 1分类专栏: 计算机常识 ...
- k8s滚动更新(8)
一.k8s版本更新 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 实践:部署 ...
- QT学习笔记(一)——Helloworld
QT学习笔记(一)--Helloworld 一.调试的基本方法: Log调试法 --在代码中加入一定的打印语句 --打印程序状态和关键变量的值 断点调试法: --在开发环境中的对应代码行加上断点 -- ...
- Ajax向服务器端发送请求
Ajax向服务器端发送请求 Ajax的应用场景 页面上拉加载更多数据 列表数据无刷新分页 表单项离开焦点数据验证 搜索框提示文字下拉列表 Ajax运行原理 Ajax 相当于浏览器发送请求与接收响应的代 ...
- 修改mysql中数据库存储主路径
一.首先把mysql的服务先停掉. 二.更改MySQL配置文件My.ini中的数据库存储主路径 打开文件夹C:\ProgramData\MySQL\MySQL Server 5.7中的my.ini文件 ...
- GO汇编-函数
GO汇编-函数 终于到函数了!因为Go汇编语言中,可以也建议通过Go语言来定义全局变量,那么剩下的也就是函数了.只有掌握了汇编函数的基本用法,才能真正算是Go汇编语言入门.本章将简单讨论Go汇编中函数 ...
- 日常Bug排查-消息不消费
日常Bug排查-消息不消费 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材_. Bug现场 某天下午,在笔者研究某个问题正high的时候.开 ...
- 实时实例分割的Deep Snake:CVPR2020论文点评
实时实例分割的Deep Snake:CVPR2020论文点评 Deep Snake for Real-Time Instance Segmentation 论文链接:https://arxiv.org ...
- Ascend昇腾计算
Ascend昇腾计算 Ascend昇腾计算,是基于昇腾系列处理器构建的全栈AI计算基础设施及应用,包括昇腾系列芯片.系列硬件.芯片使能.AI框架.应用使能等.华为Atlas人工智能计算解决方案,基于昇 ...
- IaaS、PaaS 和 SaaS:云服务模型概述
IaaS.PaaS 和 SaaS:云服务模型概述 为您的组织选择合适的云服务模型,可以帮助您充分利用预算和 IT 资源. 基础设施即服务 (IaaS).平台即服务 (PaaS) 以及软件即服务 (Sa ...