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

  1. version: '3'
  2. services:
  3. gitlab:
  4. image: twang2218/gitlab-ce-zh:latest
  5. #image: gitlab/gitlab-ce:rc
  6. restart: always
  7. hostname: '172.16.23.203'
  8. environment:
  9. GITLAB_OMNIBUS_CONFIG: |
  10. external_url 'http://172.16.23.203:8929'
  11. gitlab_rails["time_zone"] = "Asia/Shanghai"
  12. ports:
  13. - 8929:8929
  14. - 1080:80
  15. - 1443:443
  16. - 1022:22
  17. volumes:
  18. - /root/workspace/docker/gitlab/1/config:/etc/gitlab
  19. - /root/workspace/docker/gitlab/1/logs:/var/log/gitlab
  20. - /root/workspace/docker/gitlab/1/data:/var/opt/gitlab
  21. gitlab-runner:
  22. image: gitlab/gitlab-runner:latest
  23. restart: always
  24. volumes:
  25. - /root/workspace/docker/gitlab/2/config:/etc/gitlab-runner
  26. - /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,完整命令如下:

  1. sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register

  需要录入的信息,安装上图进行,填写,后续还可以修改。

  如果需要修改,可以修改之前volumes配置的路径下, config/config.toml

  1. concurrent =
  2. check_interval =
  3.  
  4. [session_server]
  5. session_timeout =
  6.  
  7. [[runners]]
  8. name = "myRunner"
  9. url = "http://172.16.23.203:8929/"
  10. token = "96beefdaa54832b0c8369ffa3811c9"
  11. executor = "docker"
  12. [runners.custom_build_dir]
  13. [runners.docker]
  14. tls_verify = false
  15. image = "docker:latest"
  16. privileged = true
  17. disable_entrypoint_overwrite = false
  18. oom_kill_disable = false
  19. disable_cache = false
  20. volumes = ["/cache", "/root/.m2:/root/.m2", "/var/run/docker.sock:/var/run/docker.sock"]
  21. shm_size =
  22. [runners.cache]
  23. [runners.cache.s3]
  24. [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触发。
  来个简单的配置,测试一下

  1. image: maven:3-jdk-8
  2. cache:
  3. paths:
  4. - .m2/repository
  5. test:
  6. stage: test
  7. script:
  8. - mvn package
  9. tags:
  10. - tag

  上面这个配置,写到.gitlab-ci.yml然后提交到repo,我们提交该文件到gitlab对应项目上去。

  1. git add .gitlab-ci.yml
  2. git commit -m "Add .gitlab-ci.yml"
  3. git push origin master

  如果嫌慢,pom.xml 可以换个阿里源

  1. <repository>
  2. <id>maven-ali</id>
  3. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  4. <releases>
  5. <enabled>true</enabled>
  6. </releases>
  7. <snapshots>
  8. <enabled>true</enabled>
  9. <updatePolicy>always</updatePolicy>
  10. <checksumPolicy>fail</checksumPolicy>
  11. </snapshots>
  12. </repository>


  一提交,就会触发自动构建

  可以看到整个构建过程,如果出现错误,也是到这个日志里面排查问题。

5. 测试、打包、发布
  这一步,我们实现一个简单的测试、打包、发布
5.1 增加 Dockerfile

  1. FROM openjdk:8-jdk-alpine
  2. VOLUME /tmp
  3. COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
  4. ENV PORT 5000
  5. EXPOSE $PORT
  6. ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]

5.2 修改 .gitlab-ci.yml

  1. image: maven:3-jdk-8
  2.  
  3. variables:
  4. DOCKER_TAG: test/demo-spring:0.1
  5.  
  6. cache:
  7. paths:
  8. - .m2/repository
  9.  
  10. stages:
  11. - test
  12. - package
  13. - deploy
  14.  
  15. test:
  16. stage: test
  17. tags:
  18. - tag
  19. script:
  20. - mvn test
  21.  
  22. package:
  23. stage: package
  24. tags:
  25. - tag
  26. script:
  27. - mvn clean package -Dmaven.test.skip=true
  28. artifacts:
  29. paths:
  30. - target/*.jar
  31.  
  32. deploy:
  33. image: docker:latest
  34. stage: deploy
  35. services:
  36. - docker:dind
  37. tags:
  38. - tag
  39. script:
  40. - docker version
  41. - docker build -t $DOCKER_TAG .
  42. - docker rm -f test || true
  43. - 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 钉钉通知

  1. image: maven:3-jdk-8
  2.  
  3. variables:
  4. DOCKER_TAG: test/demo-spring:0.1
  5.  
  6. cache:
  7. paths:
  8. - .m2/repository
  9.  
  10. stages:
  11. - test
  12. - package
  13. - deploy
  14. - notify
  15.  
  16. test:
  17. stage: test
  18. tags:
  19. - tag
  20. script:
  21. - mvn test
  22.  
  23. package:
  24. stage: package
  25. tags:
  26. - tag
  27. script:
  28. - mvn clean package -Dmaven.test.skip=true
  29. artifacts:
  30. paths:
  31. - target/*.jar
  32.  
  33. deploy:
  34. image: docker:latest
  35. stage: deploy
  36. services:
  37. - docker:dind
  38. tags:
  39. - tag
  40. script:
  41. - docker version
  42. - docker build -t $DOCKER_TAG .
  43. - docker rm -f test || true
  44. - docker run -d --name test -p 5000:5000 $DOCKER_TAG
  45.  
  46. notify:
  47. image: appropriate/curl:latest
  48. stage: notify
  49. tags:
  50. - tag
  51. 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/

  1.  

物联网架构成长之路(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. 彻底理解Python多线程中的setDaemon与join【配有GIF示意】

    在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B. ...

  2. Linux文件同步工具之rsync

    学习背景 1.最近公司的项目在使用jenkins做自动化构建,因为jenkins在构建时是比较耗性能的,便单独使用了一台服务器做构建服务器.但是个人觉得这样成本过高,单独拿一台服务器来构建并且该服务器 ...

  3. Spring之Zuul初步使用(十)

    一.zuul是什么 zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架. ...

  4. 第五篇 Flask 中内置的 Session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

  5. 再整理:Visual Studio Code(vscode)下的通用C语言环境搭建

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/czlhxm/p/11794743.ht ...

  6. Linux 命令之 crontab

    crontab 简介 crontab 主要用于需要管理周期执行定时任务的场景 crontab 安装 (有些系统默认已经带了 crontab,无需安装的朋友可以直接跳过本节) 安装: yum insta ...

  7. RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)

    好久没有继续分享关于自动化测试相关的东西了,自动化在现今的测试领域已经越来越重要了,大部分公司在测试岗位招聘中都需要会相关的自动化测试知识.而 RobotFramework自动化测试框架 是自动化测试 ...

  8. NOIP模拟34

    考试的时候被T2卡了一年....考虑了一下正解的式子,然后没去给左边分解因数,去给后面乘倍数...理论复杂度O(n^2),实际好像卡不掉的样子.但是由于我智障的打了一棵主席树,他M了.... 预计得分 ...

  9. Oracle“ORA-00979:不是GROUP BY 表达式”解决方式

    今天在工作中碰到一个问题,用group by 语句进行分组时出现ORA-00979错误. 代码如下: select R.ORDER_NO, R.PRODUCT_CODE, R.REGION_NO, R ...

  10. insmod: can't insert 'btn_drv.ko': Operation not permitted

    检测内核是否以及支持 要插入的驱动,若内核支持,则需要裁减掉内核支持的驱动才能安装上自己所写的驱动程序.