热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GitlabCI持续集成之Runner配置和CI脚本

    @font-face{font-family:Wingdings}@font-face{font-family:宋体}@font-face{font-family:Cam

 

 

 

 

@font-face { font-family: Wingdings }

@font-face { font-family: 宋体 }

@font-face { font-family: "Cambria Math" }

@font-face { font-family: 微软雅黑 }

@font-face { font-family: "@微软雅黑" }

@font-face { font-family: "@宋体" }

p.MsoNormal, li.MsoNormal, div.MsoNormal { mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; mso-pagination: none; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; font-family: "Times New Roman", serif; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt }

a:link, span.MsoHyperlink { mso-style-unhide: no; color: rgba(5, 99, 193, 1); mso-themecolor: hyperlink; text-decoration: underline; text-underline: single }

a:visited, span.MsoHyperlinkFollowed { mso-style-unhide: no; color: rgba(149, 79, 114, 1); mso-themecolor: followedhyperlink; text-decoration: underline; text-underline: single }

code { mso-style-priority: 99; mso-ansi-font-size: 12.0pt; mso-bidi-font-size: 12.0pt; font-family: 宋体; mso-ascii-font-family: 宋体; mso-fareast-font-family: 宋体; mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体 }

pre { mso-style-priority: 99; mso-style-link: "HTML 预设格式 字符"; margin: 0 0 0.0001pt; mso-pagination: widow-orphan; font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体 }

span.HTML { mso-style-name: "HTML 预设格式 字符"; mso-style-priority: 99; mso-style-unhide: no; mso-style-locked: yes; mso-style-link: "HTML 预设格式"; mso-ansi-font-size: 12.0pt; mso-bidi-font-size: 12.0pt; font-family: 宋体; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体 }

span.nt { mso-style-name: nt; mso-style-unhide: no }

span.nb { mso-style-name: nb; mso-style-unhide: no }

.MsoChpDefault { mso-style-type: export-only; mso-default-props: yes; font-size: 10pt; mso-ansi-font-size: 10.0pt; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: "Times New Roman"; mso-fareast-font-family: 宋体; mso-hansi-font-family: "Times New Roman"; mso-font-kerning: 0pt }

@page { mso-page-border-surround-header: no mso-page-border-surround-footer: no }

@page WordSection1 { size: 595.3pt 841.9pt margin-top: 72pt margin-right: 59.55pt margin-bottom: 72pt margin-left: 59.55pt mso-header-margin: 42.55pt mso-footer-margin: 49.6pt mso-paper-source: 0 layout-grid: 15.6pt }

div.WordSection1 { page: WordSection1 }

Gitlab-CI持续集成之Runner配置和CI脚本

一、简介

1. 为实现持续集成,需为该项目准备以下两样东西:

1)软件集成脚本.gitlab-ci.yml

2)一台Runner服务器

当然,考虑到集成环境的配置,还需要docker镜像作为载体。

2. 基本流程如下:

1)安装Runner服务器,注册和项目对应的Runner Service后续再说Shared Runner),编写集成脚本;

2) 每当push代码, 自动触发脚本,Gitlab将变动告知Gitlab-CICI连接Runner服务器,找到关联的Runner ServiceRunner负责更新代码到本地,并执行集成脚本。

二、安装Runner

1. Centos7使用yum安装

1)添加yum

a.官方源

1 curl –L https://package.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash

b.国内源

cat <> /etc/yum.repos.d/gitlab-ci-multirunner.repo
[gitlab
-ci-multi-runner]
name
=gitlab-ci-multi-runner
baseurl
=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ci-multi-runner/yum/el7

repo_gpgcheck
=0
gpgcheck
=0
enabled
=1
gpgkey
=https://packages.gitlab.com/gpg.key

EOF

sudo yum makecache

2)安装1.11.2版本

sudo yum install gitlab-ci-multi-runner-1.11.2-1

  由于公司Gitlab版本目前是8.X,官方Gitlab最新是9.0Runner最新版不支持9.0以下版本的Gitlab,因此只能安装该版本。视Gitlab服务器的版本而定。

3Runner用户权限

Runner默认会在服务器上创建gitlab-runner用户, 所有的Runner Service则默认通过该用户执行集成脚本,因此该用户需要较高的权限。尤其是使用Docker镜像时,必须加入docker组。

 

sudo usermod -aG docker gitlab-runner

2.Ubuntu使用apt-get安装

1)添加apt

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash

2)安装1.11.2版本

 

sudo yum install gitlab-ci-multi-runner-1.11.2-1

3Runner用户权限(同上)

3.安装包安装

