GitLab CI (.gitlab-ci.yml) için çok satırlı YAML dizesi


86

gitlab-ci.ymlKomut için çok satırlı bir dizge kullanan bir dosya yazmaya çalışıyorum . Ancak, çözümlenmiyor gibi görünüyor. Her iki denedim - |ve - >aynı sonuçlarla.

stages:
  - mystage

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

Çalıştırmaya çalıştığında, echo -e 'çok satırlı dizenin tamamı değil, yalnızca çalıştırılacak komut dosyası olarak gösterilir . Bu benim için sorunlara neden oluyor.

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


Bunun için bir sorun var: gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/166 Kodunuzun orada önerilen çözümlere eşdeğer (yeterli) YAML olması gerektiği için sorunun ne olduğu bana açık değil . \Çizgilerinize eklemeyi deneyebilirsiniz , ancak bunun işe yarayıp yaramayacağını söyleyemem.
Jordan Koşu

Yanıtlar:


37

TL; DR; Gitlab-CI tarafından bir komut olarak verilebilen tek satırlı bir dize olarak yüklenen çok satırlı bir YAML skaler (okunabilirlik için) kullanmak istiyorsunuz. Bunu yapmak için, YAML'de birden çok satıra yayılmış düz (tırnaksız) bir skaler kullanın:

script:
- echo -e 
   "echo 'hi';
    echo 'bye';"

Lütfen YAML tarafından bu tür skalerlere uygulanan bazı kısıtlamalar olduğunu unutmayın. Kesinlikle bilmeniz gereken şey, takip eden her satırın en az bir konumdan daha fazla echo -egirintili olduğu (bu, toplama düğümüne göre iki konum girintili, hiç girintili olmayan) ve her yeni satırın bir boşlukla değiştirildiği. yüklendiğinde (bu nedenle yeni satırları nereye koyacağınıza biraz dikkat etmeniz gerekir).


Gönderinizde yanlış soruyu sormanıza neden olan çok sayıda yanlış anlama var.

Çok satırlı YAML dizesi diye bir şey yoktur . YAML'nin skalerleri vardır ve bu skalerlerin bazıları bir program tarafından dizeler olarak yüklenebilirken, diğerleri tamsayı, kayan nokta vb. Olarak yüklenir.

Açıkça, bir dize olarak yüklenen skaler düğümlerle ilgileniyorsunuz, çünkü bu dize daha sonra bir komut satırı olarak yorumlanabilir. Ancak çok satırlı komut satırına sahip olmak istemezsiniz (yani gömülü satırsonları ile), çünkü çok satırlı komut dosyaları Gitlab CI'da desteklenmez (@Jordan'ın belirttiği gibi).

Okunabilirlik için çok satırlı skalerleri tek satırlı dizge olarak yüklemek için YAML'nin standart yeteneğini kullanmak istiyorsunuz.

Okunabilirliği önemsemiyorsanız, şunları kullanabilirsiniz:

- echo -e "\n    echo 'hi';\n    echo 'bye';\n"

ve skalanız alıntılanmadığından (yani ile başladığından echo), ters eğik çizgi veya tırnak işaretleri için YAML'de özel bir şey yapmanız gerekmez.

Komut dosyasının sonucu aynıdır (boş bir satır yazdırın echo 'hi';, dört boşluk girintili bir satıra yazdırın echo 'bye';, dört boşluk girintili bir satıra yazdırın .)

Okunabilirlik için tek satır olarak yüklenen çok satırlı girişi kullanmak istiyorsanız, esasen iki seçenek vardır: YAML'nizde çok satırlı bir düzlem skaler kullanın veya katlanmış bir skaler kullanın.

çok satırlı düz skaler

Düz, skalerin alıntı yapılmadığı anlamına gelir ve YAML'deki çok satırlı herhangi bir şeyde olduğu gibi, aşağıdaki satırların uygun şekilde girintilenmesi gerektiği anlamına gelir, bu durumda ilk satırdan daha ileride

script:
- echo -e 
   "echo 'hi';
    echo 'bye';"

yeni satırlar boşluklarla değiştirilir, bu yüzden şunu yapmayın:

script:
- echo -e 
   "echo 'hi';
    echo '
   bye';"

daha önce görünür bir alan elde edeceğiniz gibi bye.

Böyle bir skaler içinde iki nokta üst üste işareti ve ardından boşluk bırakamayacağınız gibi bazı kısıtlamalar vardır (bu, anahtar-değer çifti gibi görünmesini sağlar).

Düz skalardaki herhangi bir karakterden kaçamayacağınız için düz skalerlerde ters eğik çizgiden kaçışa gerek yoktur, ancak elbette YAML'den yüklenen dizede sona erecek ve yürütülen komut için anlamı olabilecek bir ters eğik çizgi ekleyebilirsiniz. o dizeden.

katlanmış skaler

Katlanmış bir skaler, yükleme sırasında tüm (tek) satırsonları bir boşlukla değiştirildiği için düz skalere benzer:

