캡스톤 디자인 회고 - GitHub Actions

최수환·2023년 6월 20일
1

캡스톤 디자인

목록 보기
5/5
post-thumbnail

CI/CD 파이프라인

GitHub Actions workflows를 어떻게 구성했는지에 앞서 이번 프로젝트에서 CI/CD 파이프라인을 왜 구축하는지에 대해서 간략하게 설명하겠다.

CI/CD 파이프라인을 구축하게 되면 개발이 완료된 후 유지보수 및 버전관리에 대한 자동화 배포가 가능해진다. 이번 프로젝트도 개발이 완료되고 난 후에도 파이프라인을 통해 지속적인 통합과 배포를 진행할 것이다.

하지만 이번 프로젝트에서 파이프라인을 구축한 가장 큰 이유는 개발자의 편리성을 향상시키기 위함이다.

  • 개발단계에서 파이프라인을 구축해놓음으로써 개발자가 추가하거나, 변경/수정한 코드에 대해 자동적으로 배포가 된다. 이를 통해 개발 단계에서도 지속적인 통합과 배포가 가능해진다.
  • 결론적으로 개발자는 자신이 개발한 코드를 Commit/Push 만 해도 배포환경에서 즉시 테스트가 가능해진다.

📒 이번 프로젝트에서는 개발 초기 단계에 파이프라인을 구축해놨었는데 Frontend, Backend 담당 팀원들이 매우 편리하다고 칭찬했던 것이 기억에 남는다.


GitHub Actions

GitHub Actions에 대한 설명은 해당 블로그에 포스팅 해두었다.

<파이프라인 아키텍처>

  • 직접 구성한 파이프라인 아키텍처이다. 구성요소에 대해서 간략하게 설명하겠다.
    • GitHub Actions : Workflow의 자동화를 위한 CI/CD 툴
    • Docker Hub: 빌드한 이미지를 저장하는 이미지 Repository
    • Git Hub : 개발 코드 및 배포 코드 Repository
    • ArgoCD : GitHub Actions에 의해 변경된 이미지를 적용하여 다시 배포

GitHub Actions의 Workflows를 구성하기에 앞서 두가지 사전작업이 필요하다.
1 . GitHub Actions가 Docker Hub에 접근하기 위한 권한 생성
2 . GitHub Actions가 ArgoCD가 연동중인 Git Repo에 접근하기 위한 권한 생성


Docker Hub 접근 권한 생성

1 . Docker Hub의 Account Settings -> Security 클릭
2 . 새로운 Token을 생성 후 Token값을 복사한다.
3 . GitHub에 Settings -> Secrets and Variables -> Actions 클릭
4 . 원하는 변수명으로 새로운 Secret 생성 및 위에서 복사한 Token값 입력

  • DOCKERHUB_TOKEN : Docker Hub에 로그인하기 위한 비밀번호
  • DOCKERHUB_USERNAME : Docker Hub에 로그인하기 위한 Docker Hub 계정명
    📌 계정명은 Secret으로 안해도 되지만 굳이 노출시키지 않기 위해 지정하였다.

  • Secret에 등록했으므로 위와같이 등록한 Secret을 불러서 쓸 수 있다.

📒 처음에는 Frontend Repository, Backend Repository, AI Repository 각각에 Settings에 들어가 Secret을 등록해주었다. 하지만 이번 프로젝트는 Git Hub Organization을 생성하여 작업하고 있기 때문에 굳이 Repository마다 등록해줄 필요없다. 따라서 Organization 단위로 등록해주었는데 훨씬 편리했다.

  • Organization의 Settings에 들어가 똑같이 Secret을 등록해주면 된다

다른 Repo에 대한 접근권한 생성

  • 프로젝트는 코드 관리를 위해 Git Hub의 Organization을 구성하였고 Frontend,Backend,AI,Deploy를 위한 Repository가 존재한다.
  • ArgoCD는 Deploy Repository와 Sync를 맞추고 있다. 따라서 Frontend,Backend,AI Repository에 구성한 GitHub Actions가 Deploy Repository에 접근할 권한이 필요하다.

1 . 계정을 눌러 Settings -> Developer Settings -> Personal access tokens -> Tokens 클릭
2 . 새로운 Token을 생성하고 Token 값을 복사한다.
3 . 다시 Organization으로 돌아와 위와 마찬가지로 Settings에서 Secret 값을 등록해준다 .

  • Github Actions가 다른 Repo로 접근을 가능하게 해주는 Secret

  • 위의 코드처럼 등록한 Secret을 사용가능하다.

Workflows 구성

1 . 파이프라인 구축을 원하는 Repository에 들어가 Actions 클릭

  • 파란색 글씨의 링크 클릭

2 . 원하는 Action들을 작성해 Workflows 구성