下载二进制文件或相应系统的安装包安装即可,gitlab-ci-multi-runner-1.11.2安装包。

三、注册Runner

1.进入自己的Project—>设置Runners

 

 


2.查看Specific Runners里面的urltoken

 

 

 


3.Runner服务器执行注册命令

gitlab-runner register --non-interactive \
--url http://gitlab.xxxxx.com/ci \
--registration-token GWGGXZNxbxabcdMaXZhj9 \
--name Crowd_Job_CI \
--tag-list 172.17.3.126 \
--run-untagged=true \
--executor shell \
--builds-dir /home/gitlab-runner \
--config "/etc/gitlab-runner/config.toml"

上述命令选项含义(*为必选项)

--url                  项目CI地址*

-- registration-token  项目里刚才看到的token,互相关联的标志*

--name                 Special Runner服务名,便于后台管理(查看、删除、调用)*

--tag-list             Special Runner标签,集成脚本中可以通过指定tag关联

--run-untagged         是否运行无标签的集成脚本,必须用等号

--excutor              规定集成脚本执行的环境,还可以是docker*

-- builds-dir          默认该文件夹,可以自定义项目集成初始化的位置

--config               默认配置文件,存储注册信息,可以自定义不同的配置文件

刷新页面看到已经注册成功,可以使用了。

 

四、运行Runner

假设集成脚本已就绪,那么就需要运行Runner

1.使用Specific Runner

     1run-single

gitlab-ci-multi-runner run-single \
--url http://gitlab.sensenets.com/ci
--token 37fe0fa59e3475e20e24b6e6afc7c3
--executor shell

当然这里也可以指定注册时的大部分参数,不过无论如何urltokenRunnertoken,而非注册时项目的token)、executor这三个参数是必须的。

run-single命令很简单的把我们刚才注册的Runner运行起来了,如果这个Runner对应的项目有更新,这个运行的服务就会去执行脚本内容。

即便我们不运行run-single命令,默认会有一个已经运行状态的Runner Service,名称就是gitlab-runner,会自动执行所有注册过的Runner,但同时只能执行一个任务。

 

2run installstart

 

     上图说明了Runner的原理:

     安装gitlab-ci-multi-runner服务器,相当于一个劳务公司的创办,它管理Runner工人,外包各种项目Project

注册的目的是把项目和Runner连接起来,因为部分项目的Runner可能需要定制。Runner好比是一个工人,在劳务中心(gitlab-ci-multi-runner)登记合同,供职于我们的Project但是当他比较闲的时候,也可以去其他公司兼职)。

但是对应的RunnerService相当于Runner工人的管理层,一个管理层可以管理一个甚至多个工人。劳务公司默认有一个公用的管理层,服务名就是上面所说的gitlab-runner,如果我们不指定管理层,那么劳务公司所有工人都被gitlab-runner管理运行。这个管理人员比较弱,一次只能管理一个项目,其他项目会等待。

runrun-sigle相当于一次性的外包项目,非常具有针对性。

install则是把一个或者几个runner包装好,然后start,就是一个有着管理服务的工人体系,随时待命。

Project更新,触发Runner服务器上的Runner Service(某管理队伍),Runner Service根据自己的配置信息,和项目的需求(tag指定某个工人),派遣Runner工人去执行Project给予的任务(Job)。

配置信息相当于花名册,不注册仅仅写一个花名册是不行的,working_dir相当于办公地点。

下面安装两个服务并启动:

gitlab-runner install \
-n "jiukun_self_runner" \
-d "/home/jiukunz" \
-c "/etc/gitlab-runner/config_jiukun_test.toml" \
-u gitlab-runner

gitlab-runner install \
-n "jiukun_self2_runner" \
-d "/home/jiukunz" \
-c "/etc/gitlab-runner/config_jiukun_test.toml" \
-u gitlab-runner

 

1 gitlab-runner start -n jiukun_self_runner
2 gitlab-runner start -n jiukun_self2_runner

 

 

其中,-n为安装的服务名称,-d为工作路径,-c为配置文件,-u为执行用户(服务名称和执行用户必须指定,配置文件和工作路径可以使用默认路径)

 

     其实,当我们执行上述安装命令时,gitlab-ci-multi-runner后台实际是将run命令写入/etc/systemd/system/jiukun_self_runner.service文件,使之成为一个单独的服务:


 

2.使用Shared Runner

     使用share runner需要管理员权限,联系公司gitlab管理员,获取token。然后使用和Special Runner一样的方法注册成功。

     进入任意项目的Runner页面,将看到以下内容:

 

 

 

     这里我重复注册了两次,可以看到Runner无论是名字还是tag都可以重复,但是Runnertoken却不相同,实际上区分不同的Runner工人只需要两样东西就是urltoken。当然并不建议进行相同命名,不便于管理。

     公司所有的项目默认都可以使用Shared Runner,而不需要重复配置。

