这是关于工作的总结,过去的三周一直在攻关一个技术难题,到今天为止绝大部分搞定了。所以,写一篇总结。
【背景】
在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不出局践行写作,欢迎你的加入:)
我花了三周的时间干嘛去了呢?编译gitlab v7.1.1版本使其支持aarch64架构
网友评论