❓ Workflows 작성중 어떻게 빌드된 이미지를 구분할까 의문이 들었다.

  • 이미지는 '계정명/Repository명:태그' 으로 구성된다.
    계정명과 Repository명은 모든 이미지가 동일하기 때문에 구분할 수 있는 것은 태그 밖에 없다.

❓ 어떻게 한줄의 코드로 빌드된 이미지에 각각 다른 태그를 붙일까?

  • 여러 고민끝에 빌드순서를 태그로 붙일수만 있다면 좋을 것 같다 생각했다.
  • 빌드순서를 변수로 표현할 수만 있다면 가능하다 생각했고, GitHub 공식문서를 찾아보던 중 GitHub이 빌드순서를 환경변수로 가지고 있는 것을 발견했다.

  • 따라서 위와 같이 빌드된 이미지들을 구분하기 위해 위의 환경변수를 이용하여 이미지에 빌드순서를 태그로 붙인다.

<Workflows 전체적인 코드>

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

name: Build Image & Push DockerHub & Deploy EKS

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
      # Github에 저장된 코드를 CI 서버로 내려받아 뒷 step에서 사용할 수 있도록 하는 과정
      - name: Checkout
        uses: actions/checkout@v2

      # Github Secret과 local env 에 저장된 값 불러오기
      - name: Configure DockerHub Credentials
        uses: docker/login-action@v1
        with:
          username: ${{secrets.DOCKERHUB_USERNAME}}
          password: ${{secrets.DOCKERHUB_TOKEN}}

      - name: Build, tag, and push the image to DockerHub
        id: build-image
        env:
          DOCKERHUB_ID: ${{secrets.DOCKERHUB_USERNAME}}
          DOCKERHUB_REPOSITORY: daily-pt-frontend
          IMAGE_TAG: ${{ github.run_number }}
        run: |
          docker build -t $DOCKERHUB_ID/$DOCKERHUB_REPOSITORY:$IMAGE_TAG .
          docker tag $DOCKERHUB_ID/$DOCKERHUB_REPOSITORY:$IMAGE_TAG $DOCKERHUB_ID/$DOCKERHUB_REPOSITORY:$IMAGE_TAG
          echo "Pushing image to DockerHub..."
          docker push $DOCKERHUB_ID/$DOCKERHUB_REPOSITORY:$IMAGE_TAG
      # kustomize 명령을 가져온다.
      - name: Setup Kustomize
        uses: imranismail/setup-kustomize@v1

      - name: Checkout kustomize repository
        uses: actions/checkout@v2
        with:
          # kubernetes 설정정보 저장소
          repository: DailyPt/daily-pt-infra # k8s yaml 파일이 있는 repo
          ref: main # branch 이름
          # 다른 저장소에 push 하려면 Personal Access Token이 필요.
          token: ${{ secrets.ACTION_TOKEN }}
          path: daily-pt-infra # 최상위 경로로 repository와 동일하게 설정

      # 새 이미지 버전으로 파일 수정
      - name: Update Kubernetes object to new image
        env:
          DOCKERHUB_ID: ${{secrets.DOCKERHUB_USERNAME}}
          DOCKERHUB_REPOSITORY: daily-pt-frontend
          IMAGE_TAG: ${{ github.run_number }}
        run: |
          cd daily-pt-infra
          sed -i "s|image:.*|image: $DOCKERHUB_ID\/$DOCKERHUB_REPOSITORY:$IMAGE_TAG|g" daily-pt-frontend-deployment.yaml
          cat daily-pt-frontend-deployment.yaml
      # 수정된 파일 commit & push
      - name: Commit and push files
        env:
          IMAGE_TAG: ${{ github.run_number }}
        run: |
          cd daily-pt-infra
          git config --global user.email "xman0120@naver.com"
          git config --global user.name "suhwan12"
          git commit -am "Update image tag $IMAGE_TAG"
          git push -u origin main

파이프라인 검증

<Backend Repository에 새로운 코드가 Push된 상황>

1 . Backend Repository의 변화를 감지하고 새로운 Action이 생성된다

2 . 해당 Action의 빌드 순서는 96번이다

3 . Action을 클릭해보면 현재 어떤 과정을 진행중인지 알 수 있다

4 . 시간이 지나면 빌드가 완료된다

5 . Docker Hub Repository에 96번째 태그를 가진 빌드된 이미지가 Push된 것을 볼 수 있다

6 . ArgoCD와 Sync를 맞추고 있는 Repository에 들어가보면
Backend Deployment yaml파일에 새로운 Commit이 발생하였다

7 . yaml파일에 들어가보면 파드를 구성하는 컨테이너 스펙의 이미지 부분에 96번째 태그를 가진 새로운 이미지로 교체된 것을 볼 수 있다.

8 . ArgoCD에 접속해보면 새로운 버전의 파드가 Deployment에 의해 Rolling Update로 배포된 것을 확인.

profile
성실하게 열심히!

0개의 댓글