1)好处:对于大多数Runner的配置其实是完全相同的(同样的executor,同样的配置文件和工作路径,同样的依赖环境),如果每个项目都去一个个注册不仅麻烦,而且不方便迁移,这时可以使用shared runner

2)不足:如果一个项目的编译所需的exector等其他配置(配置文件有更多可选配置),并且和其他项目需要单独管理,这时最好使用Special Runner,并锁定该Runner为项目本身使用,单独管理。

 

五、管理Runner

1.注册的runner列表

gitlab-runner list \
--config "/etc/gitlab-runner/config_jiukun_test.toml"

2.查看runner连接状态

gitlab-runner verify \
--config "/etc/gitlab-runner/config_jiukun_test.toml"

3.取消注册(移除)

gitlab-runner unregistry \
--url http://gitlab.xxxxxx.com/ci \
--token 9c1bb50065661ba766023016f6ebf2

     不能直接在projectweb端进行remove操作,否则这里会执行失败

4管理gitlab-runner服务

gitlab-runner status \
-n jiukun_self_runner.service
不指定服务名,则默认为gitlab
-runner服务
gitlab
-runner stop \
-n jiukun_self_runner.service
gitlab
-runner restart \
-n jiukun_self_runner.service
gitlab
-runner uninstall \
-n jiukun_self_runner.service

执行uninstall会卸载该服务,与之对应的runner将无法通过该服务运行,请确保对应的CI任务已停止。

六、集成脚本

     将集成脚本命名为.gitlab-ci.yml或者.gitlab-ci.yaml放置在对应项目仓库分支的根目录下。

 

1.  yaml语法

大小写敏感、使用缩进代表层级、不允许使用Tab缩进,只能使用空格,缩进并无统一限制,但同级关系内要保持对齐即可#代表注释。

语言格式里存在减号和冒号这些特殊字符,因此要注意千万别写成中文的字符格式。

减号对应的是数组,冒号对应的是键值对(对象)。

2. 关键词

     1image

如果使用docker作为Runnerexecutor,并且没有设置默认的镜像,此处需要设置镜像;不使用可以省略

2sevices

如果使用docker集群服务,可以直接调用服务;不使用可以省略

3stages

定义各个阶段名称,如果省略,CI默认为三个阶段

每个job都必须定义其所属的阶段,如果不定义,默认均属于build阶段;同阶段任务并行对待,上一阶段所有任务执行成功,才会继续执行下一阶段;语句依次执行,如果某一语句执行失败,将返回错误码,并宣告CI失败。

如果定义stages,则job中的stage必须与之相对应。

4before_script

           定义在所有脚本运行之前执行的语句

5after_script

           定义在所有脚本运行之后执行的语句

     6variables

     定义环境变量

     7cache

     定义下个job会使用到的文件或内容

3. Jobs

     .gitlab-ci.yml脚本内容的主体为一个个job,没有数量限制,每个Job名称可以相同也可以不同(最好不要相同),可以大小写;每个Job内部至少有一个关键词。常用关键词如下

     1stage

     和脚本全局stages对应(如果全局未定义,可使用默认

     2imageservicesvariables

     同全局关键词

     3only

     规定该脚本响应分支(项目其他分支不会触发该脚本;如果不定义,会检测所有分支;与之相反的关键词是except

     4before_scriptafter_script

     同全局关键词(注意,如果同时存在,会覆盖全局关键词对应列表内容

     5script

     脚本主体,使用方法和在shell内一样,将在对应executor内运行一个shell环境,执行脚本内容。每个Jobshell环境不同(Job结束,该环境自动关闭)。

     6tags

     指定Runner的标签(通常一个项目有很多Runner,依靠tag区分

     7artifacts

     指定Job的产出文件路径,如果该关键词设定,可以直接在pipeline页面下载该文件

     8when

     默认一个job只有在上一阶段所有job成功才会执行,通过when可以改,通常用来清理环境使用,以免失败后无法清理,有四种可选参数。

      on_success(上一阶段所有Job成功才执行)    

      on_failure(上一阶段任意Job失败就执行)

      always(总是执行)                          

      manual(此阶段由UI界面交互执行)

 

备注:以上纯属原创,学习来源为gitlab-runner官方中文文档、gitlab-runner英文文档、gitlab-ci英文文档。如需转载请注明出处,后续继续完善。



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
author-avatar
永久的花蕾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有