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持续集成的更多相关文章

  1. 物联网架构成长之路(35)-利用Netty解析物联网自定义协议

    一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...

  2. 物联网架构成长之路(25)-Docker构建项目用到的镜像1

    0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...

  3. 物联网架构成长之路(31)-EMQ基于HTTP权限验证

    看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...

  4. 【补充】Gitlab 部署 CI 持续集成

    上一篇:<劈荆斩棘:Gitlab 部署 CI 持续集成> 上一篇所配置的.gitlab-ci.yml: stages: - build - test before_script: - ec ...

  5. 物联网架构成长之路(15)-Jenkins部署SpringBoot

    1.前言 现在慢慢也在负责一些工作了.这段时间有空,就多了解了解软件多人开发的一些知识.以前项目都是我一个人做的,从数据库设计到后端再到前端,全部放在一个war包丢到tomcat里面然后运行,利用to ...

  6. 劈荆斩棘:Gitlab 部署 CI 持续集成

    阅读目录: install configue gitlab-ci-multi-runner restore nuget packages bulid .sln run unit tests confi ...

  7. 物联网架构成长之路(29)-Jenkins环境搭建

    0. 说明 哈哈,前面中间插入了一篇Eclipse增加Git插件,在此之前真的没有用过GIT. 1. 运行Jenkins 这里为了方便,还是用Docker方式安装,由于这个是标准的war报,不对Doc ...

  8. 物联网架构成长之路(24)-Docker练习之Compose容器编排

    0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...

  9. 物联网架构成长之路(33)-EMQ数据存储到influxDB

    一.前言 时隔一年半,技术变化特别快,学习也要跟上才行.以前写过EMQ数据转存问题,当时用了比较笨的方法,通过写插件的方式,把MQTT里面的数据发送到数据库进行存储.当时也是为了学习erlang和em ...

随机推荐

  1. 基于MVC的RESTful风格的实现

    基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...

  2. Unity C#数据持久化与xml

    最近工作需要用到数据持久化,所以在此分享一下,通过查阅资料,数据持久化大体都是通过xml或者json来进行的.unity为我们自定义了数据持久化方法,但是比较局限,还需要自己来完成数据持久化方法. ( ...

  3. virtual与override的使用

    在函数的声明中,当有“virtual”修饰的时候,和没有virtual有什么区别呢?最重要的一点就是调用实例的函数是在编译的时候确定还是在运行的时候确定,virtual函数是在运行的时候来确定具体调用 ...

  4. http和Https简介、详解

    目录 引用 一.HTTP和HTTPS的基本概念 二.HTTP与HTTPS有什么区别? 三.HTTPS的工作原理 四.HTTPS的优点 五.HTTPS的缺点 六.http切换到HTTPS 引用 超文本传 ...

  5. Linux nfs服务介绍

    nfs服务介绍 nfs(Network File System) 网络文件系统,能使用户访问服务器的文件系统,就像访问自己的本机的文件系统一样,并且多个 客户端共享访问该文件系统. 目前nfs服务,较 ...

  6. Tesseract引擎编译

    1. 工具包下载链接 libtiff 4.09 http://download.osgeo.org/libtiff/tiff-4.0.9.zip leptonica 1.76.0 http://www ...

  7. Python基础知识-运算符

    今日学习内容 用户交互 用户交互就是人向机器发出指令,机器分析处理后,给人们返回操作结果(装13的说法).直白地讲,就是人往计算机中输入(input)数据,计算机输出(output)结果.交互的本质就 ...

  8. CVE-2019-17671:Wordpress未授权访问漏洞复现

    0x00 简介 WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客 ...

  9. Web for pentester_writeup之XML attacks篇

    Web for pentester_writeup之XML attacks篇 XML attacks(XML攻击) Example 1 - XML外部实体注入(XXE) Payload http:// ...

  10. PhpStudy2018后门漏洞预警及漏洞复现&检测和执行POC脚本

    PhpStudy2018后门漏洞预警及漏洞复现&检测和执行POC脚本 phpstudy介绍 Phpstudy是国内的一款免费的PHP调试环境的程序集成包,其通过集成Apache.PHP.MyS ...