物联网架构成长之路(47)-利用GitLab实现CI持续集成
0.前言
前段时间,考虑到要练习部署一套CI/CD的系统。一开始考虑到Jenkins,随着这两天的了解,发现最新版的GitLab已经提供有CI/CD集成了。所以本次博客,干脆一步到位,直接用GitLab里面的CI/CD模块。Jenkins可能需要更高级的应用场合。经过测试GitLab自带的功能完全符合我的需求。
1. 安装GitLab和GitLab-CI(gitlab-runner)
英语比较好的,可以直接看官方文档。https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose https://docs.gitlab.com/ee/ci/quick_start/README.html
下面提供我使用的 docker-compose.yml
version: '3'
services:
gitlab:
image: twang2218/gitlab-ce-zh:latest
#image: gitlab/gitlab-ce:rc
restart: always
hostname: '172.16.23.203'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://172.16.23.203:8929'
gitlab_rails["time_zone"] = "Asia/Shanghai"
ports:
- 8929:8929
- 1080:80
- 1443:443
- 1022:22
volumes:
- /root/workspace/docker/gitlab/1/config:/etc/gitlab
- /root/workspace/docker/gitlab/1/logs:/var/log/gitlab
- /root/workspace/docker/gitlab/1/data:/var/opt/gitlab
gitlab-runner:
image: gitlab/gitlab-runner:latest
restart: always
volumes:
- /root/workspace/docker/gitlab/2/config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
执行docker-compose up -d 就运行起来,几点需要说明的
1. gitlab的image,可以选择中文版或者英文版
2. hostname 这里指定本机IP地址
3. gitlab环境变量,external_url表示提供访问的IP和端口,时区配置上海
4. 端口映射,默认是80端口,由于我上面配置了8929,所以映射8929到Host主机
5. volumes 配置持久化数据
6. 这里的/var/run/docker.sock 要映射到主机,因为会用到主机的一些资源,同时还会在docker里面安装docker
下面是运行效果,第一次运行会比较久,因为要拉取镜像和初始化GitLab
2. 登录使用GitLab
首次登录,设置密码。 登录默认用户名是root
利用模版,新建一个Spring项目
利用IDE,或者其他工具,或者直接在GitLab修改代码
3. 配置CI/CD,把机器(gitlab-runner)注册到GitLab中
可以在项目配置CI/CD机器,也可以在个人所有项目下配置,也可以由管理员配置所有项目下CI/CD机器。原理和流程都是一样的,只是比Jenkins更加细粒度控制而已。
进入gitlab-runner的Docker,执行初始化命令 gitlab-ci-multi-runner register,完整命令如下:
sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
需要录入的信息,安装上图进行,填写,后续还可以修改。
如果需要修改,可以修改之前volumes配置的路径下, config/config.toml
concurrent =
check_interval = [session_server]
session_timeout = [[runners]]
name = "myRunner"
url = "http://172.16.23.203:8929/"
token = "96beefdaa54832b0c8369ffa3811c9"
executor = "docker"
[runners.custom_build_dir]
[runners.docker]
tls_verify = false
image = "docker:latest"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache", "/root/.m2:/root/.m2", "/var/run/docker.sock:/var/run/docker.sock"]
shm_size =
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]

上面这个是配置文件,里面有几个注意点
1. privileged 这里要配置 true,因为要在docker里面安装docker
2. /root/.m2 这个是配置maven的仓库使用宿主主机的缓存,这样就不用每次CI都要下载依赖
3. /var/run/docker.sock 这个也要配置,在构建dockerfile的时候会用到
还有一个需要配置的就是,这个Runner需要设置tag,这个是标识Runner的名称。在.gitlab-ci.yml中会用到
4. 配置CI/CD
默认GitLab是启用该功能的,根目录配置新增 .gitlab-ci.yml 文件,然后每次git push,都会触发CI持续集成。当然可以在yml配置,在主线master触发。
来个简单的配置,测试一下
image: maven:3-jdk-8
cache:
paths:
- .m2/repository
test:
stage: test
script:
- mvn package
tags:
- tag
上面这个配置,写到.gitlab-ci.yml然后提交到repo,我们提交该文件到gitlab对应项目上去。
git add .gitlab-ci.yml
git commit -m "Add .gitlab-ci.yml"
git push origin master
如果嫌慢,pom.xml 可以换个阿里源
<repository>
<id>maven-ali</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>

