Làm cách nào tôi có thể sử dụng IF ELSE trong các biến của đường ống yaml azO Devure với nhóm biến?


8

Tôi đang cố gắng gán một trong 2 giá trị cho một biến ngoài nhóm biến và không thể tìm thấy tài liệu tham khảo về cách sử dụng IF ELSE.

Về cơ bản tôi cần phải chuyển đổi logic jerkins này sang phương pháp DevOps.

Jenkins

if (branch = 'master') { 
   env = 'a'
} else if (branch = 'dev'){
    env ='b'
}

Tôi đã tìm thấy 1 tài liệu tham khảo từ cái sau, nhưng cái này có vẻ hoạt động nếu phần biến không có các nhóm biến.

https://stackoverflow.com/a/57532526/5862540

Nhưng trong đường ống của tôi, tôi đã có một nhóm biến cho bí mật, vì vậy tôi phải sử dụng tên / ước giá trị và ví dụ không làm việc với các lỗi như expected a mappinghay A mapping was not expectedhayUnexpected value 'env'

variables:
- group: my-global
- name: env
  value:
    ${{ if eq(variables['Build.SourceBranchName'], 'master') }}: 
      env: a
    ${{ if eq(variables['Build.SourceBranchName'], 'dev') }}: 
      env: b

hoặc là

variables:
- group: my-global
- name: env
  value:
    ${{ if eq(variables['Build.SourceBranchName'], 'master') }}: a
    ${{ if eq(variables['Build.SourceBranchName'], 'dev') }}: b


Một cách giải quyết khác mà tôi có bây giờ là tôi sao chép các biến secion với biểu thức vào tất cả các công việc mà tôi cần. Nhưng tôi muốn làm cho nó biến toàn cầu đơn giản.
kevmando

Câu trả lời:


1

Tôi nghĩ bây giờ bạn sẽ cần sử dụng một tác vụ để tùy chỉnh với name/valuecác biến cú pháp và các giá trị biến có điều kiện. Dường như cấu trúc đối tượng cho name/valuecú pháp phá vỡ phân tích cú pháp các biểu thức, như bạn đã chỉ ra.

Đối với tôi, sau đây là một triển khai hợp lý sạch sẽ và nếu bạn muốn trừu tượng hóa nó ra khỏi đường ống, có vẻ như một mẫu đơn giản cho nhiều đường ống của bạn sử dụng sẽ đáp ứng mong muốn về một vị trí "toàn cầu" trung tâm.

variables:
  - group: FakeVarGroup
  - name: env
    value: dev

steps:
  - powershell: |
      if ($env:Build_SourceBranchName -eq 'master') {
        Write-Host ##vso[task.setvariable variable=env;isOutput=true]a
        return
      } else {
        Write-Host ##vso[task.setvariable variable=env;isOutput=true]b
      }      
    displayName: "Set Env Value"

Cảm ơn đề nghị. Tôi nghĩ rằng tôi đã thấy giải pháp tương tự từ đây, nhưng chưa thử vì tôi hy vọng sẽ có giải pháp đơn giản hơn mà không cần thêm một bước. Tôi cũng đã yêu cầu MS hỗ trợ, vì vậy nếu họ không có giải pháp thì tôi sẽ thử.
kevmando

Tôi đã trao đổi e-mail với hỗ trợ của MS và họ đã kết thúc bằng cách đề xuất cách giải quyết này và yêu cầu tôi nhập đề xuất tính năng cho cộng đồng MS dev. Vì vậy, tôi sẽ đánh dấu đây là câu trả lời ngay bây giờ.
kevmando

0

Theo như tôi biết, cách tốt nhất để xây dựng nhánh có điều kiện là sử dụng "kích hoạt" trong YAML của bạn, thay vì triển khai "if-other" phức tạp. Nó cũng an toàn hơn nhiều, và bạn có các điều khiển rõ ràng hơn trên các kích hoạt chi nhánh thay vì dựa vào các biến CI.

Thí dụ:

# specific branch build 
jobs:
- job: buildmaster
  pool:
    vmImage: 'vs2017-win2016'
  trigger:
    - master

  steps:
  - script: |
      echo "trigger for master branch"

