首页 联系 管理 订阅
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.YAML
- 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. volumn 配置持久化数据
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
- concurrent = 1
- check_interval = 0
- [session_server]
- session_timeout = 1800
- [[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 = 0
- [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.YAML 中会用到
4. 配置 CI/CD
默认 GitLab 是启用该功能的, 根目录配置新增 .GitLab-ci.YAML 文件, 然后每次 Git push, 都会触发 CI 持续集成. 当然可以在 YAML 配置, 在主线 master 触发.
来个简单的配置, 测试一下
- image: maven:3-jdk-8
- cache:
- paths:
- - .m2/repository
- test:
- stage: test
- script:
- - mvn package
- tags:
- - tag
上面这个配置, 写到. GitLab-ci.YAML 然后提交到 repo, 我们提交该文件到 GitLab 对应项目上去.
- Git add .GitLab-ci.YAML
- 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.YAML
- 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.YAML, 然后提交, 触发持续集成.
查看构建日志
查看宿主机镜像和运行状态
查看浏览器, 已经发布到测试环境了
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://www.cnblogs.com/Sinte-Beuve/p/11582511.html
- https://my.oschina.net/u/2303182/blog/3072694/
本文地址: https://www.cnblogs.com/wunaozai/p/11865362.html
本系列目录: https://www.cnblogs.com/wunaozai/p/8067577.html
个人主页: https://www.wunaozai.com/
来源: https://www.cnblogs.com/wunaozai/p/11865362.html