目录

  • GitLab CI/CD 简介
  • GitLab CI
  • GitLab Runner
  • GitLab CI/CD 快速开始
    • 创建一个 .gitlab-ci.yml 文件
    • 注册一个Runner
    • 修改代码并提交
  • 扩展知识
    • DockerFile
    • docker-entrypoint.sh
    • docekr-compose
    • nginx配置文件
  • 参考文档

GitLab CI/CD 简介

GitLab CI/CD 是一个内置在GitLab中的工具,用于通过持续方法进行软件开发:

  • Continuous Integration (CI) 持续集成
  • Continuous Delivery (CD) 持续交付
  • Continuous Deployment (CD) 持续部署

详细介绍可以看官方文档:CI/CD 概念

持续集成的工作原理是将小的代码块推送到Git仓库中托管的应用程序代码库中,并且每次推送时,都要运行一系列脚本来构建、测试和验证代码更改,然后再将其合并到主分支中。

持续交付和部署相当于更进一步的CI,可以在每次推送到仓库默认分支的同时将应用程序部署到生产环境。

这些方法使得可以在开发周期的早期发现BUG和错误,从而确保部署到生产环境的所有代码都符合为应用程序建立的代码标准。

GitLab CI

GitLab CI是为GitLab提供持续集成服务的一整套系统。在GitLab8.0以后的版本是默认集成了GitLab-CI并且默认启用的。

使用GitLab CI需要在仓库跟目录创建一个gitlab-ci.yml的文件,它用来指定持续集成需要运行的环境,以及要执行的脚本。还需要设置一个gitlab-runner,当有代码push变更的时候,gitlab-runner会自动开始pipeline,并在gitlab上显示持续集成的结果。

GitLab Runner

那GitLab-Runner又是什么东东呢?与GitLab-CI有什么关系呢?

GitLab-Runner是配合GitLab-CI进行使用的。一般地,GitLab里面的项目会定义一个属于这个项目的软件集成脚本(gitlab-ci.yml),用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人push了代码,GitLab就会将这个变动通知GitLab-CI。这时GitLab-CI会找出与这个项目相关联的Runner,并通知这些Runner把代码更新到本地并执行预定义好的执行脚本。

所以,GitLab-Runner就是一个用来执行软件集成脚本的东西。可以想象一下:Runner就像一个个的工人,而GitLab-CI就是这些工人的一个管理中心,所有工人都要在GitLab-CI里面登记注册,并且表明自己是为哪个工程服务的。当相应的工程发生变化时,GitLab-CI就会通知相应的工人执行软件集成脚本。如下图所示:

GitLab-Runner执行情况如下:

  1. 本地代码改动
  2. 变动代码推送到GitLab上
  3. GitLab 将这个变动通知GitLab-CI
  4. GitLab-CI找出这个工程相关联的gitlab-runner
  5. gitlab-runner把代码更新到本地
  6. 根据预设置的条件配置好环境
  7. 根据预定义的脚本(一般是.gitlab-ci.yml)执行
  8. 把执行结果通知给GitLab
  9. GitLab显示最终执行的结果

Runner可以分布在不同的主机上,同一个主机上也可以有多个Runner。

GitLab CI/CD 快速开始

.gitlab-ci.yml文件告诉GitLab Runner要做什么。一个简单的管道通常包括三个阶段:buildtestdeploy

流水线页面在 CI/CD > Pipelines 页面

创建一个 .gitlab-ci.yml 文件

通过配置.gitlab-ci.yml文件来告诉CI要对你的项目做什么。它位于仓库的根目录下。

仓库一旦收到任何推送,GitLab将立即查找.gitlab-ci.yml文件,并根据文件的内容在Runner上启动作业。

官方文档:https://docs.gitlab.com/ee/ci/yaml/index.html
其他文档:https://juejin.cn/post/6971013569986953223

下面是一个Rails项目配置例子:

# 定义在每个job之前运行的命令
before_script:- echo '在每个job之前运行的命令'# 定义在每个job之后运行的命令
after_script:- echo '在每个job之后运行的命令'# 定义全局变量
variables:PROJECT: gitlab-rails-demoIMAGE_NAME: ccr.ccs.tencentyun.com/jxd-dev/gitlab-rails-demoIMAGE_TAG: $CI_PIPELINE_ID# Cache 在使用时制定一系列的文件或者文件目录,使得其在不同的 job 之间被缓存下来
# https://zhuanlan.zhihu.com/p/106971627
cache:untracked: truekey: $PROJECTt-$CI_COMMIT_REF_NAMEpaths:- public/stages:- build   # 构建- test   # 测试- deploy   # 部署build_job:stage: buildtags:- gitlab-rails-demoonly:- dev- masterexcept: # 排除某些分支- new-devscript:- echo '这里是构建docker镜像阶段'- docker login ccr.ccs.tencentyun.com --username=100001378706 --password=jxd970219- docker build -t $IMAGE_NAME:$IMAGE_TAG --network webapp .  # 构建docker镜像- docker push $IMAGE_NAME:$IMAGE_TAG # 推送镜像test_job:stage: testtags:- gitlab-rails-demoonly:- dev- masterscript:- ls -a- echo '这里是测试阶段'allow_failure: true # 设置 allow_failure 的 job 失败后不会中断 CI 的执行deploy_job:stage: deploytags:- gitlab-rails-demoonly:- dev- masterscript:- echo '这里是部署阶段'- docker-compose up -d # docker-composeafter_script:- echo y | docker image prune --filter="dangling=true"  # 清理dangling镜像- docker images