- job: buildfeature
  pool:
    vmImage: 'vs2017-win2016'
  trigger:
    - feature

  steps:
  - script: |
      echo "trigger for feature branch"

Để có trình kích hoạt bao gồm và loại trừ các nhánh, bạn có thể sử dụng cú pháp kích hoạt phức tạp hơn với các nhánh bao gồm và loại trừ.

Thí dụ:

# specific branch build
trigger:
  branches:
    include:
    - master
    - releases/*
    exclude:
    - releases/1.*

Tài liệu chính thức của Azure DevOps Pipelines triggertrong YAML là: Tài liệu kích hoạt Azure Pipelines YAML

CẬP NHẬT 1 :

Tôi đăng lại nhận xét của mình ở đây với các ghi chú bổ sung: Tôi đã nghĩ rằng có các đường ống khác nhau bởi vì sự phức tạp của việc tung hứng giữa các biến CI không thể duy trì hơn so với việc có nhiều công việc trong một YAML với các trình kích hoạt. Có multijobs với các kích hoạt cũng buộc chúng ta phải có sự phân biệt rõ ràng và cung cấp về quản lý chi nhánh. Nhóm kích hoạt và bao gồm các nhánh có điều kiện đã được sử dụng trong một năm bởi nhóm của tôi vì những lợi thế bảo trì này.

Vui lòng không đồng ý, nhưng với tôi có một logic nhúng trong bất kỳ kịch bản nào trong bất kỳ bước nào để kiểm tra nhánh nào hiện đang trong phiên và sau đó thực hiện bất kỳ hành động nào khác, giống như các giải pháp đặc biệt hơn. Và điều này đã mang lại cho nhóm của tôi và tôi vấn đề bảo trì trước đây.

Đặc biệt nếu logic nhúng có xu hướng phát triển bằng cách kiểm tra các nhánh khác, thì độ phức tạp muộn hơn so với việc phân tách rõ ràng giữa các nhánh. Ngoài ra, nếu tệp YAML sẽ được duy trì trong thời gian dài, nó cần có các điều khoản và lộ trình rõ ràng trên các chi nhánh khác nhau. Dự phòng là không thể tránh khỏi, nhưng ý định tách logic cụ thể sẽ trả nhiều tiền hơn trong thời gian dài cho khả năng bảo trì.

Đây là lý do tại sao tôi cũng nhấn mạnh các chi nhánh và loại trừ trong câu trả lời của tôi :)


Cảm ơn đề xuất, nhưng đường ống của tôi cũng đã sử dụng kích hoạt cho các mục đích khác nhau. (Thành thật mà nói, bản thân tính năng kích hoạt cũng cảm thấy kém linh hoạt hơn so với Jenkins. Khó thực hiện các điều kiện như hủy bỏ bản dựng pr / chi nhánh trùng lặp, v.v. lặp lại cùng một công việc một lần nữa chỉ để thay đổi một giá trị duy nhất cho mỗi chi nhánh. (Tôi cũng có thể giải quyết để lặp lại các phần biến, đó sẽ là mã dự phòng ít hơn.)
kevmando

Có lẽ tôi cần phải nghĩ ra khỏi hộp 'jenkins' vì đó không phải là Jenkins, nhưng nhóm không muốn có một đường ống mới mà không có lợi thế rõ ràng.
kevmando

Đường ống mới? Không. YAML đó nằm trong một tệp, do đó, nó có thể được sử dụng trên một đường ống có thể phục vụ nhiều chi nhánh,
Eriawan Kusumawardhono

Ý tôi là đường ống mới là, luồng công việc mới hoạt động khác với luồng công việc trước đó. Không liên quan đến chủ đề này, nhưng nhiều tùy chọn kích hoạt hơn vì nó đã được đề cập ở đây.
kevmando

OP không hỏi làm thế nào để kích hoạt bản dựng dựa trên giá trị nhánh. Câu hỏi được đặt ra là làm thế nào để tạo ra một giá trị biến có điều kiện dựa trên bối cảnh đường ống được kích hoạt. Giải pháp của bạn khi áp dụng cho câu hỏi thực tế đã yêu cầu OP tạo 2 đường ống 1) trigger = master & env = a 2) trigger = dev & env = b.
Josh Gust
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.