script:
- >
  echo -e 
  "echo 'hi';
  echo 'bye';"

Gerçek komut bilgisini en az katlanmış skaler gösterge ( >) kadar girintilendirmeniz gerekir .

Düz skalerlerin aksine, böyle şeylerin :özel bir anlamı yoktur. Dolayısıyla, düz skaler bir YAML hatası atarak başarısız olursa, benzer katlanmış skalarlar büyük olasılıkla olmayacaktır.


Netlik ve sürdürülebilirlik için çok satırlı yazmak istiyorum. Örneğim önemsiz olsa da, gerçek senaryolar kesinlikle değildir.
samanime

Bunu anlayabiliyorum Okunabilir YAML dosyanızı GitLab CI tarafından işlenmeden önce ön işlemden geçirmek kabul edilebilir mi?
Anthon

Bunu düşündüm. Bu ekstra bir adım ve biraz daha karmaşıktır, ancak buna değebilir.
samanime

Olası bir çözüm ekledim.
Anthon

3
Oh, oğlum. Teknik olarak doğru olsa da, bu cevap gülünç bir şekilde okunamayacak kadar ayrıntılıdır. Herkes sadece istediği muhtemelen YAML ayrıştırıcı yazmıyor PotatoFarmer 'ın son derece upvoted ve çok terser cevap yerine,.
Cecil Curry

115

Buraya öncelikli olarak bunun bir sorun olacağını düşünerek geldim ancak okunabilirlik için aşağıdaki "çok satırlı" komut benim için çalışıyor:

Gitlab Runner: Shell Runner sürüm 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}

2
Buradaki hile nedir? İkinci satırı ilk satırla aynı seviyeye mi girdin?
Victor Grazi

6
@ victor-grazi Anladığım kadarıyla: Düz YAML'de (düz akış skaler), kaçışlar (satırsonu gibi \n) hiçbir şey yapmaz ve baştaki beyaz boşluk göz ardı edilir - Görünüşe göre Gitlab YAML komut dosyası bloklarını bu şekilde ayrıştırır. In YAML block styles, structure is determined by indentationGirintileme konusunda : YAML spesifikasyonu diyor ve bu nedenle ikinci satır YAML spesifikasyonu için gerektiği kadar (ana girintiye göre bir boşluk) ve okunabilirlik için (teknik olarak gereksiz ancak daha güzel) bir tane daha girintili.
PotatoFarmer

Tıkır tıkır çalışıyor. Yeni satırdaki tüm parametrelerle de çalışır
bodolsog

26

Yaml literal_block ve anchors özelliği aracılığıyla çok satırlı komut dosyalarını / komutları kullanabilirsiniz. Misal:

.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
[...]

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

5
Bu harika bir örnek, ancak .rsync
Victor Grazi'yi

13

Wp config create komutu oldukça titizdi ... gitlab-ci'den ...

build:
  stage: build
  script:
    - echo "Building the app"
    - |
        wp config create --dbname=$vardb --dbhost=$varhost --dbuser=$varusr --dbpass=$varpas --extra-php <<PHP
            define( 'WP_DEBUG', false );
            define( 'FS_METHOD', 'direct' );
            define( 'WP_POST_REVISIONS', 5 );
            define( 'AUTOSAVE_INTERVAL', 600 );
        PHP
    - scp ./wp-config.php continued...
  allow_failure: true

4

Bu benim için Travis CI'da çalışıyor

before_install:
  - set -e
  - |
    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
    <settings xmlns=\"http://maven.apache.org/SETTINGS/1.0.0\"
              xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
              xsi:schemaLocation=\"http://maven.apache.org/SETTINGS/1.0.0
                                   http://maven.apache.org/xsd/settings-1.0.0.xsd\">
      <servers>
        <server>
          <id>github</id>
          <username>${GITHUB_USERNAME}</username>
          <password>${GITHUB_PASSWORD}</password>
        </server>
      </servers>
    </settings>
    " >  ${HOME}/.m2/settings.xml

Burada iki env değişkeni ( ${GITHUB_USERNAME}ve ${GITHUB_PASSWORD}) de enterpolasyonlu olacaktır


0

Bu format işe yarayacak. YAML'de düz (tırnaksız) bir skaler kullanın. Örneğin, terraform arka ucunu başlatmak için kullanılan komut dosyası

  before_script:
    - cd ${TF_ROOT}
    - terraform init -backend-config="address=${GITLAB_TF_ADDRESS}"
      -backend-config="lock_address=${GITLAB_TF_ADDRESS}/lock"
      -backend-config="unlock_address=${GITLAB_TF_ADDRESS}/lock"
      -backend-config="username=${GITLAB_USER_LOGIN}" -backend-config="password=${GITLAB_ACCESS_TOKEN}"
      -backend-config="lock_method=POST" -backend-config="unlock_method=DELETE"
      -backend-config="retry_wait_min=5"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.