本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或從新修改使用,但須要註明來源。 署名 4.0 國際 (CC BY 4.0)html
本文做者: 蘇洋linux
建立時間: 2019年08月04日 統計字數: 10252字 閱讀時間: 21分鐘閱讀 本文連接: soulteary.com/2019/08/04/…git
從源碼安裝 GitLab 你或許據說過,可是從源碼安裝 GitLab Runner ,或許這將是你聽到的第一篇相關博客。github
最近遇到一個問題,須要手動編譯構建 GitLab Runner,而官方文檔陳舊、命令過期,若是按照官方錯誤的指引搞下去,不免會浪費不少時間,並且得不到你想要的結果。golang
若是你也有相似需求,跟隨本篇文章,大概十分鐘左右就能折騰出一個屬於你本身的 GitLab Runner。docker
此次的前置準備真的很少,大概就須要兩樣:編程
Ubuntu 18.04 64位
在編譯 GitLab Runner 以前,咱們須要製做編譯工具,而編譯工具依賴定製的系統環境,因此第一步就是簡單折騰一個系統環境。ubuntu
安裝基礎環境的第一步,無非是升級系統環境、安裝必要依賴。vim
這裏推薦安裝 git
依賴,而非官方文檔中註明的 git-core
,詳細緣由見這篇文章。windows
apt update && apt upgrade -y
apt install software-properties-common git mercurial unzip vim binfmt-support qemu-user-static -y
複製代碼
與其餘軟件不一樣的是,這裏必須安裝 Docker ,由於後面的構建過程當中會使用到 Docker (哪怕你編譯的不是 Runner 的 Docker 鏡像)。
截止文章發佈,使用 Docker version 19.03.1
並沒有任何異常。若是你使用的是阿里雲,可使用下面的命令進行安裝,更詳細的內容,能夠參考以前的文章。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt install -y docker-ce
複製代碼
因爲軟件是使用 Go
語言編寫,因此安裝 Go
語言運行時必不可少。但惋惜的是,咱們沒法使用最新的 Go 1.12
,必須老老實實使用 2017 年推出的 1.8.7
。
wget https://storage.googleapis.com/golang/go1.8.7.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go*-*.tar.gz
echo "export GOPATH=$HOME/Go" >> ~/.profile
echo "export PATH=$PATH:$GOPATH/bin:/usr/local/go/bin" >> ~/.profile
source ~/.profile
複製代碼
接下來須要作的事情是獲取軟件包源碼、以及開發須要使用的依賴包。
go get gitlab.com/gitlab-org/gitlab-runner
cd $GOPATH/src/gitlab.com/gitlab-org/gitlab-runner/
go get -u github.com/jteeuwen/go-bindata/...
複製代碼
在上述命令都執行完畢,且沒有報錯的狀況下,繼續執行下面的語句,就能得到可用的編譯工具啦。
make helper-build helper-docker
複製代碼
若是你比較順利,將會看到相似下面的日誌:
# make helper-build helper-docker
go get github.com/mitchellh/gox
gox -osarch=windows/amd64 -ldflags "-X gitlab.com/gitlab-org/gitlab-runner/common.NAME=gitlab-runner -X gitlab.com/gitlab-org/gitlab-runner/common.VERSION=12.2.0~beta.1803.g41d5c6ad -X gitlab.com/gitlab-org/gitlab-runner/common.REVISION=41d5c6ad -X gitlab.com/gitlab-org/gitlab-runner/common.BUILT=2019-08-01T16:59:49+0000 -X gitlab.com/gitlab-org/gitlab-runner/common.BRANCH=master -s -w" -output=dockerfiles/build/binaries/gitlab-runner-helper.x86_64-windows gitlab.com/gitlab-org/gitlab-runner/apps/gitlab-runner-helper
Number of parallel builds: 7
--> windows/amd64: gitlab.com/gitlab-org/gitlab-runner/apps/gitlab-runner-helper
gox -osarch=linux/amd64 -ldflags "-X gitlab.com/gitlab-org/gitlab-runner/common.NAME=gitlab-runner -X gitlab.com/gitlab-org/gitlab-runner/common.VERSION=12.2.0~beta.1803.g41d5c6ad -X gitlab.com/gitlab-org/gitlab-runner/common.REVISION=41d5c6ad -X gitlab.com/gitlab-org/gitlab-runner/common.BUILT=2019-08-01T16:59:49+0000 -X gitlab.com/gitlab-org/gitlab-runner/common.BRANCH=master -s -w" -output=dockerfiles/build/binaries/gitlab-runner-helper.x86_64 gitlab.com/gitlab-org/gitlab-runner/apps/gitlab-runner-helper
Number of parallel builds: 7
--> linux/amd64: gitlab.com/gitlab-org/gitlab-runner/apps/gitlab-runner-helper
gox -osarch=linux/arm -ldflags "-X gitlab.com/gitlab-org/gitlab-runner/common.NAME=gitlab-runner -X gitlab.com/gitlab-org/gitlab-runner/common.VERSION=12.2.0~beta.1803.g41d5c6ad -X gitlab.com/gitlab-org/gitlab-runner/common.REVISION=41d5c6ad -X gitlab.com/gitlab-org/gitlab-runner/common.BUILT=2019-08-01T16:59:49+0000 -X gitlab.com/gitlab-org/gitlab-runner/common.BRANCH=master -s -w" -output=dockerfiles/build/binaries/gitlab-runner-helper.arm gitlab.com/gitlab-org/gitlab-runner/apps/gitlab-runner-helper
Number of parallel builds: 7
--> linux/arm: gitlab.com/gitlab-org/gitlab-runner/apps/gitlab-runner-helper
docker build -t gitlab/gitlab-runner-helper:x86_64-41d5c6ad -f dockerfiles/build/Dockerfile.x86_64 dockerfiles/build
Sending build context to Docker daemon 40.32MB
Step 1/6 : FROM alpine:3.9
3.9: Pulling from library/alpine
e7c96db7181b: Pull complete
Digest: sha256:7746df395af22f04212cd25a92c1d6dbc5a06a0ca9579a229ef43008d4d1302a
Status: Downloaded newer image for alpine:3.9
---> 055936d39205
Step 2/6 : RUN apk add --no-cache bash ca-certificates git git-lfs miniperl && ln -s miniperl /usr/bin/perl
---> Running in 93e1c5a12b93
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
(1/14) Installing ncurses-terminfo-base (6.1_p20190105-r0)
(2/14) Installing ncurses-terminfo (6.1_p20190105-r0)
(3/14) Installing ncurses-libs (6.1_p20190105-r0)
(4/14) Installing readline (7.0.003-r1)
(5/14) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
(6/14) Installing ca-certificates (20190108-r0)
(7/14) Installing nghttp2-libs (1.35.1-r0)
(8/14) Installing libssh2 (1.8.2-r0)
(9/14) Installing libcurl (7.64.0-r2)
(10/14) Installing expat (2.2.7-r0)
(11/14) Installing pcre2 (10.32-r1)
(12/14) Installing git (2.20.1-r0)
(13/14) Installing git-lfs (2.5.1-r2)
Executing git-lfs-2.5.1-r2.post-install
Git LFS initialized.
(14/14) Installing miniperl (5.26.3-r0)
Executing busybox-1.29.3-r10.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 42 MiB in 28 packages
Removing intermediate container 93e1c5a12b93
---> cf8c23304de7
Step 3/6 : RUN git lfs install --skip-repo
---> Running in cdd487902490
Git LFS initialized.
Removing intermediate container cdd487902490
---> 995fbdc82d24
Step 4/6 : COPY ./scripts/ /usr/bin
---> d1a8aabbcd3c
Step 5/6 : COPY ./binaries/gitlab-runner-helper.x86_64 /usr/bin/gitlab-runner-helper
---> fcb3bbe621aa
Step 6/6 : RUN echo 'hosts: files dns' >> /etc/nsswitch.conf
---> Running in d5a9a71bbe2f
Removing intermediate container d5a9a71bbe2f
---> 73b181e7c05a
Successfully built 73b181e7c05a
Successfully tagged gitlab/gitlab-runner-helper:x86_64-41d5c6ad
docker rm -f gitlab-runner-prebuilt-x86_64-41d5c6ad
Error: No such container: gitlab-runner-prebuilt-x86_64-41d5c6ad
Makefile.runner_helper.mk:55: recipe for target 'out/helper-images/prebuilt-x86_64.tar' failed
make: [out/helper-images/prebuilt-x86_64.tar] Error 1 (ignored)
docker create --name=gitlab-runner-prebuilt-x86_64-41d5c6ad gitlab/gitlab-runner-helper:x86_64-41d5c6ad /bin/sh
be14d18aa9153578b35e7c58fce754093b89d6b50228c02baeaa440c753d723a
docker export -o out/helper-images/prebuilt-x86_64.tar gitlab-runner-prebuilt-x86_64-41d5c6ad
docker rm -f gitlab-runner-prebuilt-x86_64-41d5c6ad
gitlab-runner-prebuilt-x86_64-41d5c6ad
xz -f -9 out/helper-images/prebuilt-x86_64.tar
docker build -t gitlab/gitlab-runner-helper:arm-41d5c6ad -f dockerfiles/build/Dockerfile.arm dockerfiles/build
Sending build context to Docker daemon 40.32MB
Step 1/6 : FROM multiarch/alpine:armhf-v3.9
armhf-v3.9: Pulling from multiarch/alpine
d2a76f42393b: Pull complete
0e48aa23384e: Pull complete
Digest: sha256:138eab1a3a8b31f4d0df75a752b5fdda95612505522de9e9f8d2f96d3d97abd9
Status: Downloaded newer image for multiarch/alpine:armhf-v3.9
---> daef464a9e14
Step 2/6 : RUN apk add --no-cache bash ca-certificates git git-lfs miniperl && ln -s miniperl /usr/bin/perl
---> Running in a87dfb239af0
fetch https://uk.alpinelinux.org/alpine/v3.9/main/armhf/APKINDEX.tar.gz
fetch https://uk.alpinelinux.org/alpine/v3.9/community/armhf/APKINDEX.tar.gz
(1/15) Installing ncurses-terminfo-base (6.1_p20190105-r0)
(2/15) Installing ncurses-terminfo (6.1_p20190105-r0)
(3/15) Installing ncurses-libs (6.1_p20190105-r0)
(4/15) Installing readline (7.0.003-r1)
(5/15) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
(6/15) Installing ca-certificates (20190108-r0)
(7/15) Installing nghttp2-libs (1.35.1-r0)
(8/15) Installing libssh2 (1.8.2-r0)
(9/15) Installing libcurl (7.64.0-r2)
(10/15) Installing libgcc (8.3.0-r0)
(11/15) Installing expat (2.2.7-r0)
(12/15) Installing pcre2 (10.32-r1)
(13/15) Installing git (2.20.1-r0)
(14/15) Installing git-lfs (2.5.1-r2)
Executing git-lfs-2.5.1-r2.post-install
Git LFS initialized.
(15/15) Installing miniperl (5.26.3-r0)
Executing busybox-1.29.3-r10.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 40 MiB in 34 packages
Removing intermediate container a87dfb239af0
---> 919719cb8063
Step 3/6 : RUN git lfs install --skip-repo
---> Running in 292da8a82fff
Git LFS initialized.
Removing intermediate container 292da8a82fff
---> da40dc15d497
Step 4/6 : COPY ./scripts/ /usr/bin
---> 65df18912961
Step 5/6 : COPY ./binaries/gitlab-runner-helper.arm /usr/bin/gitlab-runner-helper
---> eb4e1e5c8f94
Step 6/6 : RUN echo 'hosts: files dns' >> /etc/nsswitch.conf
---> Running in 6478fa57668a
Removing intermediate container 6478fa57668a
---> 9dc701e1cac4
Successfully built 9dc701e1cac4
Successfully tagged gitlab/gitlab-runner-helper:arm-41d5c6ad
docker rm -f gitlab-runner-prebuilt-arm-41d5c6ad
Error: No such container: gitlab-runner-prebuilt-arm-41d5c6ad
Makefile.runner_helper.mk:55: recipe for target 'out/helper-images/prebuilt-arm.tar' failed
make: [out/helper-images/prebuilt-arm.tar] Error 1 (ignored)
docker create --name=gitlab-runner-prebuilt-arm-41d5c6ad gitlab/gitlab-runner-helper:arm-41d5c6ad /bin/sh
d6f6155e534039619d616944528205ec3e388c9eda51787cbae329fcec10ec03
docker export -o out/helper-images/prebuilt-arm.tar gitlab-runner-prebuilt-arm-41d5c6ad
docker rm -f gitlab-runner-prebuilt-arm-41d5c6ad
gitlab-runner-prebuilt-arm-41d5c6ad
xz -f -9 out/helper-images/prebuilt-arm.tar
複製代碼
當上面的步驟都就緒後,就能夠正式開始編譯構建 GitLab Runner 啦。
source ci/touch_make_dependencies
make build BUILD_PLATFORMS="-osarch='linux/amd64'"
複製代碼
-osarch
參數支持同時填寫多個平臺,來達到輸出多個平臺的可執行文件,好比填寫 linux/amd64 darwin/amd64
,將輸出64位的Linux、OSx 系統的應用軟件。
目前支持的平臺有:
darwin/386
/ darwin/amd64
freebsd/386
/ freebsd/amd64
/ freebsd/arm
linux/386
/ linux/amd64
/ linux/arm
windows/386
/ windows/amd64
若是咱們只構建 Linux 64 位系統下的應用,將看到相似下面的日誌輸出:
# make build BUILD_PLATFORMS="-osarch='linux/amd64'"
go get github.com/mitchellh/gox
# Building gitlab-runner in version 12.2.0~beta.1803.g41d5c6ad for -osarch='linux/amd64'
gox -osarch='linux/amd64' \
-ldflags "-X gitlab.com/gitlab-org/gitlab-runner/common.NAME=gitlab-runner -X gitlab.com/gitlab-org/gitlab-runner/common.VERSION=12.2.0~beta.1803.g41d5c6ad -X gitlab.com/gitlab-org/gitlab-runner/common.REVISION=41d5c6ad -X gitlab.com/gitlab-org/gitlab-runner/common.BUILT=2019-08-01T17:04:48+0000 -X gitlab.com/gitlab-org/gitlab-runner/common.BRANCH=master -s -w" \
-output="out/binaries/gitlab-runner-{{.OS}}-{{.Arch}}" \
gitlab.com/gitlab-org/gitlab-runner
Number of parallel builds: 7
--> linux/amd64: gitlab.com/gitlab-org/gitlab-runner
複製代碼
命令執行完畢後,咱們能夠在 ./out/binaries/
目錄內看到咱們想要的二進制程序。試着運行一下吧:
# ./out/binaries/gitlab-runner-linux-amd64 -v
Version: 12.2.0~beta.1803.g41d5c6ad
Git revision: 41d5c6ad
Git branch: master
GO version: go1.8.7
Built: 2019-08-01T17:04:48+0000
OS/Arch: linux/amd64
複製代碼
若是你也能看到相似的輸出,那麼源碼編譯 GitLab Runner 的任務,就這麼愉快的結束啦。
上述問題解決方案來自項目 .gitlab-ci.yml 持續集成配置文件,感興趣的同窗能夠了解下。
《編程匠藝》曾提過不該把過期錯誤的信息提供給你的夥伴,要維護良好的文檔。然而現實中充滿了過期錯誤的信息,就像本例中同樣,做爲一款開源軟件,這些錯誤的信息不免會澆滅外部貢獻者的熱情。
下一篇文章,我將講講我爲何要編譯 GitLab。
—EOF
我如今有一個小小的折騰羣,裏面彙集了一些喜歡折騰的小夥伴。
在不發廣告的狀況下,咱們在裏面會一塊兒聊聊軟件、HomeLab、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)