我花了三周的时间干嘛去了呢?编译gitlab v7.1.1版本使其支持aarch64架构

这是关于工作的总结,过去的三周一直在攻关一个技术难题,到今天为止绝大部分搞定了。所以,写一篇总结。

【背景】

在centso 7.5 aarch64环境安装部署Gitlab,因为最新master分支的gitlab对于我们生产环境适配改动过多,虽然master相对很好部署,但我们没有选择。我们选择的是v7.1.1版本。

为什么gitlab v7.1.1版本在aarch64环境部署要花费这么久的时间呢?主要原因是它依赖的包libv8 1.8.1从架构上完全不支持arm64。并且没有对应的编译源码。

先贴libv8具体报错信息(说明,最新libv8分支已经支持了aarch64架构,所以在此就不写我在3.16.14.3版本的解决问题了。只写当时解决的几种思路和尝试):


为了让libv8 1.8.1版本支持aarch64架构,我尝试了下面几种思路:

gitlab我尝试过得几条路:

1,同事尝试编译gitlab7.1.1源码,发现依赖包libv8 3.16.14版本不支持aarch64。我接手后发现架构不支持,先熟悉ruby编译流程,修改libv8的架构,架构支持后,编译过程发现少了aarch64.release文件,后来定位发现源码中对x86和32位arm有单独的文件来编译生成release文件。修改arm以支持aarch64,过程嵌套汇编报错等问题,屏蔽后出现100+的函数找不到定义,初步定位是当前系统头文件不一致。

2 也可以从x86修改来适配aarch64,我没有尝试。猜测这条路比直接修改arm代码容易。

3 从opensuse获取gitlab source rpm包,安装后编译,存在200+个依赖包,安装第一个依赖包共引出20+个rpm,有的包找不到需要源码编译。用了一天,还没有安装完依赖。没有再试下去了

4 从阿里云,华为云和各高校的镜像库去找,找到的都是x86的。

5 从github下载源码编译,我用的7.1.stable版本,昨天编译遇到依赖包json源码报错,屏蔽后编译时还是从rubygem网站下载,而不是本地修改后的代码。


当然在安装gitlab过程中,除了libv8最大的问题,还是发现了许多ruby版本不适配的问题。具体如下:

1、Json 1.8.1 gem包编译过程报错

2、charlock_holmes-0.6.9.4.gem编译报错


解决过程:

Mv vendor/bundle/ruby/2.3.0/cache/charlock_holmes-0.6.9.4.gem /root/small7

Cd /root/small7

Gem unpack charlock_holmes-0.6.9.4.gem

Cd charlock_holmes-0.6.9.4

修改ext/charlock_holmes/extconf.rb文件:

Dir.chdir(dir) do

sys("wget -O config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD'")

    sys("wget -O config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD'")

    sys("./configure --prefix=#{CWD}/dst/ --disable-shared --enable-static --with-pic")

      sys("patch -p0 < ../file-soft-check.patch")

      sys("make -C src install")

      sys("make -C magic install")

  end

重新打包gem,需要注意,需要先初始化gem目录为git库,否则文件无法加入gem,原因是.gemspec文件中,使用git ls-files列出目录下文件:

  git init

  git add .-f加-f的原因是存在tar包,不加的会默认不会添加tar文件

  git commit -m "Init"

  bundle build charlock_holmes.gemspec

将构建出来的gem包,放到/home/git/gitlab/vendor/cache目录下;


使用bundle install --path vendor/bundle --without development test mysql aws安装,会优先使用vendor/cache下的gem

3、Eventmachine1.0.3编译报错


报错过程非常长,下面我们只把关键信息贴图


即rb_thread_select函数没有找到申明。

解决步骤:

mv vendor/bundle/ruby/2.3.0/cache/eventmachine-1.0.3.gem /root/small/

Cd /root/small7

gem unpack eventmachine-1.0.3.gem

在github网站搜索ruby,找到第一个ruby/ruby工程,在工程里搜上面报错的函数,发现原来在2.2.0的ruby版本这个函数就换名字了。

文档如下:

https://github.com/ruby/ruby/blob/c5eb24349a4535948514fe765c3ddb0628d81004/doc/NEWS-2.2.0


我们按照上面的变更替换函数及函数参数数据类型。

ext/em.cpp和ext/em/h两个文件均涉及。修改过程不贴了,就是C语言实现。替换函数和结构体,注意结构体的变化就不会有问题。

Git init

Git add . -f

Git commit -m “init”

Gem build eventmachine.gemspec

Cp eventmachine*.gem /home/git/gitlab/vendor/cache

4、Nokojiri gem包编译报错

Nokojiri编译过程依赖libxml2 2.8.0版本,因为系统中已经安装了libxml2 2.9版本,卸载依赖的包数量过大,所以不建议卸载libxml2 2.9版本后安装2.8版本。

我们修改nokojiri自带的libxml2 2.8.0版本,使他能够识别当前系统。

报错如下:



Find / -name libxml2-*.tar.gz

Cp /home/git/git/vendor/bundle/ruby/2.3.0/xxxx/libxml2-2.8.1.tar.gz /root/small

Tar -zxvf libxml2-2.8.1.tar.gz

./configure

出现报错,configure: error: cannot guess build type; you must specify one。这是因为当前环境的架构不支持,需要手动添加。


修改config.sub文件,添加aarch64架构。如下图所示

重新压缩libxml2包,拷贝到nokojiri gem解压目录,注意,因为nokojiri解压后没有gemspecc,所以请使用bundle gem nokojiri命令自己生成一个吧,执行命令后gemspecc在 nokojiri目录下,拷贝到当前目录即可。之后执行下面命令就可以重新打包:

Git init

Git add . -f

Git commit

Gem build nokojiri.gemspec

Cp nokojiri*.gem /home/git/gitlab/vendor/cache

5、kgio gem编译报错

报错信息如下:



查看https://github.com/ruby/ruby,知道TRAP_BEG和TRAP_END已经在ruby 2.2.2版本替换为rb_thread_call_without_gvl()函数了。

修改

./ext/kgio/accept.c:    TRAP_BEG;

./ext/kgio/tryopen.c:  TRAP_BEG; /* for FIFO */

两处。

执行 VERSION=2.8.1 gem build kgio.gemspec编译gem包。(注意VERSION必须要有)

执行报错如下:


查看错误,是因为kgio包依赖wrongdoc包,所以我们先来安装wrongdoc包。

Wget https://rubygems.org/downloads/wrongdoc-1.8.1.gem

Gem install wrongdoc-1.8.1.gem

安装完后,再次打包kgio。将打包好的kgio gem包拷贝到/home/git/gitlab/vendor/cache目录。



一边工作一边总结,让过程可视化,让结果共分享。我在007不出局践行写作,欢迎你的加入:)

图片发自简书App

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容