gitlab 的CI/CD 流水线初体验

标签: post | 发表时间:2023-09-25 15:57 | 作者:qinfengge
出处:https://xlog.app/

CI/CD #

关于 CI/CD 的理念与解释这里就不说了,可以看 这篇文章

为什么选择 gitlab 的流水线 #

原因也很简单,公司的代码托管在 gitlab 上,且 gitlab 的 free 额度好像还挺高。
不选择 Jenkins的原因也很简单,UI 过时,功能虽多但占用也高。
如果是新手的话 Drone 可能也很好?毕竟有可视化界面,且占用也很小。

注册 runner #

如果你只是想测试或者尝鲜,那不注册而使用共享的 runner 也是可以的。
但如果是要部署在自己的服务器上则一定要使用注册的 runner。
runner 的注册方式一般有 2 种
docker

Copy
   docker run -d --name gitlab-runner --restart always \\n  -v /home/jk/docker/gitlabRunner/config:/etc/gitlab-runner \\n  -v /var/run/docker.sock:/var/run/docker.sock \\n  gitlab/gitlab-runner:latest

注意 docker 方式注册的 runner 无法在宿主机层面部署新的容器。dind (docker in docker) 相当于多嵌了一层,所以它只适合构建而不适合部署
shell

Copy
   sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
sudo chmod +x /usr/local/bin/gitlab-runner
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
sudo gitlab-runner register --url https://gitlab.com/ --registration-token {gitlab注册runner的token}
sudo gpasswd -a gitlab-runner docker

shell 模式可以在宿主机拉取并运行 docker 镜像,适合部署服务
更详细的安装教程可以查看 官方文档

创建配置文件 #

你可以在 gitlab 项目中的 构建 ---> 流水线编辑器 中新建配置文件,或使用官方的配置模板

image
配置文件的命名固定为 .gitlab-ci.yml, 且必须放在项目的根目录下

image
.gitlab-ci.yml有其指定的关键字与格式,你可以在此处查看 官方的语法文档
常用的关键字如下

关键字 说明 用法
image 指定流水线需要的 Docker 镜像 image: docker:latest
services 指定的附加镜像 services:- name: docker:dind
variables 定义全局参数 variables:PORT: 9005
stages 定义流水线阶段 stages:- build - docker-build
tags 指定此阶段要使用的 runner tags: - shell-node
artifacts 作业产物,使用 build 命令会产生文件,此关键字可保存构建后的文件 artifacts:paths:- target/jk_testing-1.0-SNAPSHOT.jar
script 指定此阶段要运行命令脚本 script:- mvn clean install

当然,gitlab 也提供了相当多的 变量以供使用
$CI_COMMIT_SHORT_SHA 表示本次提交的特征值,你也可以使用 variables 中的自定义变量
也可以在 官方文档查看全部的变量

我非常建议您使用 Dockerfile 将您的项目打包成 docker 镜像,这将会使它比较容易管理及部署。

例子 #

下面我将用一个 spring boot 项目来为您解释配置文件。我会尽量增加注释

Copy
   # 指定流水线需要的 Docker 镜像
image: docker:latest

# 指定的附加镜像
services:
- name: docker:dind

# 参数定义
variables:
  PORT: 9005
  APPLICATION_NAME: test


# 定义流水线阶段
stages:
  - build
  - docker-build
  - deploy
  - notify


# 构建阶段:执行 Maven 构建
build:
  image: maven:3.6.3-openjdk-8
  stage: build
  # 定义执行脚本
  script:
    - mvn clean install
  artifacts:
    paths:
    - target/jk_testing-1.0-SNAPSHOT.jar

# Docker 构建阶段:构建 Docker 镜像并推送到镜像库
docker-build:
  stage: docker-build
  script:
    - docker build -t $APPLICATION_NAME .
    - docker tag $APPLICATION_NAME $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

# 部署阶段:滚动更新镜像
deploy:
  stage: deploy
  # 指定注册方式为shell的runner
  tags:
    - shell-node
  script:
    # 定义多段脚本
    # 先停止name中包含test的容器,再删除容器和镜像
    # 然后从镜像库拉取最新的镜像并运行
    - >
      if [[ $(docker ps -q -f name=$APPLICATION_NAME) ]]; then
      docker stop $APPLICATION_NAME 2>/dev/null;
      docker rm $APPLICATION_NAME 2>/dev/null;
      docker images | grep test | awk '{print $3}' | xargs -I {} docker rmi {};
      fi
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
    - docker run -d -p $PORT:9004 --name $APPLICATION_NAME $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

# 构建失败时的通知消息
notifyFailWeChat:
  stage: notify
  script:
    - apk add curl
    - curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key= {微信机器人token}' -H 'Content-Type:application/json' -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"小程序项目构建结果:<font color=\\"warning\\">失败</font>\n>本次构建由:$GITLAB_USER_NAME 触发\n>项目名称:$CI_PROJECT_NAME\n>提交号:$CI_COMMIT_SHA\n>提交日志:$CI_COMMIT_MESSAGE\n>构建分支:$CI_COMMIT_BRANCH\n>流水线地址:[$CI_PIPELINE_URL]($CI_PIPELINE_URL)\"}}"
  # 指定仅master分支运行
  only:
    - master
  # 指定什么时候执行,此处为流水线构建失败时执行
  when: on_failure

