Chuỗi YAML nhiều dòng cho GitLab CI (.gitlab-ci.yml)


83

Tôi đang cố gắng viết một gitlab-ci.ymltệp sử dụng chuỗi nhiều dòng cho lệnh. Tuy nhiên, có vẻ như nó không được phân tích cú pháp. Tôi đã thử cả hai - |- >với kết quả giống hệt nhau.

stages:
  - mystage

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

Khi cố gắng chạy, nó chỉ hiển thị echo -e 'dưới dạng tập lệnh để chạy chứ không phải toàn bộ chuỗi nhiều dòng. Điều này gây ra vấn đề cho tôi.

Cú pháp chính xác để viết một cái gì đó như thế này là gì?


Có một vấn đề cho điều này: gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/166 Tôi không rõ vấn đề là gì, vì mã của bạn phải tương đương (đủ) YAML với các giải pháp được đề xuất ở đó . Bạn có thể thử thêm \vào lời thoại của mình, nhưng tôi không thể nói liệu điều đó có hiệu quả hay không.
Jordan Running

Câu trả lời:


35

TL; DR; Bạn muốn sử dụng đại lượng vô hướng YAML nhiều dòng (để dễ đọc) được tải dưới dạng một chuỗi dòng đơn có thể được Gitlab-CI phát hành dưới dạng lệnh. Để làm như vậy, hãy sử dụng một đại lượng vô hướng đơn giản (không có dấu ngoặc kép) trong YAML được trải dài trên nhiều dòng:

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

Xin lưu ý rằng có một số hạn chế do YAML áp đặt đối với các đại lượng vô hướng như vậy. Điều bạn chắc chắn cần biết là mỗi dòng sau được thụt vào ít nhất một vị trí nhiều hơn echo -e(được thụt vào hai vị trí liên quan đến nút thu thập của nó, không được thụt vào chút nào) và mỗi dòng mới được thay thế bằng dấu cách khi được tải (vì vậy bạn cần phải quan tâm một chút đến vị trí đặt dòng mới).


Có nhiều quan niệm sai lầm trong bài đăng của bạn, dẫn đến việc bạn đặt câu hỏi sai.

Không có cái gọi là chuỗi YAML nhiều dòng . YAML có các đại lượng vô hướng và một số đại lượng vô hướng này có thể được chương trình tải dưới dạng chuỗi, trong khi một số chương trình khác sẽ được tải dưới dạng số nguyên, số float, v.v.

Rõ ràng là bạn quan tâm đến các nút vô hướng đang được tải dưới dạng một chuỗi, vì chuỗi đó sau đó có thể được hiểu như một dòng lệnh. Nhưng bạn không muốn có dòng lệnh nhiều dòng (tức là với các dòng mới được nhúng), vì các tập lệnh nhiều dòng không được hỗ trợ trong Gitlab CI (như @Jordan đã chỉ ra).

Để dễ đọc, bạn muốn sử dụng khả năng, tiêu chuẩn, của YAML để tải các đại lượng vô hướng nhiều dòng dưới dạng chuỗi đơn dòng.

Nếu bạn không quan tâm đến khả năng đọc, bạn có thể sử dụng:

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

và vì đại lượng vô hướng của bạn không được trích dẫn (tức là nó bắt đầu bằng echo) nên bạn không cần thực hiện bất kỳ điều gì đặc biệt trong YAML đối với dấu gạch chéo ngược hoặc dấu ngoặc kép.

Kết quả của tập lệnh là như nhau (in một dòng trống, in echo 'hi';trên một dòng thụt vào bốn khoảng trắng, in echo 'bye';trên một dòng thụt vào bốn khoảng trắng.)

Nếu bạn muốn sử dụng đầu vào nhiều dòng để dễ đọc, được tải dưới dạng một dòng, về cơ bản có hai tùy chọn: sử dụng đại lượng mặt phẳng nhiều dòng hoặc sử dụng đại lượng vô hướng gấp trong YAML của bạn.

vô hướng đơn giản nhiều dòng

Đồng bằng có nghĩa là đại lượng vô hướng không được trích dẫn, và như với bất kỳ thứ nhiều dòng nào trong YAML đa dòng có nghĩa là các dòng sau cần được thụt lề một cách thích hợp, trong trường hợp này là xa hơn dòng ban đầu

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

dòng mới được thay thế bằng dấu cách, vì vậy đừng làm như sau:

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

vì bạn sẽ nhận được một không gian hiển thị trước đó bye.

