2016-01-15 18 views
5

gitlab-ci'da, .gitlab-ci.yml dosyasında, before_script adı verilen gerçek betik çalıştırmalarından önce komutları yürütmek için bir seçenek var. .gitlab-ci.yml örnekleri, burada yardımcı programların kurulumunu göstermektedir. Bununla birlikte, fark ettiğim şey, bir docker yürütücüsü kullanılırken bu değişikliklerin Docker'da önbelleğe alınmamasıdır. Bu komutları çalıştırdıktan sonra docker'ın görüntüyü önbelleğe aldığını, böylece bir sonraki çalışma ya da test için docker'ın before_script'dan sonra üretilen önbelleğe alınmış görüntüyü yükleyeceğini düşünmüştüm. Bu, yapıları büyük ölçüde hızlandıracaktır. .gitlab-ci.yml biraz benziyor benim Örnek olarak Gitlab docker executor - önbellek resmi before_script

: Olası bir çözüm koşucu makinesine gidip başka kurulum olmadan benim yazılımını kurmak ve daha sonra başvurmak üzere bir liman işçisi görüntü oluşturmaktır

image: ubuntu 

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

build: 
    script: 
     - cd project && make 

yaml dosyasının image bölümünde. Bunun dezavantajı, ne zaman bir bağımlılık eklemek istediğimde, koşucu makineye giriş yapmam ve yapının başarılı olacağından önce görüntüyü güncellemem gerektiğidir. Sadece bağımlılığı apt-get install sonuna eklemek zorunda kaldım ve docker/gitlab-ci uygun önbelleğe alma işlemine sahip olsaydı çok daha hoş olurdu.

de benim proje bir yan ürünü değildi herşeyi önbelleğe düşündüm hangi untracked: true ayarı çalıştı .gitlab-ci.yml bir cache komut vardır, ancak herhangi bir etkiye sahip değildi.

İstediğim davranışı elde etmenin bir yolu var mı?

cevap

2

Bunu yapmamın yolu, projelerimizin her biri için Docker Hub'da özel görüntülerim var ve bunları .gitlab-ci.yml'dan başvuruyor. Yeni bir bağımlılığa ihtiyacım varsa, ilk resmi oluşturmak, görüntüyü yeniden oluşturmak ve belirli bir etiket kullanarak etiketlemek için Dockerfile'ı düzenler ve Docker Hub'a basarım.

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

Sonra görüntünün belirli sürümüne işaret edecek .gitlab-ci.yml dosyasını güncellemek.

image: ACCOUNT/gitlab_ci_image:gcc 

build: 
    script: 
     - cd project && make 

Bu bana (kullanmak koşucu söyler taahhüt olduğunu dahilinde gitlab-ci.yml dosyası gibi) test etmek çalışılıyor taahhüt hangi bağlı olarak farklı bağımlılıkları sahip olmasını sağlar. Aynı zamanda koşucu, değiştirmediği sürece aynı görüntüyü yeniden kullanacağı için belirli bir koşucu üzerinde her test yapıldığında bağımlılıkları kurma ihtiyacını da önler.

Diğer güzel şey, Docker Hub'da barındırılan görüntülerde, koşucunun yerel olarak bulunmadığı belirli bir etikete ihtiyacı varsa, otomatik olarak doğru olanı yakalayacaktır, böylece 10 koşucuya sahip olabilirsiniz. Tek bir görüntüyü korumak ve bu bakım kendi iş istasyonunuzda veya herhangi bir makinede yapılabilir.

Şahsen, bunun bir koşucu görüntüsü içinde herhangi bir şeyi önbelleğe almaya çalışmaktan çok daha iyi bir çözüm olduğunu düşünüyorum. Bu, özellikle kodun bağımlılığın daha yeni bir sürümünde test edilmesi için yeni bir dal oluşturduğunuzda geçerlidir. Önbelleğe almayı başarmış olsaydınız, sabit ve dev dalları için farklı test ortamlarına sahip olacaksınız. Ayrıca bence, testler mümkün olduğunca temiz bir ortam içinde yürütülmeli ve bu kurulum bunu gerçekleştirir.

+0

Bunu düşünmüştüm ve bazı umutsuzluklar var, ama her bir "before_script" satırını bir RUN komutu olarak çalıştırmak çok zor olmayacak gibi görünüyor ve daha sonra docker bu düzeyde önbelleğe alma işlemini yapmak zorunda değil. – Erik

+0

Evet, kesinlikle mümkün olduğunu düşünüyorum, ama arkasındaki mantık için en iyi tahminim cevabımın sonuna yakın olurdu, çünkü farklı taahhütlerde farklı "before_script" yönergelerine sahip olsaydınız işler biraz dağınık olabilirdi. Ayrıca 'before_script', paket kurmanın dışında her türlü şeyi yapmak için kullanılabilir. Merak ediyorsanız, her zaman github sayfasını gönderebilirsiniz. Cevap vermekte gerçekten iyiler. Yayınladığım şey grubumuza iyi hizmet etti. – Suever

+0

Şu an açıkladığınız gibi biriyle çalışacağım. – Erik

4

Görüntüyü ilk önce oluşturmak için bir sahne ekleyebilirsiniz. Görüntüde herhangi bir değişiklik yoksa, sahne 1 saniyenin altında çok kısa olacaktır.

Tüm görüntüyü hızlandırarak bu görüntüyü aşağıdaki aşamalarda kullanabilirsiniz. etiketi docker_build de

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/ 

Görünüş:

Bu

bir .gitlab-ci.yml bir örnektir. Bu etiket, bu etiketin bulunduğu runner üzerinde sahnenin yürütülmesini zorlamak için kullanılır. Bu koşucunun yürütücüsü shell'dur ve yalnızca Docker görüntülerini oluşturmak için kullanılır. Yani, koşucunun yaşadığı ev sahibi Docker Engine'i yüklemiş olmalı. Bu çözümün, docker ve another solutions'daki docker'dan daha iyi ihtiyaçlarımı buldum.

Ayrıca, özel bir kayıt defteri kullanıyorum, bu yüzden $CI_REGISTRY* değişkenlerini kullanıyorum, ancak kayıt defterini belirtmeye gerek kalmadan DockerHub'i kullanabilirsiniz. Sorun, DockerHub üzerinde kimlik doğrulaması yapmak olurdu.

+0

Bu işlevsellik için herhangi bir dokümantasyon var mı? – Envek

+0

Barındırılan GitLab örneğine kendi koşucumu eklediysem, buna 'docker_build' etiketi eklenmeli mi veya GitLab bunu dahili ve örtülü olarak ele almalı mı? – Envek

+0

Bunu açıkça eklemelisiniz, 'docker_build' etiketi, yalnızca seçtiğim kullanışlı bir addır, ancak herhangi biri olabilir. Belgelenmemiş, sadece bunu yapmanın bir yolu, bunu anladım. – charli