# 构建成功时的通知消息
notifySuccessWeChat:
  stage: notify
  script:
    - apk add curl
    - curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key= {微信机器人token}' -H 'Content-Type:application/json' -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"小程序项目构建结果:<font color=\\"info\\">成功</font>\n>本次构建由:$GITLAB_USER_NAME 触发\n>项目名称:$CI_PROJECT_NAME\n>提交号:$CI_COMMIT_SHA\n>提交日志:$CI_COMMIT_MESSAGE\n>构建分支:$CI_COMMIT_BRANCH\n>流水线地址:[$CI_PIPELINE_URL]($CI_PIPELINE_URL)\"}}"
  only:
    - master
  when: on_success

相关 [gitlab ci cd] 推荐:

gitlab 的CI/CD 流水线初体验

- - xLog Latest
关于 CI/CD 的理念与解释这里就不说了,可以看 这篇文章. 为什么选择 gitlab 的流水线 #. 原因也很简单,公司的代码托管在 gitlab 上,且 gitlab 的 free 额度好像还挺高. 不选择 Jenkins的原因也很简单,UI 过时,功能虽多但占用也高. 如果是新手的话 Drone 可能也很好.

用 GitLab 做 CI/CD 是什么感觉,太强了

- - DockOne.io
GitLab CI/CD 是一个内置在 GitLab 中的工具,用于通过持续方法进行软件开发:. Continuous Integration(CI):持续集成. Continuous Delivery(CD):持续交付. Continuous Deployment(CD):持续部署. 持续集成的工作原理是将小的代码块推送到 Git 仓库中托管的应用程序代码库中,并且每次推送时,都要运行一系列脚本来构建、测试和验证代码更改,然后再将其合并到主分支中.

有赞零售移动 CI/CD 实践

- - IT瘾-dev
点击关注“有赞coder”. 随着有赞零售业务的蓬勃发展,为了尽早交付有价值的应用满足客户需求,我们采用了敏捷开发的模式,快速拥抱变化的同时保持竞争优势. 从 2019 年起,零售客户端的发版周期更改为每周一次,这对移动端的持续集成与交付提出更高的要求. 如何根据现有的团队规模,在有限的资源下,快速搭建稳定可靠的持续集成与交付系统,我们有了自己的实践与思考.

GitLab-CI:从零开始的前端自动化部署

- - DockOne.io
gitlab-ci&&自动化部署工具的运行机制. 1、通过在项目根目录下配置.gitlab-ci.yml文件,可以控制CI流程的不同阶段,例如install/检查/编译/部署服务器. GitLab平台会扫描.gitlab-ci.yml文件,并据此处理CI流程. 2、CI流程在每次团队成员push/merge后之后触发.

Trendyol 搜索团队的CI/CD流水线结构

- - DockOne.io
本文将描述在Trendyol的搜索团队中,我们的流水线(pipeline)是如何设计的,以及我们的CI/CD都有哪些特点:. • 为QA和开发团队创建同步分支. • 用Sonar分析构建项目. • Sonar质量门状态检查. • QA同步功能流水线. • 为测试部署一个基于特性的容器.

drone | CI/CD | 基于容器技术的持续交付平台

- - yiyun's Blog
Drone 分为 Server 和 Runner 两部分. 需要与 源代码控制 相结合, 这里与 GitHub 相结合. You can install a single Docker runner, or install the Docker runner on multiple machines to create your own build cluster..

恶搞CD封面

- Weiye - 超现实创意网
当你热衷于某一项事物时,收藏也许会慢慢变成浮云,如何从中获取对生命的重新思考才是大势所趋. 著名的DJ兼作曲家Christian Marclay手上拥有无数张CD唱片,一颗不羁的心促使他发现了这些唱片封面之间的“因果联系”,于是我们久仰的迈克也能穿上热辣的透视裤,被山寨化的PS一番.

GitHub 和 GitLab 的故事

- - 胡涂说
2005年,因为 Linux 社区被商业公司撤回了免费试用源码配置管理工具的权利,Linus Torvalds 一怒之下自己花了十天时间开发并发布了分布式源码配置管理工具Git, 虽然当时 Linus 只是想着给 Linux 社区小伙伴们开发个顺手的协作工具,但没想到这款工具将席卷全球,并改变了软件世界.

CD之父大贺典雄去世

- aviot - Solidot
前索尼公司CEO大贺典雄因多脏器功能衰竭于4月23日去世,终年81岁. 大贺典雄从1982年到1995年领导索尼,期间的重要决策包括耗资34亿美元收购哥伦比亚唱片公司;作为一位前歌唱家,他坚持CD的直径应设计为12厘米,能播放74分钟长的音乐——恰好能收录全首贝多芬第九交响曲.

废弃物之美,CD成海

- Y - 果壳网 guokr.com - 果壳网
在这个高速发展的数字时代,光盘已经不再是人们存储信息的首选. 你已经多久没有打开CD机,塞入一张CD,静静地放完整张专辑了. 现在许多人都能随意翻出一堆弃置许久的CD,它们的盘面都已刮花,不能再被机器读取. 可是,那些曾经挚爱的CD现在只能被尘封在记忆里了吗. 当然不是,两个法国人告诉我们,废旧CD也可以创造艺术美.