2016-01-15 48 views
5

gitlab-ci.gitlab-ci.yml文件中有一個選項用於在任何實際腳本運行之前執行命令,稱爲before_script.gitlab-ci.yml示例說明了在這裏安裝輔助程序。但是,我注意到,在使用Docker執行程序時,這些更改沒有在Docker中緩存。我天真地認爲在運行這些命令後,docker會緩存圖像,因此對於下一次運行或測試,docker只會加載在before_script之後生成的緩存圖像。這將大大加速構建。Gitlab docker執行程序 - before_script之後的緩存圖像

舉個例子,我的.gitlab-ci.yml看起來有點像:

image: ubuntu 

before_script: 
    - apt-get update -qq && apt-get install -yqq make ... 

build: 
    script: 
     - cd project && make 

一個可能的解決方案是去跑步機,並創建可以在沒有任何其他安裝建立自己的軟件,然後引用它碼頭工人形象在yaml文件的image部分。不利的一面是,無論何時我想添加一個依賴項,我都需要登錄到亞軍機器並在構建成功之前更新映像。如果我只需將依賴關係添加到apt-get install的末尾並讓docker/gitlab-ci處理相應的緩存,那將會更好。

.gitlab-ci.yml還有一個cache命令,我試圖設置爲untracked: true,我認爲它會緩存一切不是我的項目副產品,但它似乎沒有任何影響。

有什麼方法可以獲得我想要的行爲嗎?

回答

2

我處理這個問題的方式是我在Docker Hub上爲每個項目定製圖像,並從.gitlab-ci.yml中引用它們。如果我需要新的依賴關係,我編輯用於創建初始映像的Dockerfile,重新構建映像,並使用特定標記對其進行標記並將其推送到Docker Hub。

cat "RUN apt-get install gcc" >> Dockerfile 
ID=$(docker build) 
docker tag $ID ACCOUNT/gitlab_ci_image:gcc 
docker push ACCOUNT/gitlab_ci_image 

然後我更新.gitlab-ci.yml文件以指向該圖像的特定版本。

image: ACCOUNT/gitlab_ci_image:gcc 

build: 
    script: 
     - cd project && make 

這讓我有不同的依賴性,這取決於犯我試圖測試(如gitlab-ci.yml文件內的承諾告訴它使用亞軍)。它還可以防止每次在特定運行器上運行測試時都需要安裝依賴項,因爲只要運行器不更改,運行器就會重新使用相同的映像。

另外一個好處是,在Docker Hub上託管的圖片上,如果跑步者需要一個本地沒有的特定標籤,它會自動獲取正確的標籤,這樣您就可以擁有10個跑步者保持單個圖像,並且可以在您自己的工作站或任何機器上完成此維護。

我個人認爲這比嘗試在跑步者圖片中緩存任何東西更好。當你創建一個新的分支來測試你的代碼在一個更新版本的依賴項上時,尤其如此。如果你緩存了你的穩定和開發分支,你的問題會有不同的測試環境。同樣在我看來,測試應該在儘可能乾淨的環境中運行,並且這種設置可以實現這一目標。

+0

我想到了這一點,並且還有一些好處,但是好像不會很難將'before_script'的每一行作爲RUN命令運行,然後讓docker在該級別執行高速緩存。 – Erik

+0

是的,我認爲這是絕對有可能的,但是我最好的猜測是它接近我的答案,因爲如果你在不同的提交中有不同的'before_script'指令,事情會變得有點混亂。除了安裝軟件包之外,'before_script'還可以用來做各種各樣的事情。如果你好奇,你可以在他們的github頁面上發佈。他們非常善於迴應。儘管如此,我發佈的內容已經爲我們的團隊服務。 – Suever

+0

我將與你所描述的事情一起工作。 – Erik

4

您可以添加舞臺來首先構建圖像。如果圖像沒有任何變化,舞臺將很短,不到1秒。

您可以在以下幾個階段使用該圖像,加快整個過程。

這是一個.gitlab-ci.yml的示例:

stages: 
    - build_test_image 
    - test 

build_test: 
    stage: build_test_image 
    script: 
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY 
    - docker build -t $CI_REGISTRY_IMAGE:test -f dockerfiles/test/Dockerfile . 
    - docker push $CI_REGISTRY_IMAGE:test 
    tags: 
    - docker_build 

test_syntax: 
    image: $CI_REGISTRY_IMAGE:test 
    stage: test 
    script: 
    - pip install flake8 
    - flake8 --ignore=E501,E265 app/ 

看標籤docker_build。該標籤用於強制在具有該標籤的跑步者上執行舞臺。該跑步者的執行者爲shell,僅用於構建Docker鏡像。所以,跑步者居住的主機應該安裝Docker引擎。我發現這個解決方案比Docker中的碼頭和another solutions更適合我的需求。

此外,我正在使用私人註冊表,這就是爲什麼我使用$CI_REGISTRY*變量,但您可以使用DockerHub而無需指定註冊表。但問題是要在DockerHub上進行身份驗證。

+0

是否有關於此功能的任何文檔? – Envek

+0

如果我已將自己的跑步者添加到託管的GitLab實例,我應該添加「docker_build」標記還是GitLab在內部和隱式地處理它? – Envek

+0

您應該明確地添加它,標記'docker_build'這只是我選擇的一個方便的名稱,但可以是任何。它沒有記錄,它只是一個方法來做到這一點,我想清楚了。 – charli