泉州网站制作设计,佛山网站建设推广厂商排名,小学班级活动设计方案模板,114做网站概述
1. CI/CD
CI#xff08;持续集成#xff09;指开发人员一天内进行多次合并和提交代码操作#xff0c;并通过自动化测试#xff0c;完成构建
CD#xff08;持续部署#xff09;指每次代码更改都会自动部署到对应环境
CI/CD 结合在一起#xff0c;可以加快开发团…概述
1. CI/CD
CI持续集成指开发人员一天内进行多次合并和提交代码操作并通过自动化测试完成构建
CD持续部署指每次代码更改都会自动部署到对应环境
CI/CD 结合在一起可以加快开发团队交付成果的效率减少时间成本
2. Gitlab-CI/CD
gitlab-ci 是 gitlab8.0 之后自带的一个持续集成系统中心思想是每一次 push 到 gitlab 就会触发一次脚本执行脚本内容包括测试、编译、部署等一系列内容
gitlab-ci 的脚本需要 gitlab-runner 来执行代码 push 之后webhook 检查到代码变化就会触发 gitlab-ci分配到各个 Runner 来运行相应的脚本 gitlab-ce
1. 安装 gitlab-ce
gitlab 有 ce 和 ee 两个版本ce 是社区版开源免费ee 是企业版需要付费
下面以 Ubuntu18.04.6 为例安装 gitlab-ce
安装依赖软件
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl添加 gitlab 软件源镜像
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash安装 gitlab-ce
sudo apt-get install gitlab-ce如果命令行能看到 Gitlab 的 Logo 打印就说明安装成功了
打开 gitlab 配置文件
vim /etc/gitlab/gitlab.rb为了能在浏览器访问 gitlab还需要配置 gitlab 的访问地址和端口
# ip:port 改成自己的,也可以用域名
external_url http://192.168.66.100:82重载配置并重启
gitlab-ctl recofigure
gitlab-ctl restart在浏览器输入 http://192.168.66.100:82 即可访问 gitlab当然了前提是你的端口要放开 初始用户名为 root初始密码记录在 /etc/gitlab/initial_root_password 文件密码有效期为 24 小时建议登录后尽快修改密码
登录以后就可以创建项目了其余的基本的 git 操作这里就不赘述了
2. 其他问题
gitlab-ctl recofigure 过程有可能出现卡在 ruby_block[wait for logrotate service socket] action run 的情况解决办法如下 ctrl c 强行结束 运行 systemctl restart gitlab-runsvdir 再次运行 gitlab-ctl recofigure
安装结束以后访问 web 端报 502最可能的原因是端口被占用了需要修改端口
vim /etc/gitlab/gitlab.rb
# 修改为没有被使用的端口即可
puma[port] 9091gitlab-runner
1. 安装 gitlab-runner
下面以 Ubuntu18.04.6 为例安装 gitlab-runner
添加 gitlab 软件源镜像
curl https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash安装 gitlab-runner
sudo apt-get install gitlab-runner2. gitlab-runner 注册
首先获取 gitlab-ci 的 token项目主页-Setting-CI/CD-Runners Expand 使用命令注册 gitlab-runner
gitlab-runner register按照步骤输入
GitLab instance URL如上图所示 URLregistration token如上图所示 Tokendescription关于该 Runner 的描述tags用于标记该 Runner后续需要使用这个 tag 来指定 gitlab-runneroptional maintenance note没搞懂有啥用随意写Enter an executor选择执行器gitlab-runner 提供了许多执行器可用在不同场景中运行构建这里选择 shell
完成以后刷新页面即可在 Runners Expand 看到新增了一个 Runner 3. 简单示例
下面我们简单测试一下 Runner 是否能正常运行随意新建一个 SpringBoot 项目 在根目录下创建一个 .gitlab-ci.yml 文件这里只是简单输出一段语句
stages:- deploydeploy-job:tags:- prodstage: deployscript:- echo hello world!!!push 到 gitlab 后会发现脚本已经自动执行了绿勾代表执行成功 点击绿勾在下方 Pipeline 点击 deploy-job 可以查看执行过程 pipeline 语法
1. job script
.gitlab-ci.yml 文件中可以定义一个或多个作业job每个作业独立执行必须有唯一的名称不能使用关键字以及包含一个 script这里定义了三个作业 build、test、deployscript 可以是 shell 命令
build:script: - echo build
test:script: - echo test
deploy:script: - echo deploy- echo finish2. before_script after_script
before_script 用于定义一个命令在每个作业运行之前运行before_script 失败将导致整个作业失败其他作业不再执行如果在作业中定义了 before_script则该作业不会运行全局的 before_script
after_script 用于定义一个命令在每个作业运行之后运行作业失败不影响 after_script 的运行如果在作业中定义了 after_script则该作业不会运行全局的 after_script
before_script:- echo before script
build:before_script: - echo before script in buildjobscript: - echo buildafter_script:- echo before script in buildjob
test:script: - echo test
deploy:script: - echo deploy- echo finishafter_script:- echo after script3. stages stage
用于定义作业可以使用的阶段并且是全局定义的同一阶段的作业并行运行不同阶段按顺序执行
before_script:- echo before scriptstages:- build- test- deploybuild:before_script: - echo before script in buildjobstage: buildscript: - echo buildafter_script:- echo before script in buildjob
test:stage: testscript: - echo testdeploy:stage: deployscript: - echo deploy- sleep 5after_script:- echo after script4. .pre .post
.pre 始终是整个 pipeline 的第一个运行阶段.post 始终是整个 pipeline 的最后一个运行阶段无法修改用户自定义的 stage 则在这两者之间如果一个 pipeline 仅包含 .pre 和 .post则不会创建 pipeline
before_script:- echo before scriptstages:- build- test- deploycodescan:stage: .prescript: - echo codescanbuild:before_script: - echo before script in buildjobstage: buildscript: - echo buildafter_script:- echo before script in buildjob
test:stage: testscript: - echo testdeploy:stage: deployscript: - echo deploy- sleep 5after_script:- echo after script5. variables
定义变量可以定义 pipeline 变量、job 变量job 变量优先级最高
before_script:- echo before scriptvariables:DOMAIN: example.comstages:- build- test- deploycodescan:stage: .prescript: - echo codescanbuild:before_script: - echo before script in buildjobstage: buildscript: - echo build- echo $DOMAINafter_script:- echo before script in buildjob
test:stage: testscript: - echo testdeploy:stage: deployscript: - echo deploy- sleep 5after_script:- echo after script6. tags
用于指定特定的 job 在特定的 runner 运行如果 job 不指定 tags则默认在共享的 runner 运行
windows_job:stages: - buildtags:-windowsscript:- echo windows joblinux_job:stages: - buildtags:-linuxscript:- echo linux job7. allow_failure
allow_failure 表示是否允许作业失败默认值 false 不允许失败改为 true 后如果该作业失败也不会被阻塞
job1:stage: testscript: - ...allow_failure: true8. when
when 用于控制作业运行
on_success前面阶段的所有作业成功才执行该作业默认 on_successon_failure前面阶段出现失败时执行always总是执行作业manual手动执行作业delayed延迟执行作业
job1:stage: testscript: - ...when: delayed # 表示延迟30s执行start_in: 309. retry
配置作业失败后重试作业的次数
job1:stage: testscript: - ...retry: 2也可以精确匹配到某一错误即出现某一错误时才重试
job1:stage: testscript: - ...retry: max: 2when: - script_failure # 脚本失败时重试10. timeout
作业级别的超时可以超过项目级别的超时但不能超过 Runner 特定的超时
job1:stage: testscript: - ...timeout: 3h11. parallel
配置要并行运行的作业的实例数此值必须大于等于 2 并小于等于 50这将创建 N 个并行运行的同一作业实例
job1:stage: testscript: - ...parallel: 512. rules
rules 允许按顺序评估单个规则直到匹配为止 if如果条件匹配多条件匹配可以使用 || variables:DOMAIN: example.comjob1:stage: testscript: - ...rules: # DOMAIN值匹配,则手动运行,否则- if: $DOMAIN example.comwhen: manual- if: $DOMAIN example2.comwhen: delayedstart_in: 5- when: on_successchanges指定文件发生变化 job1:stage: testscript: - ...rules:- changes: - fimeName # 文件名when: manual- when: on_successexists指定文件存在 job1:stage: testscript: - ...rules:- exists: - fimeName # 文件名when: manual- when: on_success13. workflow-rules
workfolw 关键字适用于整个管道并确定是否创建管道
variables:DOMAIN: example.comworkflow:rules:- if: $DOMAIN example.comwhen: always # 默认always,可以设置never- when: never14. cache
存储编译项目时所需的运行时依赖项指定项目工作空间中需要在 job 之间缓存的文件或目录
全局 cache 定义在 job 之外针对所有 job 生效job 中的 cache 优于全局
cache:paths: # 在全局定义缓存- my/filesjob:script: ...cache:key: job # 为缓存设置唯一key,会为该job分配一个独立的cachepaths: # 在job中定义缓存,缓存target目录下的所有.jar文件,该缓存将覆盖全局缓存- target/*.jar# policy: pull # pull:不下载缓存,push不上传缓存,默认会在job执行之前下载缓存,并在结束之后上传缓存15. artifacts
用于指定作业成功或失败时应附加到作业的文件或目录的列表可在 Gitlab UI 中下载
build:script:- mvn packageartifacts:name: $ARTIFACTS_NAME # 指定所创建的制品名称,默认为artifacts,下载为artifacts.zippaths:- target/*.jarwhen: always # 制品创建条件,on_success:作业成功时创造制品,on_failure:作业失败时创建制品,always:总是创建制品expire_in: 1 week # 制品有效期,从存储到gitlab开始算起,默认30天16. dependencies
获取当前阶段之前的制品
build:stage: buildscript:- mvn packageartifacts:name $ARTIFACTS_NAMEpaths: - target/*.jardeploy:dependencies:- buildstage: deployscript: - ... # 部署制品17. needs
可以让作业无需按照阶段顺序运行下述的例子表示deploy-a 在 build-a 完成之后就可以执行deploy-b 在 build-b 完成之后就可以执行
stages:- build- deploybuild-a:stage: buildscript: - ...build-b:stage: buildscript: - ...deploy-a:stage: deployscript:- ...needs: [build-a]deploy-b:stage: deployscript:- ...needs: [build-b]18. include
可以引入外部 yaml 文件使用合并功能可以自定义和覆盖本地定义的 CI/CD 配置
local
引入同一存储库的文件使用相对于根目录的完整路径进行引用必须保证走到同一分支
假设有 ci/localci.yml 文件
stages:- deploydeploy-job:stage: deployscript: ...在 .gitlab-ci.yml 引入 ci/localci.yml 文件如果存在相同名称的作业它们的配置会进行合并并且原文件 .gitlab-ci.yml 的配置优先生效
include:local: ci/localci.yamlstages:- build- test- deploybuild-job:stage: buildscript: ...test-job:stage: testscript: ...file
引入其他项目的 yaml 配置
include:project: demo/demo-java-serviceref: masterfile: .gitlab-ci.ymltemplate
引入官方提供的模板可以访问 https://gitlab.com/gitlab-org/gitlab/tree/master/lib/gitlab/ci/templates 查看有哪些模板
include:template: Auto-DevOps.gitlab-ci.ymlremote
引入远程文件
include:remote: https://gitlab.com/awesome-project/raw/master/.gitlab-ci-template.yml19. extends
继承作业配置相同配置覆盖不同则继承
.tests:script: mvn teststage: testonly:refs:- tagstest-job:extends: .testsscript: mvn clean testonly:variables:- $RSPEC最终得到的作业配置如下
test-job:stage: testscript: mvn clean testonly:variables:- $RSPECrefs:- tags20. trigger
当 gitlab 从 trigger 定义创建的作业启动时将创建一个下游管道允许创建多项目管道和子管道 多项目管道跨多个项目设置流水线以便一个项目的管道可以触发另一个项目的管道 stagging:variables:ENVIROMENT: stagging # 该变量会传递给下游管道,如果上下游定义了相同名称的变量,上游变量将优先stage: deploytrigger:project: demo/demo-java-service # 指定下游项目的完整路径branch: master # 指定项目的分支名称strategy: depend # 将自身状态从触发的管道合并到源作业父子管道同一项目的管道可以触发一组同时运行的子管道 子管道 ci/child.yml stages:- buildchild-build-job:stage: buildscript: ...父管道 stages:- deploystagging:stage: deploytrigger:include: ci/child.ymlstrategy: depend2121. image
首先注册一个工作类型为 docker 的 runner只要使用该类型的 runner所有运行操作都会在容器中运行
gitlab-runner register \--non-interactive \--executor docker \--docker-image alpine:latest \ # 默认使用该镜像--url http://192.168.1.200:30088/ \--registration-token JRzzw2j1Ji6aBjwvkxAv \--description docker-runner \--tag-list docker \--run-untaggedtrue \--lockedfalse \--access-levelnot_protected默认注册 runner 会指定一个基础镜像如果全局指定 image 则所有作业使用该镜像创建容器并运行如果全局未指定 image则查看 job 中是否有指定有则按照 job 指定的镜像创建容器并运行否则使用默认镜像
image: maven:3.6.3-jdk-8 # 全局定义...deploy-job:stage: deploytags:- dockerscript: ...image: maven:3.6.3-jdk-8 # 局部定义22. services
工作期间运行的另一个 Docker 服务镜像将其 link 到 image 定义的 Docker 镜像这样可以在构建期间访问该服务镜像
...services:- name: mysql:latestalias: mysqlbuild-job:stage: buildtags:- dockerscript: ...image: maven:3.6.3-jdk-8 # 局部定义23. environment
可用于在 gitlab ui 追踪作业运行情况
deploy-job:stage: deploytags:- dockerscript: ...environment:name: production # 应用名称url: http://www.baidu.com # 应用地址