自动化部署給我们带来的好处

自动化部署的好处体现在几个方面

1.提高前端的开发效率和开发测试之间的协调效率

Before

如果按照传统的流程,在项目上线前的测试阶段,前端同学修复bug之后,要手动把代码部署之后。才能通知测试同学在测试环境进行测试。

这会造成几个问题:本身手动部署服务的工作是比较繁琐的,占用了开发时间。同时开发-测试之间的环节的耦合问题,则会增加团队沟通成本。

After

通过gitlab-ci,前端开发在提交代码之后就不用管了,ci流程会自动部署到测试或集成环境的服务器。很大程度上节约了开发的时间。

同时,因为开发和测试人员可以共用gitlab里的pipeline界面, 测试同学能够随时把握代码部署的情况,同时还可以通过交互界面手动启动pipeline,自己去部署测试,从而节约和开发之间的沟通时间。

2.从更细的粒度把握代码质量

我们可以把eslint或其他的代码检查加到pipeline流程中,每当团队成员提交和合并一次,pipeline都会触发一次并对代码做一次全面检测,这样就从一个更细的粒度上控制代码质量了。

1.Pipeline & Job

Pipeline是Gitlab根据项目的.gitlab-ci.yml文件执行的流程,它由许多个任务节点组成, 而这些Pipeline上的每一个任务节点,都是一个独立的Job

Job在YML中的配置我们将会在下面介绍,现在需要知道的是:每个Job都会配置一个stage属性,来表示这个Job所处的阶段。

gitlab-ci的运行机制, 在项目根目录下配置.gitlab-ci.yml文件, 控制ci流程的不同阶段, 一般会包含

  • install  安装
  • eslint  检查
  • build  编译
  • deploy 部署

先看示例:

stages:  # 定义任务执行阶段
- build # 编译
- deploy # 部署 cache: # 设置缓存, 默认一次任务完成, 会将产物进行删除
key: module-cache # 设置缓存键
paths: # 需要缓存的路径
- node_modules
- build build:
stage: build # 当前所属阶段
tags: # 对应gitlab-runner中注册的tag(支持多个, 匹配任务 可以找到对应runner)
- docker-vue
- vue
only: # 限制指定分支,执行
- test
- master
script: # 执行shell命令
- cd ${CI_PROJECT_DIR}
- npm install
- npm run build
artifacts: # 生成制品并上传, gitlab中可供下载
paths:
- dist/ delopy-test:
stage: deploy
tags:
- docker-vue
- vue
only:
- test
script:
- rm -rf /data/www/docker-vue-test/*
- cp -rf ${CI_PROJECT_DIR}/dist/* /data/www/docker-vue-test
deploy-prod:  
  stage: deploy
  tags:
    - docker-vue
  only:
    - master
  script:  # 上线执行命令, 远程同步代码
    - rsync -avzH -e 'ssh -p 2222' --delete ${CI_PROJECT_DIR}/dist/ root@xx.xx.xx.xx:/opt/docker-vue/
 

触发时机: 每当你push/merge, gitlab-ci都会检查项目下有没有.gitlab-ci.yml文件,存在则执行里面的任务

不同push/merge所触发的CI流程不会互相影响,也就是说,你的一次push引发的CI流程并不会因为接下来另一位同事的push而阻断,它们是互不影响的。这一个特点方便让测试同学根据不同版本进行测试。

注意点:

  1. 部署的时候 可以使用scp 将本地代码远程拷贝到云服务

因为这一命令需要输入密码,所以通过 sshpass 命令携带密码再执行scp:

sshpass -p $PASSWORD scp -r ./build $CUSTOM_USERNAME@$CUSTOM_IP:/var/www/html

这里说明一下,Gitlab有自定义变量的功能,例如我们觉得直接在YML中写入密码/账号等信息不太好,那么可以通过美元符号$写入一个预定义的变量,然后在Gitlab面板上输入它

  当然也可以只用免密认证的方式, 这样就不需要输入密码了

重要参数:

  cache:

用作缓存,

为什么要做缓存呢?当然是为了重复运行pipeline的时候不会重复安装全部node_modules的包,从而减少pipeline的时间,提高pipeline的性能。

但是,这并不是cache关键字唯一的功能!

在介绍cache的另外一个功能之前,我要先说一下gitlab-ci的一个优点“恶心人”的特点:

它在运行下一个Job的时候,会默认把前一个Job新增的资源删除得干干静静

没错,也就是说,我们上面bulid阶段编译生成的包,会在deploy阶段运行前被默认删除!

而cache的作用就在这里体现出来了:如果我们把bulid生产的包的路径添加到cache里面,虽然gitlab还是会删除bulid目录,但是因为在删除前我们已经重新上传了cache,并且在下个Job运行时又把cache给pull下来,那么这个时候就可以实现在下一个Job里面使用前一个Job的资源了

总而言之,cache的功能体现在两点:

  • 在不同pipeline之间重用资源

  • 在同一pipeline的不同Job之间重用资源

虽然cache会缓存旧的包,但我们并不用担心使用到旧的资源,因为npm install还是会如期运行,并检查package.json是否有更新,npm build的时候,生成的build资源包也会覆盖cache,并且在当前Job运行结束时,作为**"新的cache"**上传

artifacts关键字

这个关键字的作用是:将生成的资源作为pipeline运行成功的附件上传,并在gitlab交互界面上提供下载

例如我们新增以下YML

Build-job:
stage: build
script:
- 'npm run build'
artifacts:
name: 'bundle'
paths:
- build/

only/except

这两个关键字后面跟的值是tag或者分支名的列表。

故名思义

  • only的作用是指定当前Job仅仅只在某些tag或者branch上触发

  • 而except的作用是当前Job不在某些tag或者branch上触发

job:
# use regexp
only:
- /^issue-.*$/
- develop
- release
test:
stage: test
before_script:
- echo "before script in test..."
script:
- echo "script in test..."
- error
tags:
- docker_in_docker_demo
allow_failure: true
parallel: 5

allow_failure

allow_failure是允许当前作业失败,这个在比如测试脚本开发的过程中等情况下是非常有用的,比如脚本还没有调试稳定,失败不表示产品有问题的时候就可以设置当前作业允许失败

值为true/false, 表示当前Job是否允许允许失败。

  • 默认是false,也就是如果当前Job因为报错而失败,则当前pipeline停止

  • 如果是true,则即使当前Job失败,pipeline也会继续运行下去。

job1:
stage: test
script:
- execute_script_that_will_fail
allow_failure: true

retry

顾名思义,指明的是当前Job的失败重试次数的上限。

但是这个值只能在0 ~2之间,也就是重试次数最多为2次,包括第一次运行在内,Job最多自动运行3次

verify:
stage: verify
script: error
retry: 2
tags:
- docker_in_docker_demo

此外,retry还可以通过max指定最大次数,通过when指定重试的条件,when可选的值如下:

always:在发生任何情况下重试(默认)
unknown_failure:当失败原因未知时
script_failure:脚本失败时重试
api_failure:API失败重试
stuck_or_timeout_failure:作业卡住或超时
runner_system_failure:运行系统发生故障
missing_dependency_failure:如果依赖丢失
runner_unsupported:Runner不支持
stale_schedule:无法执行延迟的作业
job_execution_timeout:脚本超出了为作业设置的最大执行时间
archived_failure:作业已存档且无法运行
unmet_prerequisites:作业未能完成先决条件任务
scheduler_failure:调度程序未能将作业分配给运行scheduler_failure
data_integrity_failure:检测到结构完整性问题

verify-2:
stage: verify
script: error
retry:
max: 2
when:
- script_failure
tags:
- docker_in_docker_demo
timeout: 3s

timeout

配置超时时间,超过时间判定为失败

Job:
script: rspec
timeout: 3h 30m

When

表示当前Job在何种状态下运行,它可设置为3个值

  • on_success: 仅当先前pipeline中的所有Job都成功(或因为已标记,被视为成功allow_failure)时才执行当前Job 。这是默认值。

  • on_failure: 仅当至少一个先前阶段的Job失败时才执行当前Job。

  • always: 执行当前Job,而不管先前pipeline的Job状态如何。

  • manual:  手动执行作业
  • delayed: 延迟执行作业
deploy:
stage: deploy
script:
- echo "script in deploy..."
tags:
- docker_in_docker_demo
when: manual

deplayed可以配置start_in参数使用,设置延迟执行,如下为延迟10秒执行当前任务

release:
stage: release
script:
- echo "script in release..."
after_script:
- echo "after in release..."
tags:
- docker_in_docker_demo
when: delayed
start_in: "10"

timeout:

设置作业超时时间

设置时间的格式比如:
1h 10m # 一个小时10分钟
10m 20s # 10分钟20秒
30s # 30秒
如下:设置超时时间为3s

verify-2:
stage: verify
script: error
retry:
max: 2
when:
- script_failure
tags:
- docker_in_docker_demo
timeout: 3s

parallel

parallel可以指定一个任务并行运行多次
如下,表示当前任务并行运行5次

test:
stage: test
before_script:
- echo "before script in test..."
script:
- echo "script in test..."
- error
tags:
- docker_in_docker_demo
allow_failure: true
parallel: 5

dependencies: 定义job依赖关系, 这样他们可以互相传递artifacts

注意:所有之前的stages都是默认设置通过。

如果要使用此功能,应该在上下文的job中定义dependencies,并且列出之前都已经通过的jobs和可下载的artifacts。你只能在当前执行的stages前定义jobs。你如果在当前stages或者后续的stages中定义了jobs,它将会报错。可以通过定义一个空数组是当前job跳过下载artifacts。

代码回滚:

一般是需要定义一个environment的参数,在部署 > 环境中可以看到对应的环境变量

示例:

delopy-test:
stage: deploy
tags:
- docker-vue
- vue
only:
- test
script:
- rm -rf /data/www/docker-vue-test/*
- cp -rf dist/* /data/www/docker-vue-test
environment:
name: docker-vue-test

参考文件:

gitlab之配置文件.gitlab-ci.yml的更多相关文章

  1. Jenkins+Gitlab搭建持续集成(CI)环境

    利用Jenkins+Gitlab搭建持续集成(CI)环境 Permalink: 2013-09-08 22:04:00 by hyhx2008in intern tags: jenkins gitla ...

  2. [转]GitLab Continuous Integration (GitLab CI/CD)

    本文转自:https://docs.gitlab.com/ee/ci/README.html GitLab Continuous Integration (GitLab CI/CD) The bene ...

  3. 使用gitlab自带的ci/cd实现.net core应用程序的部署

    这两天在折腾持续集成和交付,公司考虑使用gitlab自带的ci/cd来处理,特此记下来整个流程步骤. 好记性不如一支烂笔头---尼古拉斯-古人言 第一步: 安装gitlab,这个自然不用多说 第二步: ...

  4. Docker+Vagrant+Gitlab 构建自动化的 CI/CD

    如果你的开发流程是下面这个样子的, 那么你一定很好奇, 为什么我提交到仓库的代码可以自动部署并访问到最新的提交内容 这就是近年来兴起的 DevOps 文化, 很方便的解决了开发人员和运维人员每次发布版 ...

  5. 【Gitlab】从Gitlab拉取项目+往Gitlab发布项目 【GitLab自定义端口】

    1>GIt需要提前安装在本地,本机,自己的电脑,开发环境电脑,IDEA所在的电脑 2>代码仓库:gitlab 3>开发工具:IDEA 4>内网搭建gitlab,访问url: h ...

  6. spring boot 读取配置文件(application.yml)中的属性值

    在spring boot中,简单几步,读取配置文件(application.yml)中各种不同类型的属性值: 1.引入依赖: <!-- 支持 @ConfigurationProperties 注 ...

  7. Node+GitLab实现小程序CI系统

    为什么要实现自动部署 小程序开发迭代里,有以下几个个头痛的问题, 如何准确并快速的的把小程序上传去后台,并让测试人员进行测试? 测试同事找开发要二维码,效率较低 本地生成的二维码会出现携带本地代码.未 ...

  8. git 客户端连接gitlab 实现简单的CI/CD

    1. git 客户端的安装 下载: https://git-scm.com/download/win 截至最近:20180728最新版本 2.18的下载地址 https://github-produc ...

  9. CentOS 7 部署Gitlab+Jenkins持续集成(CI)环境

    持续集成概述及运行流程 : 持续集成概述 :持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中 ,可以频繁的将代码部署集成到主干,并进行自动化测试  开发→代 ...

  10. 【自建gitlab服务器】gitlab内存持续增大,出现502错误的解决办法

    首先说明笔者的服务器环境,阿里云服务器:8G内存,2核.自从团队运维小伙伴搭建了gitlab之后,git push 代码时不时的就很卡,也经常出现 gitlab 反应超时,返回502错误,严重阻塞了团 ...

随机推荐

  1. 【YashanDB知识库】filter or改写问题

    问题现象 当filter中出现or的时候,会导致filter无法走索引或者走hash join,就需要进行改写,例如: create table test_tab1(col1 int, col2 in ...

  2. Coursera self-driving2, State Estimation and Localization Week2, kalman filter 卡尔曼滤波

    KF - Kalman Filter: EKF - Extended Kalman Filter: ES-EKF - Error State Extended Kalman Filter 和EKF一样 ...

  3. fluent python-chap2

    1. 内置序列类型 容器序列: list tuple collections.deque 可以存放不同类型的数据. 存放的是它们所包含的任意类型的对象的引用. 扁平序列: str bytes byte ...

  4. 从Linq的Where方法理解泛型、委托应用场景

       最近遇到了一个问题,Linq的Where里面传递的是什么?Where的功能是什么实现的?没有第一时间答上来,在整理相关资料后决定自行实现Linq的Where方法来加深印象. 什么是泛型   指在 ...

  5. ZEGO 教程 | RTC + AI 视觉的最佳实践(移动端)

    ​  ​摘要:帮助开发者在音视频场景中快速获得 AI 视觉功能 -- 美颜.滤镜.背景抠图等. 文|即构 Native SDK 开发团队 Z世代作为社会新的消费主力,追求个性.热爱新奇事物,青睐与酷炫 ...

  6. MOGA-Net: 多目标遗传算法求解复杂网络中的社区《A Multiobjective Genetic Algorithm to Find Communities in Complex Networks》(遗传算法、多目标优化算法、帕累托最优)

    论文:A Multiobjective Genetic Algorithm to Find Communities in Complex Networks GitHub: IEEE 2012的论文. ...

  7. Fluent Builder 模式

    前言 以前最讨厌设计复杂方法调用, 就是那种需要一堆有逻辑规则的 config 作为参数的方法. 这种 config 通常是一个大对象, 有许多 property, property 之间有存在一些逻 ...

  8. 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

    十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) @ 目录 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) 1. Spring Boot 配置 M ...

  9. 【USB3.0协议学习】Topic1·USB3.0Hub的一些机制

    一.USB3.0 Hub的单播(非广播)机制 Hub通过解析下行packet header中的Route String字段识别packet要传递的终点,其中4'b0000代表hub本身,4'b0001 ...

  10. linux那些事之页迁移(page migratiom)

    Page migration 页迁移技术是内核中内存管理的一种比较重要的技术,最早该技术诞生于NUMA系统中(Page migration [LWN.net]),后续由于内存规整以及CMA和COW技术 ...