Jenkins X + Gitlab 构建CI 持续集成环境
这里记录一些我这半个月尝试 JenkinX (以下称 jx) 所踩的坑( 大部分是墙的问题 ) , 希望对后来的人有一些参考
安装
安装的拦路虎就是镜像, 由于镜像都在gcr上面, 所以统统拉取镜像失败
解决方案: 所有node在启动docker服务时加上代理
Environment="HTTPS_PROXY=http://your_proxy:port/"
设置好代理后, 所有的镜像都拉下来了, 等会, 为什么有几个pod就是起不来? Mongo jenkins registry nexus , 仔细看describe , 好像是没找到pv
解决方案: 设置一个storageclass , 按照这个storageclass 设置若干个pv , 我比较弱鸡, 在硬盘上建了几个文件夹,设置了几个静态的PV, 如果是静态的PV ,至少要有一个100G , 一个 30G ,以及3个8G 的pv, 这些pv是 registry等做持久化用的.
这两步做完之后, jx 的app们应该就可以起来了.
使用(用jx 开始quickstart)
使用第一反应是按照文档说明, 来一个quickstart, 输入命令
Jx quickstart
第一反应就不对了, 怎么回事, 怎么提示在github上建项目? 我要gitlab啊
解决方案: 加上 git provider 参数 jx quickstart --git-provider-url=http://gitlab.you-domain.com
但即使你用了这个参数, 它依然会要你的github api-key , 看了文档, 意思是quickstart是从他们的企业级github上clone下来的, 要用就得有github key.
编译
终于项目建好了, 开始愉快的编译! 说是愉快, 一点也不愉快, 因为这编译, 要么就提示 helm 未初始化, 提示你用 helm init --client-only 初始化, 要么就直接卡住了, 一卡就是半小时, 十分折磨.可能二十次能成功一次吧.
这个问题困扰了我很久, 最后终于找到原因:
原因1: 在helm init 时会默认add stable repo , 并且拉取一遍repo 里的列表, 相当于 yum makecache , 但是问题就出在repo 是在谷歌的存储服务上面, 所以就会出现卡顿, 甚至init 失败的问题
解决方案: 使用azure.cn 提供的镜像, 在所有编译动作开始前, 抢先使用 stable-repo-url 参数, 指定 azure.cn 的镜像用来初始化
可以在Jenkinsfile 中增加一个step 用来初始化helm , 命令如下
sh 'helm init --stable-repo-url
http://mirror.azure.cn/kubernetes/charts/'
原因2: jx 的代码中, 在所有动作开始前, 会把遗漏的repo全都添加上, 包括一个 jx项目组放在公网的一个repo chartmuseum.jenkinx-x.io , 你没有猜错, 这个repo也是在谷歌的存储服务上, 所以也GG了, 我尝试了一下在构建配置里把所有涉及到这个repo的chart 全部换成了自己在内部搭的镜像站, 但是他还是会尝试add 这个repo , 所以构建依然卡顿.
最终我的解决方案: 在内部搭一个镜像站, 并修改k8s 集群内部的coreDNS 配置, 把DNS 强行指到自己的镜像站内, 这样也不需要改代码了. 只要定期同步镜像站就可以了. 具体修改DNS 的方法可以参考其他教程, 关键词是 coreDNS hosts
到这里我们离胜利已经很接近了, 但是还是发现, 项目编译不过去, 环境项目编译都通过了, 项目编译这边说还没检测到最新的commit状态.
原因是jx对gitlab的支持还不完善, 在jenkins完成构建后, 构建状态不能同步到gitlab上去, 不能像github那样commit旁边有个绿色的小勾.
解决方案: 使用Jenkins的gitlab插件, 自己在完成编译后更新commit状态, jx 用的jenkins自带gitlab 插件, 只需要做一些设置即可 :
- 在gitlab设置里的系统设置里, 添加一个gitlab账号, 建议添加一个管理员账号
- 修改jenkins文件, 如下:
pipeline { options { disableConcurrentBuilds() gitLabConnection('Gitlab')
// 这里括号里填你添加的账号名字(设置里的第一排)
} agent { label "jenkins-maven" }
// 这下面定义在成功和失败的时候更新状态, 详细的参考 https://github.com/jenkinsci/gitlab-plugin
post { failure { updateGitlabCommitStatus name: 'state', state: 'failed' } success { updateGitlabCommitStatus name: 'state', state: 'success' }
// 详细的实际steps 和stage 略... }
来自 <https://github.com/jenkins-x/jx/issues/445>
到这里, jx 核心功能( CI 自动发布到指定namespace )就完全可用了! 恭喜!
( 目前还没有尝试jx 的preview功能, 按理说这个是支持并行开发的大神器, 待我后续探索一下
写完了发现其实更像是给自己写的备忘录, 有空了再把具体的报错信息放上来, 方便检索.
🌚🌚🌚的最新日记 · · · · · · ( 全部 )
- 如何使用生成式 AI (12人喜欢)
- 泰国旅游还不错! (73人喜欢)
热门话题 · · · · · · ( 去话题广场 )
- 歌手2024直播 4.0万次浏览
- 给父母写一封信,你会写些什么? 6.2万次浏览
- 你居住的地方有什么让你反感的习俗吗? 14.3万次浏览
- 那些叹为观止的人体精妙设计 26.9万次浏览
- 记忆里雪下得最美的那个冬天 19.2万次浏览
- 养父母与子女的爱恨情仇 5.7万次浏览