파이프라인 YAML의 고급 사용법이 공개되었습니다! 중복 코드를 대폭 줄이고 멀티태스크를 유연하게 배치

작가 : 무얀

YAML 파이프라인을 구성할 때 다음과 같은 문제가 발생합니까?

  • 유사한 작업 시나리오가 단일 파이프라인에서 일괄적으로 실행되는 경우 유사한 논리를 가진 여러 작업을 YAML에 정의해야 합니다. 작업이 많을수록 파이프라인 YAML 구성이 길어지고 YAML의 코드 반복이 많아지고 코드 재사용성이 높아집니다. 가독성도 낮고 가독성도 안좋습니다.
  • 관리자는 통합된 방식으로 여러 파이프라인을 관리합니다. 다중 애플리케이션 기술 아키텍처는 R&D 프로세스와 유사합니다. 몇 가지 구성 및 배포 매개변수만 일치하지 않는 경우 각 파이프라인은 차별화된 매개변수를 독립적으로 수정해야 하므로 구성 비용이 높아집니다. 각 파이프라인은 독립적으로 구성되어 통합 관리 및 제어가 불가능하며 유지 관리성이 낮습니다.
  • 파이프라인 YAML은 정적 파일이며 파이프라인 저장 시 작업 실행 로직이 고정됩니다. 그러나 일부 R&D 시나리오의 파이프라인 실행 프로세스는 런타임 시 명확해야 하며 사전에 구성할 수 없습니다. 일반 파이프라인 YAML은 이 시나리오를 충족할 수 없습니다.

이와 관련하여 Yunxiao Flow 파이프라인 YAML은 템플릿 언어 사용을 지원하여 파이프라인 YAML을 동적으로 렌더링하도록 지원하는 템플릿 구문을 도입합니다. 이는 동일하거나 유사한 논리를 사용하는 여러 작업의 일괄 구성 시나리오를 충족하고 동적 생성을 충족할 수 있습니다. 필요에 따라 여러 작업에 대한 시나리오를 작성하고 파이프라인 YAML 코드의 중복을 줄이고 멀티태스킹을 유연하게 조정합니다.

템플릿 구문이란 무엇입니까?

템플릿은 텍스트를 정의하고 렌더링하는 데 사용되는 템플릿 언어입니다. 변수, 조건문, 루프 구조 등과 결합할 수 있으므로 YAML 파일은 컨텍스트 또는 외부 데이터 소스를 기반으로 다양한 구성 출력을 생성할 수 있습니다. 동적 렌더링은 파이프라인 YAML을 생성합니다. 런타임에.

Cloud Effect Pipeline은 템플릿 엔진을 도입하고 template=true파이프라인의 YAML 주석 첫 번째 줄을 통해 템플릿 모드를 지정하며 {{ }}정의된 템플릿 언어 의 사용을 지원하고 매개변수로 정의된 변수 go template의 사용을 지원합니다. variables렌더링 파이프라인. 일반적으로 적용 가능한 시나리오는 다음과 같습니다.

템플릿 구문 핵심 사용 시나리오

시나리오 1: 다중 운영체제, 다중 SDK 버전 호환성 테스트 시나리오

일부 호환성 테스트 시나리오에서 n개의 서로 다른 운영 체제와 m개의 서로 다른 SDK 버전에서 코드를 테스트해야 하는 경우 파이프라인에서 n * m개의 작업을 정의해야 합니다. 각 작업의 실행 논리는 실제로 동일합니다. 이 시나리오에서는 호환성 테스트가 필요한 시나리오가 많을 때 파이프라인 YAML이 매우 길고 반복되는 코드가 많아 유지 관리가 어렵고 작업 실행 논리가 수정되면 수정해야 합니다. n * m 번.

템플릿 구문이 도입된 후 호환성 시나리오를 변수로 추출할 수 있고 범위 구문을 사용하여 시나리오를 반복하고 여러 작업을 일괄 생성할 수 있으므로 작업 실행 논리가 수정될 때 YAML 코드의 양이 크게 줄어듭니다. 한 번만 수정하면 됩니다.