Có một số hạn chế như vậy là bạn không thể có dấu hai chấm theo sau là dấu cách trong một đại lượng vô hướng như vậy (sẽ làm cho nó giống như cặp khóa-giá trị).

Không cần thiết phải thoát khỏi dấu gạch chéo ngược trong vô hướng đơn giản, vì bạn không thể thoát bất kỳ ký tự nào trong một vô hướng đơn giản, nhưng tất nhiên bạn có thể bao gồm dấu gạch chéo ngược, sẽ kết thúc trong chuỗi được tải từ YAML và có thể có ý nghĩa đối với lệnh được thực thi từ chuỗi đó.

vô hướng gấp

Một đại lượng vô hướng gấp khúc tương tự như một đại lượng vô hướng thuần túy ở chỗ tất cả các dòng mới (đơn) được thay thế bằng một khoảng trắng trong khi tải:

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

Bạn cần phải thụt lề thông tin lệnh thực tế ít nhất bằng chỉ báo vô hướng được gấp lại ( >).

Trái ngược với vô hướng đơn giản, những thứ như :không có ý nghĩa đặc biệt. Vì vậy, nếu các vô hướng đơn giản không thành công bằng cách tạo ra một lỗi YAML, các vô hướng gấp tương tự rất có thể sẽ không.


Tôi muốn viết nó nhiều dòng để rõ ràng và dễ bảo trì. Trong khi ví dụ của tôi là tầm thường, các tập lệnh thực sự thì không.
samanime

Tôi có thể hiểu điều đó. Có thể chấp nhận xử lý trước tệp YAML có thể đọc được của bạn trước khi nó được GitLab CI xử lý không?
Anthon

Tôi đã cân nhắc điều đó. Đó là một bước bổ sung và thêm một chút phức tạp, nhưng có thể đáng giá.
samanime

Tôi đã thêm một giải pháp khả thi.
Anthon

3
Oh Boy. Mặc dù đúng về mặt kỹ thuật, nhưng câu trả lời này dài dòng một cách lố bịch đến mức không thể đọc được. Mọi người đều không viết một phân tích cú pháp YAML có lẽ chỉ muốn PotatoFarmer 's upvoted cao và nhiều câu trả lời terser , để thay thế.
Cecil Curry vào

111

Tôi đã đến đây trước dự đoán đây sẽ là một vấn đề nhưng lệnh "nhiều dòng" sau đây để dễ đọc đang hoạt động với tôi:

Gitlab Runner: Shell Runner phiên bản 1.11.0 / Phiên bản 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
Thủ thuật ở đây là gì? Bạn có thụt lề dòng thứ hai ngang với dòng đầu tiên không?
Victor Grazi

6
@ victor-grazi Theo tôi hiểu: Trong YAML thuần túy (vô hướng dòng chảy thuần túy), các lệnh thoát (chẳng hạn như dòng mới \n) không làm gì cả và khoảng trắng ở đầu bị bỏ qua - có vẻ như Gitlab YAML phân tích cú pháp các khối tập lệnh theo kiểu này. Về thụt lề: YAML spec nói In YAML block styles, structure is determined by indentationvà vì vậy dòng thứ hai được thụt vào nhiều như yêu cầu đối với YAML spec (một khoảng trắng liên quan đến thụt lề chính) và một dòng nữa để dễ đọc (về mặt kỹ thuật là thừa nhưng đẹp hơn).
PotatoFarmer

Hoạt động như một sự quyến rũ. Cũng làm việc với tất cả các params trong dòng sản phẩm mới
bodolsog

25

Bạn có thể sử dụng bất kỳ tập lệnh / lệnh đa dòng nào thông qua tính năng yaml Lite_block và neo. Thí dụ:

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

Cảm ơn bạn đã chia sẻ - chức năng nâng cao hơn này sẽ đặc biệt hữu ích để có thể đọc được công việc / có thể sử dụng lại các đoạn mã trong suốt công thức.
PotatoFarmer

5
Đây là một ví dụ tuyệt vời, nhưng nó sẽ được rõ ràng hơn nếu bạn định nghĩa .rsync
Victor Grazi

13

Lệnh tạo cấu hình wp khá phức tạp ... từ .gitlab-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

Điều này làm việc cho tôi trong Travis CI

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

Ở đây hai biến env ( ${GITHUB_USERNAME}${GITHUB_PASSWORD}) cũng sẽ được nội suy


0

Định dạng này sẽ hoạt động. sử dụng một đại lượng vô hướng đơn giản (không có dấu ngoặc kép) trong YAML. Ví dụ: tập lệnh được sử dụng để khởi tạo chương trình phụ trợ terraform

  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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.