GitLab CI (.gitlab-ci.yml) के लिए मल्टीलाइन YAML स्ट्रिंग


86

मैं एक gitlab-ci.ymlफाइल लिखने की कोशिश कर रहा हूं, जो कमांड के लिए मल्टी-लाइन स्ट्रिंग का उपयोग करता है। हालांकि, ऐसा लगता है कि यह पार्स नहीं किया जा रहा है। मैंने एक जैसे परिणामों के साथ - |और दोनों की कोशिश की है - >

stages:
  - mystage

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

जब यह चलाने की कोशिश करता है, तो यह केवल चलाने के echo -e 'लिए स्क्रिप्ट के रूप में दिखाता है , न कि पूरे मल्टीलाइन स्ट्रिंग को। यह मेरे लिए मुद्दों का कारण बनता है।

इस तरह से कुछ लिखने के लिए सही सिंटैक्स क्या होगा?


इसके लिए एक समस्या है: gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/166 यह मेरे लिए स्पष्ट नहीं है कि समस्या क्या है, क्योंकि आपका कोड समतुल्य (पर्याप्त) YAML समाधानों के लिए प्रस्तावित होना चाहिए। । आप \अपनी रेखाओं को जोड़ने की कोशिश कर सकते हैं, लेकिन मैं यह नहीं कह सकता कि यह काम करेगा या नहीं।
जॉर्डन रनिंग

जवाबों:


37

टी एल; डॉ; आप एक बहु-पंक्ति YAML स्केलर (पठनीयता के लिए) का उपयोग करना चाहते हैं जो कि सिंगल लाइन स्ट्रिंग के रूप में लोड किया गया है जिसे गिटलैब-सीआई द्वारा एक कमांड के रूप में जारी किया जा सकता है। ऐसा करने के लिए YAML में एक सादा (बिना उद्धरण के) स्केलर का उपयोग करें जो कई लाइनों में फैला हुआ है:

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

कृपया ध्यान रखें कि ऐसे स्केलर पर YAML द्वारा लगाए गए कुछ प्रतिबंध हैं। आपको निश्चित रूप से यह जानने की जरूरत है कि प्रत्येक निम्न पंक्ति कम से कम एक स्थिति की तुलना में echo -e(जो इसके संग्रह नोड के सापेक्ष दो स्थिति है, जो सभी में इंडेंट नहीं है), और यह कि प्रत्येक नई-लाइन को एक स्थान से बदल दिया जाता है जब लोड किया जाता है (तो आपको नई देखभाल करने के लिए थोड़ा ध्यान रखने की आवश्यकता है)।


आपकी पोस्ट में कई गलत धारणाएं हैं, जो आपको गलत प्रश्न पूछती हैं।

मल्टी-लाइन YAML स्ट्रिंग जैसी कोई चीज नहीं है । YAML में स्केलर होते हैं और इनमें से कुछ स्केलर को प्रोग्राम द्वारा स्ट्रिंग्स के रूप में लोड किया जा सकता है, जबकि कुछ अन्य को पूर्णांक, फ्लोट्स आदि के रूप में लोड किया जाएगा।

आप स्पष्ट रूप से स्केलर नोड्स में रुचि रखते हैं जिन्हें एक स्ट्रिंग के रूप में लोड किया जा रहा है, क्योंकि उस स्ट्रिंग को तब कमांड-लाइन के रूप में व्याख्या किया जा सकता है। लेकिन आप मल्टी-लाइन कमांड-लाइन नहीं चाहते हैं (यानी एम्बेडेड नईलाइन के साथ), क्योंकि मल्टी-लाइन स्क्रिप्ट गीतालाब सीआई (@Jordan संकेत के रूप में) में समर्थित नहीं हैं।

पठनीयता के लिए आप मल्टी लाइन स्केलर को सिंगल लाइन स्ट्रिंग के रूप में लोड करने के लिए YAML की मानक, मानक, क्षमता का उपयोग करना चाहते हैं।

यदि आप पठनीयता की परवाह नहीं करते हैं तो आप इसका उपयोग कर सकते हैं:

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

और जब से आपके स्केलर को उद्धृत नहीं किया जाता है (अर्थात इसके साथ शुरू होता है echo) आपको बैकस्लैश या उद्धरण के लिए YAML में कुछ विशेष करने की आवश्यकता नहीं है।

स्क्रिप्ट का परिणाम एक ही है (एक खाली लाइन को प्रिंट echo 'hi';करें, एक लाइन पर प्रिंट करें चार इंडेंटेड, echo 'bye';एक लाइन पर प्रिंट करें इंडेंट किए गए रिक्त स्थान पर प्रिंट करें ।)

यदि आप पठनीयता के लिए मल्टी-लाइन इनपुट का उपयोग करना चाहते हैं, जिसे एक ही लाइन के रूप में लोड किया गया है, तो अनिवार्य रूप से दो विकल्प हैं: मल्टी-लाइन प्लेन स्केलर का उपयोग करें या अपने YAML में एक मुड़ा हुआ स्केलर का उपयोग करें।

मल्टी लाइन प्लेन स्केलर

सादे का मतलब है कि स्केलर गैर-उद्धृत है, और जैसा कि YAML मल्टी-लाइन में किसी भी मल्टी-लाइन चीज़ के साथ होता है, निम्नलिखित पंक्तियों को उचित रूप से इंडेंट करने की आवश्यकता होती है, इस मामले में प्रारंभिक लाइन की तुलना में आगे

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

नए स्थान रिक्त स्थान द्वारा प्रतिस्थापित किए जाते हैं इसलिए ऐसा न करें:

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

