2017-03-02 65 views
7

Komut için çok satırlı bir dize kullanan bir gitlab-ci.yml dosyası yazmaya çalışıyorum. Ancak, ayrıştırılmamış gibi görünüyor. Ben - | ve - > aynı sonuçları ile denedim. GitLab CI için Çok satırlı YAML dizesi (.gitlab-ci.yml)

stages: 
    - mystage 

Build: 
    stage: mystage 
    script: 
    - | 
     echo -e " 
      echo 'hi'; 
      echo 'bye'; 
     " 

o çalıştırmayı dener

, sadece çalıştırmak için komut değil, bütün satırlı dize olarak echo -e ' göstermektedir. Bu benim için sorunlara neden oluyor.

Böyle bir şey yazmak için doğru sözdizimi ne olurdu?

:
+0

Bu yanlış YAML, muhtemelen 'Build' sonra bir kolon özledim. 'Echo -e' ve 'echo' hi'' için aynı tek tırnakları kullanmak istediğinizden ve bunlardan biri için çift tırnak kullanmadığınızdan emin misiniz? – Anthon

+0

Üzgünüz, bunlar benim örneğimin hatalarıydı. Onları düzelttim. Kullanmakta olduğum gerçek sürüm, çevrimiçi YAML-JSON ayrıştırıcılarında çalışır, ancak GitLab CI'de başarısız olur. – samanime

+0

Bunun için bir sorun var: https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/166 Kodun * eşdeğer olması gerektiği için sorunun ne olduğu açık değil (yeterli) YAML orada önerilen çözümlere. Hatlarınıza ''\' 'eklemeye çalışabilir, ancak çalışıp çalışamayacağını söyleyemem. –

cevap

1

sorun Gitlab CI (@Jordan belirtildiği gibi) ve "script" de destekleniyor değil multi-line scripts ile ilişkili olduğu görünmektedir yana

aslında tek bir komut, sadece tek bir satırda olmak için yeniden yazmak gerekir
- echo -e "\n echo 'hi';\n echo 'bye';\n" 

Skaleriniz kote edilmediğinden (yani echo ile başlar) YAML'de ters eğik çizgi veya tırnak işaretleri için özel bir şey yapmanıza gerek yoktur.

senaryonun sonucu (dört boşluk bir çizgi üzerinde, dört boşluk bir çizgi üzerinde, baskı echo 'bye'; baskı echo 'hi'; boş bir satır yazdırın.)

çoklu çizgi kullanmak istiyorsanız aynıdır Okunabilirlik için giriş, en iyi seçeneğiniz girişi önceden işlemektir. Python ve ruamel.yaml (disclaimer: ben yazarım) kullanmanızı öneririm, bu da bunu yaparken tırnak ve yorumlar gibi özellikleri korumanızı sağlar.

bu gitlab-ci.in.yml Verilen:

stages: 
    - 'mystage' 

Build: 
    stage: mystage 
    # the following is rewritten 
    script: 
    - | 
     echo -e " 
      echo 'hi'; 
      echo 'bye'; 
     " 

ve aşağıdaki Python (sürüm 3) programı:

stages: 
- 'mystage' 

Build: 
    stage: mystage 
    # the following is rewritten 
    script: 
    - "echo -e \"\n echo 'hi';\n echo 'bye';\n\"\n" 

(flatten_multi_line() çoklu olmadan:

from pathlib import Path 
import ruamel.yaml 


def flatten_multi_line(d): 
    if isinstance(d, list): 
     for idx, elem in enumerate(d): 
      if isinstance(elem, (list, dict)): 
       flatten_multi_line(elem) 
      elif isinstance(elem, ruamel.yaml.scalarstring.PreservedScalarString): 
       d[idx] = ruamel.yaml.scalarstring.DoubleQuotedScalarString(elem) 
    elif isinstance(d, dict): 
     for key in d: 
      if isinstance(d[key], (list, dict)): 
       flatten_multi_line(d[key]) 
      elif isinstance(d[key], ruamel.yaml.scalarstring.PreservedScalarString): 
       d[key] = ruamel.yaml.scalarstring.DoubleQuotedScalarString(elem) 


in_file = Path('gitlab-ci.in.yml') 
out_file = Path('gitlab-ci.yml') 

with in_file.open() as fp: 
    data = ruamel.yaml.round_trip_load(fp, preserve_quotes=True) 
flatten_multi_line(data) 
with out_file.open('w') as fp: 
    ruamel.yaml.round_trip_dump(data, fp) 

gitlab-ci.yml aşağıdaki verir -line dize w olarak korunur Eli). Ayrıca yeni oluşturulan YAML dosyasının işlemesini tetikleyebilecek programından

+0

Netlik ve bakım için çok satırlı yazmak istiyorum. Benim örneğim önemsiz olsa da, gerçek senaryolar kesinlikle değil. – samanime

+0

Bunu anlayabiliyorum. GitLab CI tarafından işlenmeden önce okunabilir YAML dosyanızın ön işleminin yapılması kabul edilebilir mi? – Anthon

+0

Bunu düşündüm. Bu ekstra bir adım ve biraz ek karmaşıklık, ama buna değer olabilir. – samanime

11

Buraya gelmeden önlem amacıyla bekliyor (örn subprocess.check_output() kullanarak, eğer istersen check_output() bir argüman olarak str() kullanılarak out_file döküm emin olun) Bu durum bir sorun ancak aşağıdaki "çok hatlı" olacağını okunabilirlik için komut benim için çalışıyor:

Gitlab Runner: Kabuk Runner versiyonu 1.11.0 /Gitlab sürümü: 8.17.2

myjob: 
stage: deploy 
script: 
    # Single line command 
    - az component update --add sql 

    # Multi-line command 
    - az sql server create -n ${variable} -g ${variable} -l ${variable} 
    --administrator-login ${variable} --administrator-login-password ${variable} 

Soruyu yanlış anlamış olursam ya da bir kenar durum zarafeti yaşadığımdan dolayı özür dileriz.

+0

Bu, çok satırlı bir dize belirtmek için çalışıyor – dalore

2

Çok satırlı komut dosyalarını/komutlarını yaml literal_block ve anchors özelliği ile kullanabilirsiniz.Örnek:

.build: &build | 
    echo -e "\n$hl Building $green$build_path/$build_assets_dir/*.js $nl\n" 
    echo -e "javascript-obfuscator $build_path/$build_assets_dir/*.js" 
[...] 

build:master: 
    stage: build 
    script: 
    - *rsync 
    - *build 
[...] 
+0

Paylaştığınız için teşekkür ederiz - bu daha gelişmiş işlevsellik işin okunabilirliği için özellikle yararlı olacaktır/kod parçaları yeniden tarif boyunca yeniden kullanabilme. – PotatoFarmer