注册一个Runner

在GitLab中,Runner运行你定义在.gitlab-ci.yml中的阶段(job)

一个Runner可以是一个虚拟机、物理机、docker容器,或者一个容器集群

GitLab与Runner之间通过API进行通信,因此只需要Runner所在的机器有网络并且可以访问GitLab服务器即可。

可以去 Settings ➔ CI/CD 看是否已经有Runner关联到你的项目,因为还未注册runner,所以肯定是未关联状态。


注册步骤如下(已安装gitlab-runner):

  1. 执行命令
gitlab-runner register
  1. 输入gitlab-ci url
https://gitlab.explorexd.com/
  1. 输入gitlab-ci token
Rqpt3DY3VF9c9KuY2k66
  1. 输入这个runner的一些描述,不填也可以
gitlab-rails-demo
  1. 输入这个runner关联的标签
gitlab-rails-demo


注册成功后如下图:

修改代码并提交

此时,推送修改后的master或者dev分支就可以启动流水线了:

扩展知识

DockerFile

# 使用安装了最少的软件的镜像
FROM ruby:2.7.4-alpine3.14# 安装依赖
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update && apk add --no-cache libpq vim imagemagick sqlite-libs tzdata
RUN apk add --no-cache --virtual .temp-build-libs \alpine-sdk gcc musl-dev build-base libffi-dev make sqlite-dev nodejs yarn# 设置环境变量
# 来指代容器中的 rails 程序放的目录
ENV RAILS_ROOT /var/www/gitlab-rails-demo
ENV NODE_ENV production
ENV RAILS_ENV production
ENV HOST 0.0.0.0
ENV PORT 3000
ENV PIDFILE $RAILS_ROOT/tmp/pids/server.pid
ENV RAILS_MASTER_KEY 404aa1c143755a2541eba84121c52671# 设置容器里的工作目录
WORKDIR $RAILS_ROOT# 创建 rails 程序目录和程序运行所需要的 pids 的目录
RUN mkdir -p $RAILS_ROOT/tmp/pids# 拷贝 docker-entrypoint.sh
COPY ./docker-entrypoint.sh .
RUN sed -i 's/\r$//g'  $RAILS_ROOT/docker-entrypoint.sh# 拷贝 Gemfile 及 lock到容器的工作目录中
# 当Gemfile 没有改变时,省略下面的 bundle install
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock# 安装 Rails 环境
RUN bundle install# 拷贝js依赖
COPY package.json yarn.lock /app/# 将 Dockerfile 目录下所有内容复制到容器工作目录
COPY . .# 编译静态文件
RUN bundle exec rails webpacker:verify_install
RUN SECRET_KEY_BASE=nein bundle exec rails assets:precompile# 删除依赖
RUN apk del .temp-build-libs# 可执行权限
RUN chmod +x  $RAILS_ROOT/docker-entrypoint.sh# 暴露服务端口
EXPOSE 3000# 运行 docker-entrypoint.sh
ENTRYPOINT ["./docker-entrypoint.sh"]

docker-entrypoint.sh

#!/bin/sh# 启动服务
bundle exec puma -C config/puma.rbexec "$@"

docekr-compose

version: '3.9'
services:gitlab-rails-demo:container_name: gitlab-rails-demoimage: ccr.ccs.tencentyun.com/jxd-dev/gitlab-rails-demo:${IMAGE_TAG:-latest}networks:- webapprestart: alwaysexpose:- 3000volumes:- '/data/docker/gitlab-rails-demo/log:/var/www/gitlab-rails-demo/log'
networks:webapp:name: webappdriver: bridge

nginx配置文件

