새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

4 분 소요

목표 D-day : 87 일

학습 내용

GitActions의 다양한 기능을 맛본다.

  • artifact : 파일 또는 파일 모음으로 데이터 공유가 가능하다.
    • 파일 기반의 데이터 공유를 사용할때는 Actifact를 사용합니다.
  • output : 단순한 값 전달용도로 사용한다.
    • key-value 형태로 데이터를 저장한다.(steps: id)로 값을 구분합니다.
    • echo name =github-actions » $GITHUB_OUTPUT
jobs:
  create-output:
    runs-on: ubunto-latest
    outputs: # job level output
      tset: $
    steps:
      - name: echo output
        id: check-output # unique
        run: |  
          echo "test=hello" >> "$GITHUB_OUTPUT"
      - name: check output
        run: |
          echo $
          
  get-output:
    needs: [create-output]
    runs-on: ubuntu-latest
    steps:
      - name: get output
        run: |
          echo $
         # 다른 job에 있는 걸 사용하려면 needs로 의존하고 needs 키워드를 통해 접근합니다.
  • env 환경변수

    • 스코프에 따라 접근할 수 있는 레벨이 다릅니다
    • step > jobs > workflow 로 일반 프로그래밍 변수로 생각
    • 외부 환경 변수로도 접근 가능 vars.key로 접근합니다.
    name: var-2
    on: push
      
    jobs:
      get-var:
        runs-on: ubuntu-latest
        steps:
          - name: echo var
            run: echo "level=$"  # 외부
      
    ## 내부
    name: var-1
    on: push
      
    env:
      level: workflow
      
    jobs:
      get-env-1:
        runs-on: ubuntu-latest
        steps:
          - name: echo env
            run: echo "level=$"
      
      get-env-2:
        runs-on: ubuntu-latest
        env:
          level: job
        steps:
          - name: echo env
            run: echo "level=$"
      
      get-env-3:
        runs-on: ubuntu-latest
        env:
          level: job
        steps:
          - name: echo env
            run: echo "level=$"
            env:
              level: step
      
      get-env-4:
        runs-on: ubuntu-latest
        steps:
          - name: create env
            run: echo "level=step" >> $GITHUB_ENV # 이거는 env-3과 동일한 기능을 합니다.
          - name: check env
            run: echo "level=$"
    
  • secret

    • 민감한 데이터를 안전하게 저장해서 워크플로우에서 사용하기 위함

    • 민감 정보를 코드와 분리하여, 노출되는 것을 방지

    • 안전한 저장: 깃헙에서 안전하게 암호화 가능

    • 로깅 방지: 로그에 기록되지 않고, 출력시 마스킹

    • 접근 제한: 워크플로우 실행 중에만 접근 가능

    • 정의된 시크릿을 바꾸면 워크플로우 결과가 달라질 수 있음

    • secrets.<secret-name>으로 정의 하고 $로 사용

      name: scrects
      on: push
          
      jobs:
        get-scrects:
          runs-on: ubuntu-latest
          steps:
            - name: echo scrects
              run: echo "screct=$"
          
      # Run echo "screct=***"
      # screct=***
      
  • enviroment

    • 특정 환경에서만 사용 가능한 환경변수와 시크릿 관리
    • 레포지토리에서 정의할 수 있음
    • organization level
    • repository level
    • enviroment level
    • secrect,variables 모두 각각 환경마다 다른 변수를 사용할 수 있음
      • 우선 순위는 env > repo > org 순으로 범위가 좁을 수록 우선순위가 높습니다.
  • matrix

    • 변수 기반으로 여러 job을 실행하는 기능
    • matrix를 사용해서 하나의 잡을 구성하면, 여러 개의 잡을 실행하도록 할 수 있음
    • job.strategy.matrix.variable_name 으로 선언
    • $ 으로 사용 가능
    • 변수로 window,linux,maxOS 설정
      • 하나의 잡을 구성해서 러너가 다른 잡을 3개 실행
      • window 러너에서 실행
      • linux 러너에서 실행
      • macOS 러너에서 실행
    • 변수로 python 3.7~python3.9
      • 하나의 잡을 구성해서 같은 코드베이스에서 각 버전별로 테스트 구성
      • python 3.7에서 테스트
      • python 3.8에서 테스트
      • python 3.9에서 테스트

    matrix 기능이 없다면

    하나의 잡 구성이 아니라 여러 개의 잡을 구성해야할 수 있음.

    jobs:
      get-matrix:
        strategy:
          matrix:
            os: [macos-latest, windows-latest, ubuntu-latest]
            version: [12, 14, 16]
        runs-on: $
        steps:
          - name: echo matrix value
            run: |
              echo $
              echo $
    

    os별로 version이 실행됩니다. 따라서 9개의 잡이 실행됩니다.

  • If Condition

    • 특정 조건이 충족될 때 실행되도록 하는 데 사용됩니다
    • if: github.event_name == 'push': push 일 때만 실행
    • if: github.event_name != 'push': push가 아닐때만 실행
    • job level: 잡 실행 여부
    • step level: 스텝 실행 여부
    • 특정 job과 step을 강제로 실행 가능
    • if: always()
    name: if-condition
      
    on:
      push:
      workflow_dispatch:
      
    jobs:
      job1:
        runs-on: ubuntu-latest
        if: github.event_name == 'push'
        steps:
          - name: get event name
            run: |
              echo $
      
      job2:
        runs-on: ubuntu-latest
        if: github.event_name != 'push'
        steps:
          - name: get event name
            run: |
              echo $
      job3:
        runs-on: ubuntu-latest
        steps:
          - name: get event name if push
            if: github.event_name == 'push'
            run: echo "PUSH"
            
          - name: get event name if not push
            if: github.event_name != 'push'
            run: echo "WORKFLOW DISPATCH"
       
      job4:
        runs-on: ubuntu-latest
        steps:
          - name: exit 1
            run: exit 1
          - name: echo # exit 1이 실패하여 echo hello 실행
            if: always()
            run: echo hello
      
      job5:
        needs: [job1]
        runs-on: ubuntu-latest
        if: always() # needs와 상관없이 job level 실행
        steps:
          - name: echo
            run: echo hello
      
    

    filter와 차이점

    fitler

    • workflow 트리거를 더 세밀하게 제어합니다.
      • push event
      • branch filter: [dev, main]
      • dev, main branch 일때만 트리거

    If Condition

    • workflow가 트리거된 이후 job과 step을 세밀하게 제어합니다.
      • dev branch 일때 첫번째 job 실행
      • main branch 일때 두 번째 job의 세 번째 step 생략

