我花了三周的时间干嘛去了呢?编译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版本的解决问题了。只写当时解决的几种思路和尝试):


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

为了让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编译报错

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


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

解决过程:

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编译报错


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

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


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

即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版本,使他能够识别当前系统。

报错如下:


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


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

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。这是因为当前环境的架构不支持,需要手动添加。


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

修改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编译报错

报错信息如下:


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


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

查看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必须要有)

执行报错如下:


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

查看错误,是因为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不出局践行写作,欢迎你的加入:)

我花了三周的时间干嘛去了呢?编译gitlab v7.1.1版本使其支持aarch64架构_第12张图片
图片发自App

你可能感兴趣的:(我花了三周的时间干嘛去了呢?编译gitlab v7.1.1版本使其支持aarch64架构)