最近在自搭的gitlab服务器上加上了ci,大部份操作都比较顺利,但是也碰到一些问题抓狂,记录如下。

1、关于一个project配多个runner:在gitlab-ci里是支持的,但是含义确有点反常,

我之前认为是每个runner都会独立运行所有job,这样一来可以在不同的os上添加runner,以达到多平台测试的目的。

然而gitlab-ci实则对多runner的处理是当成一个资源池,由空闲runner来挑选job,那么build和test两个job可能会在不同的runner上运行,导致依赖错误。

如果只是为了多平台测试目的,可以把每个job复制多份,每份给一个不同的tag(os名),然后各os上的runner也有相应的tag,那么在分配时就会各取所需。

但是这样仍然有问题:

一是复制出来的那么多job已经在那里了,每轮pipeline必须都执行完,但一旦有一个runner不在线(比如说临时挂了或取消了),对应os的job就没人执行,整个pipeline就无法完成。

二是没有办法手动挑选部份os测试,可能某次提交只改了linux平台上相关代码,但是也要把所有平台测试runner跑一遍,非常费事,现在在cm msg里可以用[ci skip]来跳过整轮pipeline,但却没有其它指令来选择(或只跳过)部份jobs。

这一系列问题在gitlab官网上已经很多人提了issue及相关建议,希望在之后版本能改进吧。

https://gitlab.com/gitlab-org/gitlab-ce/issues/18041

https://gitlab.com/gitlab-org/gitlab-ce/issues/24610

2、如何让runner在本机启动一个长进程(不关闭的),比如说deploy job,就在本机部署运行?

问题在于,runner每收到一个job,运行相应的命令,必须要等到该命令完成,以向上汇报运行结果,如果命令里启动了其它进程,也就必须等那些进程结束,一个长运行进程,自然就会卡住整个pipeline了。对于一些常用分离子进程的招数,如前面加nohup,后面加&,都不管用,其原因在于,runner监视自己启动的进程是用进程组的方式,即使脱离父子关系,组仍然存在:

图中java进程是在运行的测试程序,它和上面启动它的各级bash的pgid是一样的。(https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/2231)

解决这个问题的简单办法,就是让目标进程以service方式启动,这样就彻底脱离了runner的进程组。(当然还有其它方案,最后再说,先把最难的一路回顾完)

然而跟着这一思路走下去,继续遇到各种问题:

a、首先做一个service用来启动目标进程,这是最基本的一步了。在ubuntu上,把控制脚本放到/etc/init.d里,用update-rc.d来注册服务。

b、要启停service,必须有sudo权限,然而runner在后台运行并没有终端用来输密码,怎么办?原来/etc/sudoers里面还可以配置NOPASSWD选项,可以让sudo不输密码,长姿势了。

c、用service来运行进程,用户是root,实际上又以-u方式切换成gitlab-runner这个专用账号,然而它是没有桌面的,因为登录桌面用的是自己的开发人员账号,要运行的是一个java awt程序,没有桌面的话会报错运行不起来,怎么办?原来可以通过共享.Xauthority文件的方式,让其它账号连接自己的桌面,具体则是要在运行java awt之前先导出DISPLAY和XAUTHORITY两个环境变量:

又长姿势了。

--补充:也不用非要链接别人的Xauthority文件,可以让user1用xauth list显示有效的cookie,user2通过xauth add :0 . cookie将之添到自己的Xauthority文件中

3、程序运行起来了,但是依赖的一些外部文件(不在git仓库)怎么办?

这些外部文件,可能还会变化,不能每次都手动去拷,需要自动同步过来。

目前办法是利用坚果云,开发者在自己电脑上,把需要的依赖文件都放在坚果云同步文件夹里,这样每当有更新,就会自动上传到坚果云服务器。

在ci机器上装一个坚果云客户端当然是最简单,但是也可以用挂载一个davfs的方式来通过webdav协议从坚果云服务器拉数据,更便于命令行操作。

要注意的是有些webdav服务器可能返回头有问题导致davfs挂载失败,这时可在配置文件中加上

ignore_dav_header 1

解决之。

4、程序运行完,留下一堆生成的文件,有些不要清理(留给下一阶段用),有些要清理,如何处理?

5、关于gitlab-ci-multi-runer和gitlab-runner的运行用户问题

https://stackoverflow.com/questions/37187899/change-gitlab-ci-runner-user