upstream gitlab-rails-demo-puma {server gitlab-rails-demo:3000;
}## Redirects all HTTP traffic to the HTTPS host
server {listen 80;server_name rails.explorexd.com;access_log  /var/log/nginx/gitlab-rails-demo.log;error_log   /var/log/nginx/gitlab-rails-demo.log;location / {client_max_body_size 256m;gzip on;proxy_read_timeout      300;proxy_connect_timeout   300;proxy_redirect          off;proxy_http_version 1.1;proxy_set_header    Host                $http_host;proxy_set_header    X-Real-IP           $remote_addr;proxy_set_header    X-Forwarded-Ssl     on;proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;proxy_set_header    X-Forwarded-Proto   $scheme;proxy_pass http://gitlab-rails-demo-puma;}
}

参考文档

https://zhuanlan.zhihu.com/p/59538397
https://www.cnblogs.com/cjsblog/p/12256843.html
https://docs.docker.com/samples/rails/
https://docs.gitlab.com/ee/ci/introduction/index.html
https://docs.gitlab.com/ee/ci/yaml/index.html

GitLab CI/CD 初体验相关推荐

  1. Gitlab的CI/CD初尝试

    初衷:今天公司的前端和测试人员吵起来了.原因是测试埋怨前端人员把Bug的状态更改为已解决,结果代码根本没提交,而前端人员埋怨测试测的太频繁了,需要打几个环境的包不方便.又要改东西又要频繁打包费时间.凡 ...

  2. jenkins 增量发布插件_CI/CD工具:Jenkins还是GitLab CI/CD?

    十年来,持续集成(Continuous Integration,CI)和持续交付(Continuous Delivery,CD)领域都取得了很大的进步.DevOps 测试的兴起导致了对 CI/CD 工 ...

  3. GitLab CI/CD 自动化部署全流程

    CI/CD简介 CI/CD 是一种持续开发软件的方法,侧重于软件开发过程中的自动化,可以不断地进行构建.测试和部署代码.使用这种方法,从新代码开发到部署,可以减少人工干预甚至不用干预 CI(Conti ...

  4. Jenkins和GitLab CI/CD:CI/CD工具之战

    持续集成(CI)和持续交付(CD)在过去十年左右时间里取得了长足的进步.DevOps测试的兴起引发了针对CI/CD工具的强烈需求.现有的解决方案一直在与时俱进,无数的新产品或新版本正在进入质量检查领域 ...

  5. Jenkins 流水线 获取git 分支列表_CI/CD 工具选型:Jenkins 还是 GitLab CI/CD?

    原标题:CI/CD 工具选型:Jenkins 还是 GitLab CI/CD? 作者 | Rahul Jain 策划 | 田晓旭 近十年来,持续集成(Continuous Integration,CI ...

  6. GitLab CI/CD

    GitLab CI/CD 是一个内置在GitLab中的工具,用于通过持续方法进行软件开发: Continuous Integration (CI)  持续集成 Continuous Delivery ...

  7. GitLab CI/CD 因git凭据踩坑

    GitLab CI/CD 因git凭据踩坑 [TOC] 1. 问题 我在windows上,使用git push到gitlab中的私有项目上(项目是有ci/cd设置的),runner执行时出现403权限 ...

  8. 基于docker-compose的Gitlab CI/CD实践排坑指南

    长话短说 经过长时间实操验证,终于完成基于Gitlab的CI/CD实践,本次实践的坑位很多, 实操过程尽量接近最佳实践(不做hack, 不做骚操作),记录下来加深理解. 看过博客园<docker ...

  9. 带你深入了解 GitLab CI/CD 原理及流程

    作者:狂乱的贵公子 cnblogs.com/cjsblog/p/12256843.html GitLab CI/CD 是一个内置在GitLab中的工具,用于通过持续方法进行软件开发: Continuo ...

  10. gitlab项目中启用或禁用 GitLab CI/CD Pipeline

    默认情况下,GitLab CI/CD 在新安装上会默认启用,要关闭的话,有两种方式: 需要在每个项目下单独关闭. 通过修改源安装和 Omnibus 安装中的设置.(未验证) 1.每个项目单独关闭 要在 ...

最新文章

  1. Zxing 竖屏切换 android
  2. 在Hadoop 2.3上运行C++程序各种疑难杂症(Hadoop Pipes选择、错误集锦、Hadoop2.3编译等)
  3. 4月24日Serverless Developer Meetup上海亮相
  4. 中秋干货 | 架构进阶之路上的实时数仓
  5. 企业Java中事务隔离级别的初学者指南
  6. [面试] Thread 中 start() 和 run() 的区别都不知道,还怎么混?
  7. 拆轮子:requests
  8. 190320每日一句
  9. 第一章 SQL命令 ALTER TABLE(一)
  10. C#_HelloWorld 篇
  11. SQL注入常用WAF绕过姿势
  12. 移动APP质量优化框架 – Booster
  13. Linux中的虚拟机图形界面安装步骤,批量完成虚拟机硬件配置
  14. 关于photonserver的使用心得
  15. 前端常见面试题及答案
  16. Halcon缺陷检测——光度立体
  17. Vue-报错cb() never called!
  18. 浅谈 Java 并发下的乐观锁
  19. sqlserver 删除表中重复的数据
  20. 苹果x来电闪光灯怎么设置_苹果相机网格怎么设置,新iPhone拍照前必须设置?...

热门文章

  1. 华硕计算机电源已连接未充电,笔记本电池显示“电源已接通,未充电”
  2. VS2019新建osgEarth项目时,GL.h文件提示报错
  3. EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字...
  4. android studio 顶部菜单栏消失了如何恢复
  5. linux中查找包含指定内容的文件
  6. Android视频播放器在播放前出现灰色图像
  7. 如何提高有效工作效率
  8. kali linux 标题栏 显示 网速、CPU 内存使用
  9. ubuntu18.04在状态栏显示网速
  10. 微信公众号生成个性化推广二维码