前言:
工作需要来屠,原先的一臺專門負(fù)責(zé)打包的機(jī)器要被調(diào)走虑椎,所以另起爐灶,把需要打包的項(xiàng)目遷移到新機(jī)器俱笛,本篇文章講述了遷移過程遇到的一些問題以及解決的方法捆姜。
1.gitlab-runner
首先還是簡單說一下什么是gitlab-runner,官網(wǎng)是這么描述的:
GitLab Runner is the open source project that is used to run your jobs and send the results back to GitLab. It is used in conjunction with GitLab CI, the open-source continuous integration service included with GitLab that coordinates the jobs.
也就是說gitlab-runner是配合gitlab-ci進(jìn)行使用的迎膜。一般地泥技,gitlab里面的每一個(gè)工程都會(huì)定義一個(gè)屬于這個(gè)工程的軟件集成腳本,用來自動(dòng)化地完成一些軟件集成工作磕仅。
當(dāng)這個(gè)工程的倉庫代碼發(fā)生變動(dòng)時(shí)珊豹,比如有人push了代碼或者分支合并,gitlab就會(huì)將這個(gè)變動(dòng)通知gitlab-ci榕订。這時(shí)gitlab-ci會(huì)找出與這個(gè)工程相關(guān)聯(lián)的runner店茶,并通知這些runner把代碼更新到本地并執(zhí)行預(yù)定義好的執(zhí)行腳本。
2.gitlab-runner安裝和注冊
安裝
注冊
這塊廢話不多說劫恒,直接看官方文檔贩幻,根據(jù)系統(tǒng)一次操作一下即可
3.問題描述
新機(jī)器到手后,把機(jī)器上所有的軟件環(huán)境統(tǒng)統(tǒng)更新了個(gè)遍,升級到macOS High Sierra段直,ruby 升級到2.4等等吃溅。然后開始安裝gitlab-runner緊接著注冊到gitlab-ci,一切的一切都看似很平靜很正常鸯檬。
然后開始試跑腳本,然后莫名其妙的出錯(cuò)了决侈,log如下:
Running with gitlab-runner 10.3.0 (5cf5e19a)
on xxx的MacBook pro (0dee7c95)
Using Shell executor...
Running onxxxdeMacBook-Pro.local...
Cloning repository...
Cloning into '/Users/xxx/builds/0dee7c95/0/iOS-Team/xxx-test'...
Checking out 0766deb4 as develop...
Skipping Git submodules setup
ERROR: Job failed: exit status 1
clone之后立馬出問題,一臉懵逼...這誰看得懂出的啥錯(cuò)喧务?涼了涼了~
4.問題分析
剛開始以為是clone出問題赖歌,打開build的目錄文件,里面所有文件目錄都是完整的功茴,直接打開項(xiàng)目工程都能順暢的跑起來庐冯。
嘗試用這些log輸出,Google了一下坎穿,能搜到好幾個(gè)Stack Overflow的結(jié)果展父,但是很遺憾,都未能解決問題玲昧。
那么問題到底出在哪栖茉?
首先的換一個(gè)思考問題的角度:gitlab-ci上的log看不出,搜不出什么端倪孵延,那么gitlab-runner呢吕漂?畢竟跑腳本是gitlab-runner的事情,它自己最清楚了尘应。
于是在打包機(jī)器終端里面輸入gitlab-runner --debug run
這樣runner的每一步操作都能看的到惶凝。
Checking for jobs... nothing runner=0dee7c95
Feeding runners to channel builds=0
Checking for jobs... received job=402 repo_url=http://gitlab.xxxx.cn/iOS-Team/xxx-test.git runner=0dee7c95
Failed to requeue the runner: builds=1 runner=0dee7c95
Running with gitlab-runner 10.3.0 (5cf5e19a)
on xxx的MacBook pro (0dee7c95) job=402 project=47 runner=0dee7c95
Shell configuration: environment: []
dockercommand:
- sh
- -c
- "if [ -x /usr/local/bin/bash ]; then\n\texec /usr/local/bin/bash --login\nelif [
-x /usr/bin/bash ]; then\n\texec /usr/bin/bash --login\nelif [ -x /bin/bash ]; then\n\texec
/bin/bash --login\nelif [ -x /usr/local/bin/sh ]; then\n\texec /usr/local/bin/sh
--login\nelif [ -x /usr/bin/sh ]; then\n\texec /usr/bin/sh --login\nelif [ -x /bin/sh
]; then\n\texec /bin/sh --login\nelse\n\techo shell not found\n\texit 1\nfi\n\n"
command: bash
arguments:
- --login
passfile: false
extension: ""
job=402 project=47 runner=0dee7c95
Using Shell executor... job=402 project=47 runner=0dee7c95
Waiting for signals... job=402 project=47 runner=0dee7c95
WARNING: Job failed: exit status 1 job=402 project=47 runner=0dee7c95
Submitting job to coordinator... ok job=402 runner=0dee7c95
Feeding runners to channel builds=0
Checking for jobs... nothing runner=0dee7c95
以上的log是為了復(fù)現(xiàn)問題,把相關(guān)配置改成問題解決之前犬钢,而操作出來的苍鲜,可能和問題解決之前的log有些出入。根據(jù)這些log玷犹,再次Google混滔,果然找到了相關(guān)信息:
https://gitlab.com/gitlab-org/gitlab-runner/issues/114
真相大白,原來問題出在RVM上箱舞。
RVM相信開發(fā)者都不陌生遍坟,它是一個(gè)便捷的多版本ruby環(huán)境的管理和切換工具。有一個(gè)注意點(diǎn)晴股,MacOS本身是集成ruby環(huán)境的愿伴,不同版本的系統(tǒng)默認(rèn)集成的ruby版本也不一樣。所以日常開發(fā)中电湘,我們會(huì)根據(jù)需要對ruby環(huán)境統(tǒng)一管理隔节。這個(gè)時(shí)候就會(huì)用到rvm了鹅经。通過rvm可以升級管理ruby。通過which ruby
命令可以查看目前使用的是什么ruby怎诫。比如/Users/xxx/.rvm/rubies/ruby-2.4.1/bin/ruby
輸出的路徑包含了.rvm
就說明目前使用的是rvm下的ruby瘾晃。
到此為止確定了目前使用的是rvm的ruby,在深入定位一下幻妓,問題是出在rvm重新定義了cd
命令
$ type cd
cd is a function
cd ()
{
__zsh_like_cd cd "$@"
}
$ unset cd
$ type cd
cd is a shell builtin
所以蹦误,clone下來一直出錯(cuò)的原因是cd命令被重定義了,導(dǎo)致路徑切換的不對肉津,無法執(zhí)行命令强胰,進(jìn)而報(bào)錯(cuò)。這就解釋了為什么gitlab-runner上輸出的log exec /bin/sh --login\nelse\n\techo shell not found\n\texit 1\nfi\n\n
5.問題解決
知道了原因name如何解決呢妹沙?剛剛的問題里面也給出了方案
在.bashrc
或 .bash_profile
加上unset cd
偶洋。
操作如下:
1、打開terminal(終端)
2距糖、cd ~ ( 進(jìn)入當(dāng)前用戶的home目錄)
3玄窝、open .bash_profile (打開.bash_profile文件,如果文件不存在就 創(chuàng)建文件:touch .bash_profile 編輯文件:open -e bash_profile)
4悍引、直接更改彈出的.bash_profile文件內(nèi)容
5恩脂、command + s 保存文件,然后關(guān)閉
6吗铐、在terminal(終端)中輸入 source .bash_profile (使用剛才更新之后的內(nèi)容)
或者直接finder里面找东亦,用文本編輯器修改一下杏节。
等等.bashrc
.bash_profile
又是什么鬼唬渗? unset呢?
百度了一下這些得到如下信息:
profile\bashrc\bash_profile之間的區(qū)別和聯(lián)系:
/etc/profile 每個(gè)用戶奋渔,首次登錄時(shí)被執(zhí)行镊逝;
/etc/bashrc 每個(gè)運(yùn)行bash shell的用戶都執(zhí)行此文件,當(dāng)bsh被打開時(shí)嫉鲸,該文件被讀瘸潘狻;
~/.bash_profile 專用于本用戶的shell信息玄渗,僅被執(zhí)行一次座菠;
~/.bashrc 文件包含本用戶的bsh信息,登錄及每次打開shell時(shí)被讀取藤树。
unset指令:刪除指定的shell變量或函數(shù)
【語 法】unset [-fv][變量或函數(shù)名稱]
【功能介紹】該指令作用主要是刪除指定的shell變量和函數(shù)浴滴。
因?yàn)間itlab-runner注冊的時(shí)候runner executor用的shell,所以shell腳本的語法是適用的岁钓。使用unset cd
就意味著把rvm重新定義的cd方法刪除升略,這樣路徑切換的時(shí)候就正常了微王。gitlab-runner都能正常跑起來了。
6.總結(jié)
1.思考問題角度要全面品嚣,一套完整的業(yè)務(wù)流程里出現(xiàn)問題炕倘,可以根據(jù)不同角度翰撑,不同端想錯(cuò)誤點(diǎn)靠近罩旋,逐個(gè)的排查;
2.多關(guān)注debug信息眶诈,活用debug輸出的log搜索信息瘸恼,盡量谷歌搜索,百度太垃圾册养;
3.shell腳本是個(gè)神奇的東西东帅,工作之余可以多學(xué)習(xí)學(xué)習(xí)。