예를 들어, 다음 코드에서는 템플릿의 범위 루프를 사용하여 2개의 운영 체제["linux", "windows"]와 3개의 JDK 버전["10", "11", "17"]을 탐색합니다. 편리하게도 동일한 로직을 가진 6개의 작업이 생성됩니다.

# template=true
variables:
  - key: osList
    type: Object
    value: ["linux", "windows"]
  - key: jdkVersionList
    type: Object
    value: ["10", "11", "17"]

stages:
  build_stage:
    name: 兼容性测试
    jobs:                             # 双层循环,生成 2*3 个Job
      {{ range $os := .osList}}
        {{ range $jdk := $.jdkVersionList}}
        {{ $os }}_JDK{{ $jdk }}_job:
                   name: 测试-{{ $os }}-JDK{{ $jdk }}
                   my_step:
                     name: 执行命令
                     step: Command
                     with:
                       run: |
                         echo 'test on {{ $os }}-JDK{{ $jdk }}"
        {{ end }}
        {{ end }}

파이프라인의 실행 효과는 다음과 같습니다.

시나리오 2: 필요에 따라 여러 애플리케이션을 동적으로 구축 및 배포

하나의 시스템에서 여러 응용 프로그램을 공동 릴리스하는 시나리오에서 비즈니스 요구 사항 수정에는 시스템 아래의 일부 응용 프로그램만 포함되며 각 릴리스는 일부 응용 프로그램의 구성 및 배포만 트리거합니다. 이 경우 정적 YAML 파일 구성을 사용하면 애플리케이션 구성 및 배포 작업 시나리오의 동적 생성을 충족할 수 없습니다.

템플릿 구문이 도입된 후 애플리케이션을 변수로 추출할 수 있고 범위 구문을 사용하여 구성을 반복할 수 있습니다. 파이프라인 런타임 중 입력된 애플리케이션 목록에 따라 여러 애플리케이션 구성 및 배포 작업이 동적으로 생성될 수 있습니다. 수요.

다음 예에서 볼 수 있듯이 애플리케이션에 따라 여러 애플리케이션 코드 소스, 여러 애플리케이션 구축 작업, 여러 애플리케이션 배포 작업을 구성했습니다. 런타임 입력 환경 변수 appname을 기반으로 배포되도록 여러 애플리케이션을 동적으로 결정할 수 있습니다.

# template=true
variables:
  - key: appnames
    type: Object
    value: ["app1", "app2", "app3"]

sources:
  {{ range $app := .appnames }}
  repo_{{ $app }}:
    type: codeup
    name: 代码源名称-{{ $app }}
    endpoint: https://yunxiao-test.devops.aliyun.com/codeup/07880db8-fd8d-4769-81e5-04093aaf7b2b/c{{ $app }}.git
    branch: master
    certificate:
      type: serviceConnection
      serviceConnection: wwnbrqpihykbiko4
  {{ end }}

defaultWorkspace: repo_app1

stages:
  build_stage:
    name: 构建阶段
    jobs:
      {{ range $app := .appnames }}
      build_job_{{ $app }}:
        name: 构建任务-{{ $app }}
        sourceOption: ['repo_{{ $app }}']
        steps:
          build_{{ $app }}:
            step: Command
            name: 构建-{{ $app }}
            with:
              run: "echo start build {{ $app }}\n"
      {{ end }}
  deploy_stage:
    name: 部署阶段
    jobs:
      {{ range $app := .appnames }}
      deploy_job_{{ $app }}:
        name: 部署任务-{{ $app }}
        needs: build_stage.build_job_{{ $app }}
        steps:
          build_{{ $app }}:
            step: Command
            name: 部署-{{ $app }}
            with:
              run: "echo start deploy {{ $app }}\n"
      {{ end }}

파이프라인의 실행 효과는 다음과 같습니다.

Yunxiao에서 템플릿 구문을 사용하는 방법

1) 파이프라인 YAML 편집 페이지에 들어가서 첫 번째 줄에 #template=true를 주석 처리하여 템플릿 모드로 전환합니다.

