ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 세마포어 CI로 Github CI/CD 구축하기 - 3. yaml파일 작성하기
    Project/CICD 2022. 7. 24. 23:35
    728x90
    반응형

     

     세마포어 CI/CD 파이프라인 설정은 UI를 통해 간단하고 직관적으로 할 수 있지만 수정할 때마다 웹에 들어가는 게 귀찮기도 하고 해서 yaml파일을 작성했다.

     설정 파일 경로는 기본적으로 트리거 할 브랜치에 .semaphore/semaphore.yaml로 지정되어있는데 프로젝트 setting에서 변경할 수 있다.

     

     yaml파일은 다음과 같이 구성된다 (자세한 내용은 공식문서 참고)

    • version: 세마포어 yaml 버전
    • name: 파이프라인 이름
    • agent: 하드웨어와 소프트웨어 스펙 정의 (machine type, os image, container). Task 단위로 다르게 설정 가능하다.머신 종류에 따라 부과되는 금액이 다르거나 현재 사용하는 플랜에 따라 사용할 수 있는 머신 종류가 다르므로 미리 확인하는 것이 좋다.
    • global job config: 파이프라인 전체에서 공통적으로 사용할 환경변수를 불러와준다. 환경변수 설정 및 사용 방법은 다음 포스팅에서 다룰 예정
    • blocks
      • name: 각 블록의 이름을 지정한다. 하나의 블록은 여러개의 job으로 구성할 수 있다. 한 블록에서 다음 블록으로 넘어갈 때 환경은 초기화되는데, cache기능을 사용하여 다음 블록으로 값을 넘겨줄 수도 있다.
      • dependencies: 해당 블록이 어떤 블록에 의존성을 가지는지 정의한다. 즉, dependencies에 설정하지 않은 블록과는 병렬로 실행되고, 설정한 블록과는 직렬로 (지정한 블록이 실행되고 난 후) 실행된다.
      • run: 해당 블록이 실행되는 조건을 정할 수 있다 (지정한 조건에 해당하는 경우에만 실행). 디폴트 브랜치가 master로 되어있으므로 트리거가 되는 브랜치가 다른 경우 - 특히 main인 경우 - when 구문을 통해 지정해주어야한다.
      • skip: 해당 블록이 skip되는 조건을 정할 수 있다 (지정한 조건이 해당하는 경우에는 실행되지 않음)
      • task: 해당 블록에서 실행되는 작업 단위이다.

    내가 작성한 yaml파일은 다음과 같다. semaphore 가상머신에는 기본적으로 AWS CLI가 설치되어 있기 때문에 원래는 yaml파일 만으로 배포 작업을 구성하려 했는데, 여러가지 파일이 변경 되는 경우 for문을 돌려야하고 그러면 어차피 쉘스크립트 파일을 작성해야해서 나에게 조금 더 편한 언어인 파이썬으로 배포 작업을 구성했다. 따라서 yaml파일에는 그냥 파이썬 파일을 실행해라 라는 단순한 command밖에 없긴 하다.

     

     Change-in이라는 기능이 있는데, 특정 디렉토리에 변화가 감지될 경우를 조건에 걸 수 있는 기능이다. run이나 skip에 걸어서 해당 브랜치, 또는 디렉토리, 또는 특정 조건에 변화가 생길 경우 해당 블록을 실행시키거나 skip시킬 수 있다. 나는 해당 기능을 사용해 디렉토리에 변화가 없을 때는 해당 디렉토리와 관련된 배포 블록이 skip되도록 설정했다. semaphore ci는 실행시간에 따라 금액이 부과되므로 큰 차이는 안나겠지만 활용하면 좋은 기능이다.

     외에도 여러가지 조건을 활용해 파이프라인을 짤 수 있는데, 자세한 내용은 when condition 공식문서를 참조하면 좋다.

    version: v1.0
    name: test build
    agent:
      machine:
        type: e1-standard-2
        os_image: ubuntu2004
    
    global_job_config:
      secrets:
        - name: aws-credentials-de
        - name: aws-arn-de
    
    blocks:
      #lambda 디렉토리에 변경사항이 있는 경우 다음 블록 실행
      - name: Lambda
        dependencies: []
        run:
          when: "change_in('/lambda/', {default_branch: 'main', pipeline_file: 'ignore'})"
        task:
          jobs:
            - name: Deploy to Lambda
              commands:
                - checkout
                - python -m pip install boto3          
                - python .semaphore/deploy_lambda.py
    
      #glue 디렉토리에 변경사항이 있는 경우 다음 블록 실행
      - name: Glue
        dependencies: []
        run:
          when: "change_in('/glue/', {default_branch: 'main', pipeline_file: 'ignore'})"
        task:
          jobs:
            - name: Deploy to Glue
              commands:
                - checkout
                - python -m pip install boto3          
                - python .semaphore/deploy_glue.py
      
      #stepfunction 디렉토리에 변경사항이 있는 경우 lamda, glue 블록 실행 후 다음 블록 실행
      - name: StepFunctions
        dependencies: ["Lambda","Glue"]
        run:
          when: "change_in('/stepfunctions/', {default_branch: 'main', pipeline_file: 'ignore'})"
        task:
          jobs:
            - name: Deploy to Step Functions
              commands:
                - checkout
                - python -m pip install boto3          
                - python .semaphore/deploy_stepfunction.py
    
      #eventbridge 디렉토리에 변경사항이 있는 경우 lamda, glue -> stepfunction블록 실행 후 다음 블록 실행
      - name: EventBridge
        dependencies: ["StepFunctions"]
        run:
          when: "change_in('/events/', {default_branch: 'main', pipeline_file: 'ignore'})"
        task:
          jobs:
            - name: Deploy to Event Bridge
              commands:
                - checkout
                - python -m pip install boto3          
                - python .semaphore/deploy_eventbridge.py

     

    728x90
    반응형

    댓글