gitlab-ci配置疑难备忘的更多相关文章

  1. (网页的缓存控制)HTML配置no-cache(备忘) “Cache-control”常见的取值

    HTML配置no-cache(备忘) No-cache配置 html表头如下 <meta http-equiv="Content-Type" content="te ...

  2. ExtJs4常用配置方法备忘

    viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...

  3. debian文本配置网络备忘:/etc/network/interfaces

    我装了wheezy有gnome3,xfce4: 郁闷的是,不论在gnome还是xfce4中 我都无法图形登录或者切换用户到root: 而且我无法在普通用户下图形修改网络配置: 我也搜索不到启用root ...

  4. spring 部分配置内容备忘

    1.spring定时器简单配置: <bean name="taskJob" class="com.netcloud.mail.util.TaskJob"& ...

  5. iis8.0配置 使用备忘 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容

    由于对iis的了解度不够,使用中总会碰到这样那样的问题,在这我先开个头,遇到问题再一一更新: 我用的是iis8; 1.发布到iis服务器下的网站你自己可以访问,局域网的其他机器不能? 答:是否开放了对 ...

  6. BitnamiRedmine配置邮件系统备忘

    前几天安装的Redmine邮件系统存在问题,需要换一个,方法记录如下: 修改配置文件: cd ~/redmine/apps/redmine/htdocs/config vi configuration ...

  7. MyEclipse 2015 安装到配置一站式备忘

    目录 h1 2121 h1 2121

  8. 手把手详解持续集成之GitLab CI/CD

    一.环境准备 首先需要有一台 GitLab 服务器,然后需要有个项目:这里示例项目以 Spring Boot 项目为例,然后最好有一台专门用来 Build 的机器,实际生产中如果 Build 任务不频 ...

  9. [转] 基于Gitlab CI搭建持续集成环境

    [From] https://blog.csdn.net/wGL3k77y9fR1k61T1aS/article/details/78798577 前言 本文是在12月12号迅雷@赵兵在前端早读课第三 ...

随机推荐

  1. js错误Cannot set property 'action' of null

    Cannot set property 'action' of null [自己解决问题答案] 应该放到form里面 [网上答案]是页面无法加载完毕执行代码.可以把获取元素等一系列的操作放在 wind ...

  2. SSM框架(1)

    Spring MVC Framework有这样一些特点: 它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件.并且和Spring提供的其他基础结构紧密集成. 不依 ...

  3. django中的@login_required

    转:http://www.cnblogs.com/ccorz/p/Django-zhong-loginrequired-yong-fa-jian-jie.html 1.网站开发时的登录需求: ===用 ...

  4. 关于 FastAdmin 中的 trait

    关于 FastAdmin 中的 trait 来自ThinkPHP5 官网的介绍 1 trait是一种为类似 PHP 的单继承语言而准备的代码复用机制.trait为了减少单继承语言的限制,使开发人员能够 ...

  5. (转)Android 50道面试题总结(大家看看吧)

    1. 方法重载与覆盖的区别?(Overload与Override的区别)2. String 和StringBuffer的区别3. 字符串“abcde”通过写一个函数不让调用第三方的字符串,实现一个字符 ...

  6. 初识C++ 中的STL

    首先,STL是指standard template library,即C++标准模板库,也叫泛型库. STL提供了三种类型的组件:容器,迭代器和算法,他们都支持泛型程序设计标准. (一)容器: 分为: ...

  7. Indy10收发Hotmail邮件

    hotmail开放了pop3,可以使用客户端工具收取邮件了. POP 服务器: pop3.live.com (端口 995)需要 POP SSL?: 是的用户名: Windows Live ID, 比 ...

  8. 学习FPGA有必要写SDRAM控制器吗?

    在学习FPGA的过程中,注意是在学习过程中,联系FPGA的使用技巧,强烈建议尝试设计一个SDRAM控制器,不要使用IP核. 学习SDRAM控制器设计,能让你掌握很多知识. 更好的使用状态机去精准控制时 ...

  9. java里的switch循环--你妹考试落榜了

    总结:switch循环,不用break.那么程序每一个case都会运行到,直到遇到break停止 package com.aa; //格子区域 //3行3列的格子 public class Bu { ...

  10. 生成器+列表生成式,生成器可以节省内存,随时调取函数运行,以及实现多线程运行函数,__next__()和.send(参数)的区别,a,b=b,a+b其实是元祖的用法,出现异常状态用try...except StopIteration来处理

    列表生成式:是代码更简洁. 也可以是函数,比如func(i) 生成器:generator 列表生成式,是中括号,改成小括号,就是生成器: 如果你用列表生成式,生成一亿个数据:这里会卡好久,会生成一亿个 ...