2) 템플릿 모드로 전환 후, {{ }} 템플릿 언어 정의 파이프라인이 지원됩니다.

  • 변수로 정의된 환경 변수를 렌더링 매개변수로 사용: 변수로 정의된 환경 변수를 문자열, 숫자, 부울 및 객체 다중 환경 변수 유형을 지원하는 템플릿 렌더링 매개변수로 사용합니다. 런타임 시 동일한 이름으로 환경 변수 덮어쓰기를 지원합니다.

  • 기본 Go 템플릿 구문을 따릅니다. Yunxiao Flow 파이프라인 템플릿 모드는 기본 Go 템플릿 구문을 따릅니다. 자세한 내용은 https://pkg.go.dev/text/template을 참조하세요. 일반적으로 사용되는 구문은 다음과 같습니다.

{{/* a comment */}}  // 注释
{{pipeline}}         // 引用
{{if pipeline}} T1 {{end}}   // 条件判断
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
{{range pipeline}} T1 {{end}}          // 循环
{{range pipeline}} T1 {{else}} T0 {{end}}
{{break}}
{{continue}}
  • 또한 Yunxiao Flow 파이프라인 템플릿 구문은 보다 유연한 오케스트레이션 시나리오를 충족하기 위해 다음 확장 기능을 지원합니다.
# add:整数相加函数,参数接收两个及两个以上 Integer
{{ add 1 2 }} // 示例返回:3
{{ add 1 2 2 }} // 示例返回:5

# addf:浮点数相加函数,参数接收两个及两个以上 Number
{{ add 1.2 2.3 }} // 示例返回:3.5
{{ add 1.2 2.3 5 }} // 示例返回:8.5

# replace:字符串替换函数,接收三个参数:源字符串、待替换字符串、替换为字符串
{{ "Hallo World" | replace "a" "e" }}  // 示例返回:Hello World
{{ "I Am Henry VIII" | replace " " "-" }}  // 示例返回:I-Am-Henry-VIII

3) 파이프라인이 실행되기 전에 YAML을 동적으로 렌더링하는 데 사용되는 파이프라인이 실행될 때 환경 변수를 구성합니다.

4) 파이프라인이 기대치를 충족하는지 확인하기 위해 사전 렌더링용 변수 사용을 지원하려면 "미리보기 모드"를 클릭하세요.

5) 올바른지 확인한 후 저장하고 파이프라인 실행을 시작합니다. 필요에 따라 런타임 변수를 수정하고, 런타임 환경 변수를 기반으로 파이프라인 YAML을 동적으로 렌더링하고, 작업을 동적으로 생성할 수 있습니다. JDK 버전을 ["17", "21"]로 수정하고 운영 체제를 ["linux", "windows"]로 유지하면 4개의 작업이 동적으로 생성됩니다.

Cloud Effect Pipeline Flow를 무료로 사용하거나 자세한 내용을 알아보려면 여기를 클릭하세요 .

Microsoft의 중국 AI 팀은 수백 명의 사람들을 모아 미국으로갔습니다. 알려지지 않은 오픈 소스 프로젝트는 얼마나 많은 수익을 가져올 수 있습니까? Huawei는 공식적으로 Yu Chengdong의 위치가 화중 과학 기술 대학의 오픈 소스 미러 스테이션 으로 조정되었다고 발표했습니다. 사기꾼들이 TeamViewer를 사용해 외부 네트워크 접속을 공식적으로 개시했습니다 ! 원격 데스크톱 공급업체는 무엇을 해야 합니까? 최초의 프런트 엔드 시각화 라이브러리이자 Baidu의 유명한 오픈 소스 프로젝트 ECharts의 창립자 - "바다에 나간" 유명한 오픈 소스 회사의 전직 직원이 소식을 전했습니다. 리더는 격노하고 무례하게 행동하여 임신한 여성 직원을 해고했습니다. OpenAI는 AI가 포르노 콘텐츠를 생성하도록 허용하는 것을 고려했습니다. Microsoft는 Rust Foundation에 100만 달러를 기부했다고 보고했습니다. 여기서 time.sleep(6)의 역할은 무엇입니까? ?
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/u/3874284/blog/11141855