[CI/CD] Git Action이용한 배포 자동화

홍인열·2024년 2월 26일
0
post-thumbnail
post-custom-banner

What is GitAction?

Git Action은 Github에서 제공하는 CI/CD 도구로, 코드를 Push, Pull Request, 또는 Schedule에 따라 자동으로 다양한 작업을 실행하여 개발 Workflow를 자동화할 수 있다.

work flows 설정을 통해 Git Action을 자동화 시킬 수 있음.

⚠️ work flows 파일위치는 약속되어 있음

root/.github/workflows 아래 YAML 파일이 위치해야만 정상적으로 인식 된다.파일 확장자는 .yml 또는 .yaml을 사용한다. (’ .github ’ 폴더 이름의 ‘ . ’ 빼먹지 말기)

Work flows 실행 시점은 언제인가 ?

Trigger Event가 발생하게 되면 workflows는 실행 됨.

Event 설정은 'on' 키 통해 설정할 수 있으며, 필수로 입력해야함.

*ex) push, fork, schedule 등…

🔗 모든 Trigger Event

Trigger event : push

: push event 발생시 job 이하 로직이 순서대로 시작됨.

on: push
job: 
	...

Filter 사용하기

  • branches / branches-ignore
on: 
	push:
	# 특정 branch의 push 이벤트 발생시에만
		branches:
			- targetBranch1
			- targetBranch2

  # 특정 branch의 push 이벤트는 제외
		branches-ignore:
			- targetBranch3
  • tag + branches : 여러 필터중 하나만 만족하면 이벤트는 실행됨.
on: 
	push:
		tags:
			- 'dev-[0-9]+.[0-9]+.[0-9]+'
		branches:
		  - 'dev'

실행할 사항 설정

🔗 설정 가능한 실행 환경 (runs-on 옵션)

‘jobs’ 키 하위로 실행시킬 행위를 설정 할 수 있음.

...
on:
	...
jobs: #jobs 하위에 실행시킬 행위 설정
	deploy: # 그룹을 지정한다 필수이며 1개 만있어도 됨.
		runs-on: ubuntu-latest # 명령을 실행할 환경 설정
		strategy:
			matrix:
				node-version: ['18.x']
		steps: # 순서대로 실행시킬 명령 작성
			...
			# '-' 는 단계를 나타냄, name을 사용하지 않아도되며 사용하지 않으면 uses 또는 run 이 그대로 사용됩니다..
			- name : check 
				uses : actions/checkout@v3
			- name : install 
				run: npm install
			...

기타 문법

| : run 섹션에서 | 기호는 여러 줄의 쉘 명령을 실행하도록 지정하는 데 사용되며, 각 줄은 별도의 쉘 명령으로 처리.

...
jobs:
	...
	steps:
		run:|
			echo "This is the first command."
      echo "This is the second command."
		...
		
#미사용시 각 명령을 세미콜론(';')으로 구분해야한다. 
		run: echo "This is the first command."; echo "This is the second command."
			

with : uses 키워드로 지정된 액션에 전달되는 입력 인수.

...
	steps:
	  - name: Check out code
	    uses: actions/checkout@v2
	    with: # 여러값을 추가할 수 있음.
	      ref: 'main'

id : id 필드는 GitHub Actions 워크플로우에서 특정 단계를 식별하는 데 사용되며, 이 id는 후속 단계에서 이 단계의 출력을 참조하는 데 사용될 수 있음.

...
  steps:
    - name: Step 1
      id: step1
      run: echo "::set-output name=output1::value1"
    - name: Step 2
      run: echo "The output of Step 1 is ${{ steps.step1.outputs.output1 }}"

예시

name: example-workflow
on:
  push:
		# 특정 tag를 감지하여 git flwo 실행
    tags:
      - 'dev-[0-9]+.[0-9]+.[0-9]+'

jobs:
  deploy:
    name: CI Pipeline
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: ['18.x']
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      - name: Setting environment
        run: |
          mv ./env/.env ./.env
          mv ./env/.env.development ./.env.production

      - name: Set env version
        run: |
          echo "${{  github.ref_name }}" >> ./.env.production
        env:
          NEXT_PUBLIC_WEB_VERSION: ${{  github.ref_name }}

      - name: Install dependencies
        run: npm install

      - name: Run build
        run: npm run build

      # Make ZIP file with source code
      # -x는 zip파일 생성 시에 해당 부분들을 제외한다
      - name: Generate deployment package
        run:
          zip -r deploy.zip ./public/favicon-32x32.ico .next/ .ebignore .npmrc
          package.json .env.production -x .next/cache/*

      - name: Generate static
        run: |
          mkdir public/_next
          mv .next/static public/_next/static

      - name: Current timestamp
        id: timestamp
        run: echo "::set-output name=date::$(date +'%Y-%m-%dT%H-%M-%S-%3NZ')"

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.DEV_AWS_S3_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.DEV_AWS_S3_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2
      - run: aws s3 sync public s3://dev-example.io

      # Deploy to Elastic Beanstalk
      # application_name과 environment_name 한번더 확인!
      # 해당 부분은 꼭 같아야 한다!

      - name: Deploy to EB
        uses: einaregilsson/beanstalk-deploy@v14
        with:
          aws_access_key: ${{ secrets.DEV_AWS_EB_ACCESS_KEY_ID }}
          aws_secret_key: ${{ secrets.DEV_AWS_EB_SECRET_ACCESS_KEY }}
          application_name: dev-example-web-io
          environment_name: dev-example-web
          region: ${{ secrets.DEV_AWS_REGION }}
          version_label: '${{ steps.timestamp.outputs.date }}'
          deployment_package: deploy.zip
profile
함께 일하고싶은 개발자
post-custom-banner

0개의 댓글