一提交,就会触发自动构建
可以看到整个构建过程,如果出现错误,也是到这个日志里面排查问题。
5. 测试、打包、发布
这一步,我们实现一个简单的测试、打包、发布
5.1 增加 Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
ENV PORT 5000
EXPOSE $PORT
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]
5.2 修改 .gitlab-ci.yml
image: maven:3-jdk-8 variables:
DOCKER_TAG: test/demo-spring:0.1 cache:
paths:
- .m2/repository stages:
- test
- package
- deploy test:
stage: test
tags:
- tag
script:
- mvn test package:
stage: package
tags:
- tag
script:
- mvn clean package -Dmaven.test.skip=true
artifacts:
paths:
- target/*.jar deploy:
image: docker:latest
stage: deploy
services:
- docker:dind
tags:
- tag
script:
- docker version
- docker build -t $DOCKER_TAG .
- docker rm -f test || true
- docker run -d --name test -p 5000:5000 $DOCKER_TAG
那个artifacts.paths 配置,提交target目录下的文件到下一个流水线,因为不同流水线,由于是基于Docker,所以每一步都是隔离的。同时,上传的附件还可以在构建成功后,在流水线pipelines界面进行下载。每一步的image都是可以指定的,那个tags也是可以指定的。可以提交到不同的机器进行构建。
上面一共就三步流程,先test(测试),然后package(打包编译),最后deploy(发布测试)。前两个比较好理解,就是maven的基本命令。最后那个deploy就是利用docker里面的docker来进行打包成docker,然后运行起来,作为测试发布。
更新代码.gitlab-ci.yml,然后提交,触发持续集成。
查看构建日志
查看宿主机镜像和运行状态
查看浏览器,已经发布到测试环境了
5.3 钉钉通知
image: maven:3-jdk-8 variables:
DOCKER_TAG: test/demo-spring:0.1 cache:
paths:
- .m2/repository stages:
- test
- package
- deploy
- notify test:
stage: test
tags:
- tag
script:
- mvn test package:
stage: package
tags:
- tag
script:
- mvn clean package -Dmaven.test.skip=true
artifacts:
paths:
- target/*.jar deploy:
image: docker:latest
stage: deploy
services:
- docker:dind
tags:
- tag
script:
- docker version
- docker build -t $DOCKER_TAG .
- docker rm -f test || true
- docker run -d --name test -p 5000:5000 $DOCKER_TAG notify:
image: appropriate/curl:latest
stage: notify
tags:
- tag
script: "curl 'https://oapi.dingtalk.com/robot/send?access_token=d6c15304c1***************************************' -H 'Content-Type: application/json' -d '{\"msgtype\": \"text\", \"text\": {\"content\": \"功能已更新部署至测试环境\"}}' "


有了这个通知,就可以做很多事情了,写个脚本,封装成一个Docker 镜像,可以发送钉钉,发送邮件,可以对接到第三方系统等。

更多高级应用,如集成之前了解的Harbor,Rancher。使整个系统更加强大,更加智能化。
参考资料
https://cloud.tencent.com/developer/article/1010595
https://www.cnblogs.com/Sinte-Beuve/p/11582511.html
https://my.oschina.net/u/2303182/blog/3072694/
https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose
https://docs.gitlab.com/ee/ci/quick_start/README.html
本文地址:https://www.cnblogs.com/wunaozai/p/11865362.html
本系列目录: https://www.cnblogs.com/wunaozai/p/8067577.html
个人主页:https://www.wunaozai.com/

物联网架构成长之路(47)-利用GitLab实现CI持续集成的更多相关文章
- 物联网架构成长之路(35)-利用Netty解析物联网自定义协议
一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...
- 物联网架构成长之路(25)-Docker构建项目用到的镜像1
0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...
- 物联网架构成长之路(31)-EMQ基于HTTP权限验证
看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...
- 【补充】Gitlab 部署 CI 持续集成
上一篇:<劈荆斩棘:Gitlab 部署 CI 持续集成> 上一篇所配置的.gitlab-ci.yml: stages: - build - test before_script: - ec ...
- 物联网架构成长之路(15)-Jenkins部署SpringBoot
1.前言 现在慢慢也在负责一些工作了.这段时间有空,就多了解了解软件多人开发的一些知识.以前项目都是我一个人做的,从数据库设计到后端再到前端,全部放在一个war包丢到tomcat里面然后运行,利用to ...
- 劈荆斩棘:Gitlab 部署 CI 持续集成
阅读目录: install configue gitlab-ci-multi-runner restore nuget packages bulid .sln run unit tests confi ...
- 物联网架构成长之路(29)-Jenkins环境搭建
0. 说明 哈哈,前面中间插入了一篇Eclipse增加Git插件,在此之前真的没有用过GIT. 1. 运行Jenkins 这里为了方便,还是用Docker方式安装,由于这个是标准的war报,不对Doc ...
- 物联网架构成长之路(24)-Docker练习之Compose容器编排
0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...
- 物联网架构成长之路(33)-EMQ数据存储到influxDB
一.前言 时隔一年半,技术变化特别快,学习也要跟上才行.以前写过EMQ数据转存问题,当时用了比较笨的方法,通过写插件的方式,把MQTT里面的数据发送到数据库进行存储.当时也是为了学习erlang和em ...
随机推荐
- 百万年薪python之路 -- 推导式
2.1列表推导式 首先我们先看一下这样的代码,给出一个列表,通过循环,想列表中添加1~10: li = [] for i in range(1,11): li.append(i) print(li) ...
- ES和zookeeper选取帮主之江湖秘闻
ES帮会 某日,ES帮会中决定选取老大统领帮会走向辉煌.大家七嘴八舌,讨论方案,场面一顿混乱.傻牛站起来大喊一声:谁比俺力气大,谁就当老大.(ES集群在启动时,选取集群master,按照nodeId进 ...
- 小白学 Python(11):基础数据结构(元组)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 用Wireshark抓包分析请求
前言 有些封装好的API把错误都屏蔽掉,直接返回某一个不明确的具体错误,让人感到困惑. //code in SDK read-only public static Data requestHandle ...
- mysql全局变量和局部变量
全局变量和局部变量 在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认值).然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用 ...
- Java自动化测试框架-07 - TestNG之Factory篇 - 欢快畅游梦幻工厂(详细教程)
简介 最近忙着装修博客园,没时间更新文章,今天终于抽出时间把上次写的一半的文章给写完了,新的博客园风格,希望大家喜欢.今天继续介绍testng的相关知识--工厂. 工厂允许你动态的创建测试.例如,假设 ...
- 永恒之蓝复现(win7/2008)
Kali对Windows2008/7的MS17010漏洞测试(MSF自带模块) 0x01 说明 其实这个MSF自带的exp模块还是挺让人伤脑筋的,因为它支持的OS并不是很多,也就Windows Ser ...
- Feign设置assessToken
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.an ...
- window.getComputedStyle()方法的使用及其扩展
1.window.getComputedStyle()方法返回值 是一个可以获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object CSSStyleDeclaratio ...
- 通过ISO镜像简单搭建本地yum仓库
本文参考链接:https://segmentfault.com/a/1190000015155966 *有时候在我们本地搭建一些Linux上的程序运行环境或者安装一些软件的时候,难免会遇到需要使用yu ...