जैसा कि आपको पहले एक दृश्यमान स्थान मिलेगा bye

इस तरह के कुछ प्रतिबंध हैं कि आपके पास इस तरह के स्केलर के भीतर एक स्थान के बाद एक बृहदान्त्र नहीं हो सकता है (जिससे यह कुंजी-मूल्य जोड़ी की तरह दिखाई देगा)।

सादे स्केलर में बैकस्लैश से बचने की कोई आवश्यकता नहीं है, क्योंकि आप किसी भी स्केलर में किसी भी वर्ण से बच नहीं सकते हैं, लेकिन निश्चित रूप से आप बैकस्लैश को शामिल कर सकते हैं, जो कि YAML से लोड किए गए स्ट्रिंग में समाप्त हो जाएगा और कमांड निष्पादित के लिए अर्थ हो सकता है उस तार से।

मुड़ा हुआ अदिश

एक मुड़ा हुआ स्केलर एक सादे स्केलर के समान होता है जिसमें लोडिंग के दौरान सभी (एकल) न्यूलाइन्स को एक स्थान द्वारा प्रतिस्थापित किया जाता है:

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

आपको वास्तविक कमांड की जानकारी को कम से कम तह किए गए स्केलर संकेतक ( >) के रूप में इंडेंट करने की आवश्यकता है ।

सादे स्केलर के विपरीत चीजों :का कोई विशेष अर्थ नहीं है। इसलिए अगर मैदानी स्केलर एक YAML त्रुटि को फेंकने में विफल होते हैं, तो समान रूप से मुड़े हुए स्केलर सबसे अधिक नहीं होंगे।


मैं इसे स्पष्टता और स्थिरता के लिए मल्टी-लाइन लिखना चाहता हूं। जबकि मेरा उदाहरण तुच्छ है, वास्तविक स्क्रिप्ट निश्चित रूप से नहीं हैं।
15

मैं समझ सकता हूँ। GitLab CI द्वारा संसाधित किए जाने से पहले क्या आपकी पठनीय YAML फ़ाइल को प्रीप्रोसेस करना स्वीकार्य होगा?
एंथन

मैंने उस पर विचार किया है। यह एक अतिरिक्त कदम और थोड़ा जोड़ा जटिलता है, लेकिन इसके लायक हो सकता है।
16

मैंने एक संभावित समाधान जोड़ा।
एंथन

3
ओह यार। जबकि तकनीकी रूप से सही है, यह उत्तर अस्पष्टता के बिंदु पर अस्पष्ट रूप से क्रिया है। हर कोई एक YAML पार्सर नहीं लिख रहा है, शायद सिर्फ आलू के अत्यधिक उच्च उत्थान और इसके बजाय बहुत अधिक जवाब देना चाहता है ।
सेसिल करी

115

मैं यहाँ आने के बाद उम्मीद कर रहा था कि यह एक मुद्दा होगा लेकिन पठनीयता के लिए निम्नलिखित "मल्टी-लाइन" कमांड मेरे लिए काम कर रहा है:

Gitlab Runner: Shell Runner version 1.11.0 / Gitlab संस्करण: 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
यहाँ क्या चाल है? क्या आपने पहली पंक्ति के समान दूसरी पंक्ति को इंडेंट किया था?
विक्टर ग्राज़ी

6
@ विजेता-ग्राज़ी जैसा कि मैं इसे समझता हूं: सादे यम्ल (सादे प्रवाह स्केलर) में, पलायन (जैसे कि न्यूलाइन \n) कुछ भी नहीं करते हैं, और अग्रणी सफेद स्थान को नजरअंदाज कर दिया जाता है - यह इस तरह से दिखाई देता है Gitlab YAML पार्स स्क्रिप्ट ब्लॉक। इंडेंटेशन पर: YAML कल्पना कहती है In YAML block styles, structure is determined by indentationऔर इसलिए दूसरी लाइन, YAML स्पेक (पैरेंट इंडेंट के सापेक्ष एक स्थान) के लिए आवश्यक है, और पठनीयता के लिए एक और अधिक (जो तकनीकी रूप से अति सुंदर लेकिन सुंदर है)।
आलूफमेर

एक जादू की तरह काम करता है। इसके अलावा नई लाइन में सभी
परिमों के

26

आप किसी भी मल्टीलाइन स्क्रिप्ट / कमांड का उपयोग yaml शाब्दिक_ब्लॉक और एंकर सुविधा के माध्यम से कर सकते हैं। उदाहरण:

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

साझा करने के लिए धन्यवाद - यह अधिक उन्नत कार्यक्षमता नौकरी की पठनीयता के लिए विशेष रूप से उपयोगी होगी / पूरे नुस्खा में कोड चंक्स का पुन: उपयोग करने में सक्षम है।
आलूफमेर

5
यह एक महान उदाहरण है, लेकिन अगर आप परिभाषित करते हैं तो यह स्पष्ट हो जाएगा ।rsync
विक्टर ग्राज़ी

13

Wp config create कमांड बहुत सुंदर थी ... .itlab-ci से ...

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

ट्रैविस सीआई में यह मेरे लिए काम कर रहा है

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

यहां दो एनवी चर ( ${GITHUB_USERNAME}और ${GITHUB_PASSWORD}) भी इंटरपोल किए जाएंगे


0

यह प्रारूप काम करेगा। YAML में एक सादे (बिना उद्धरण के) स्केलर का उपयोग करें। टेराफॉर्म बैकएंड को इनिशियलाइज़ करने के लिए एग स्क्रिप्ट का उपयोग किया जाता है

  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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.