스프링 부트의 필터와 유사한 기능으로 컨트롤러에 접속하기전에 제어하는 기능이 filter

If Condition은 프로그램 내부의 if문과 유사하여 특정 조건일 경우 특정 로직을 수행하도록 하는것

워크플로우 구성

GitHub 레포 생성 자동화 구성하기

  • 정해진 prefix 사용하는 레포지토리 이름
    • 레포지토리 이름을 어떻게 정할지 정하기
    • 어떤 prefix를 사용할지
  • 슬랙 알림 전송(성공,실패)

트리거 구성

레포지토리 이름과 prefix를 어떻게 정할지 사람마다 다릅니다. input값을 주어 실행을 하려면 workflow dispatch를 사용해야합니다.

CI 전략

  • PR Open : 코드 변경 사항이 처음 메인 코드베이스로 병합되도록 제안되는 순간
    • 기능 추가나 버그 수정과 같은 변경사항을 만들고 이를 메인 코드베이스에 통합하고자 할 때
    • 이때 CI프로세스를 시작하는 이유
      • 변경사항이 기존 코드와 문제없이 잘 통합 되는 지
      • 새로운 버그가 발생하지 않는 지
  • PR Synchronized: 이미 열려있는 PR에 추가 커밋이 생길 때 발생
    • 추가적인 변경사항이 기존 PR에 추가는 순간
      • 이 변경사항도 기존 코드와 잘 통합되는 지
      • 새로운 문제 발생시키지 않는 지 검증
      • 최초의 PR은 문제가 없더라도 추가된 변경사항에서 문제 발생하는 지 확인하기 위해서입니다.

CI 프로세스 없다면

버그나 오류가 그대로 반영될 위험성이 있습니다.

  • 테스트
    • 유닛 테스트, 통합 테스트, 리그레션 테스트
    • 코드 컨벤션, 보안 취약점 검사
    • etc

CD 전략

  • 코드 변경사항이 메인 코드베이스로 통합되는 순간
    • 이 시점에 CD 프로세스를 시작하는 이유
    • 안정적이고, 검증된 코드를 실제 배포 환경에 신속하게 반영
    • 새로운 기능이나 수정사항 제공

CD 프로세스가 없다면

검증된 코드가 사용자에게 도달하는 데 시간이 지체됨.

워크플로우 구성

워크 플로우 구성은 크게 트리거 구성과 잡 구성으로 구분되어있습니다.

트리거 구성

  1. github event: pull request
    • type: [open, sycronized]
  2. path filter : src에 변동사항이 생길 경우만
  3. branch filter: main에 pull request가 발생했을 경우 트리거

잡 구성

test

  • cache action 캐시 액션 사용으로 시간 단축
  • build
  • test

워크 플로우는 트리거 구성과 잡 구성을 통해 CI/CD를 동작할 수 있습니다.

댓글남기기