[Sprint] 환경 변수 분리

# 해결 과제

💡 GitHub Action을 이용하여 CI 상에서 Mini node server를 Docker 이미지로 만든 후, 여러분의 Docker Hub에 push하세요


# 실습 자료

sprint-mini-node-server-with-github-action


# 과제 항목별 진행 상황

✏️  CI 상에서 주어진 Dockerfile을 이용해 Docker 이미지를 빌드할 수 있도록, workflow를 새로 만들기

Step 1 : 다음 레퍼런스를 참고해서 Docker 빌드용 GitHub Action workflow를 만드세요. workflow를 추가한다고 해서 GitHub Action이 즉시 작동하지는 않을 것입니다.

sprint-mini-node-server-with-github-action/.github/workflows/docker-build-push.yaml

name: Publish Docker image  # 워크플로의 이름

on:  # 워크플로가 실행될 이벤트
  release:  # release 이벤트
    types: [published]  # 이벤트의 Activity Type 

jobs:  # 병렬로 실행할 job 을 정의
  push_to_registry:
    name: Push Docker image to Docker Hub
    
    runs-on: ubuntu-latest  # 호스팅 러너 유형
    
    steps:  # 순차로 실행할 step 을 정의
      - name: Check out the repo
        uses: actions/checkout@v3  # 레파지토리에서 코드를 체크아웃
      
      - name: Log in to Docker Hub
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1  # Docker Hub 로그인
        with:
          username: ${{ secrets.DOCKER_USERNAME }}  # 로그인 username - secrets 환경 변수 사용
          password: ${{ secrets.DOCKER_PASSWORD }}  # 로그인 password - secrets 환경 변수 사용
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7  # Git 이벤트에서 메타데이터 추출하여 Docker Image 메타데이터 형태로 변환
        with:
          images: taekyungoh/mini-node-server  # 메타데이터 변환시 사용할 Image
      
      - name: Build and push Docker image
        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4  # Docker Image Push
        with:
          context: .  # Docker Build context
          push: true  # Docker Registry Push 여부
          tags: ${{ steps.meta.outputs.tags }}  # Image Tag - meta step 에서 추출한 tag 사용
          labels: ${{ steps.meta.outputs.labels }}  # Image Labels - meta step 에서 추출한 labels 사용

Step 2 : repository에서 오른쪽 사이드바를 살펴보면, Release -> Create a new release 링크가 존재합니다. 이 링크를 누르고 새로운 릴리스를 발행합니다. 설정은 다음과 같이 진행합니다.

  • Choose a tag: v1.0.0
  • Release title 및 Release notes는 여러분이 자유롭게 입력하세요.

Step 3 : Publish release 후에 GitHub Action이 작동하나요?

  • 왜 작동이 되는 걸까요? 아까는 왜 안 됐을까요?

Step 1에서 GitHub Action 실행이 되지 않았던 이유 워크플로를 release 이벤트 발생 시 실행되도록 구현했기 때문에, push 이벤트 발생 시에는 실행되지 않음.

✏️ 인증 정보에 대한 환경 변수 생성

Step 1 : 1번 과정을 통해 GitHub Action을 실행하면 그 결과는 실패로 나타날 것입니다. 무엇이 잘못되었는지 먼저 로그를 살펴보세요.

  • 왜 실패했을까요? 로그에서 그 이유를 찾아보세요.

GitHub Action 실행이 실패한 이유 워크플로가 secrets 환경변수의 DOCKER_USERNAME 과 DOCKER_PASSWORD 를 참조하고 있지만 환경변수를 생성하지 않았기 때문

Step 2 : Workflow YAML 파일을 자세히 살펴보면, DOCKER_USERNAME 및 DOCKER_PASSWORD라는 환경 변수가 존재합니다. 말 그대로 아이디와 비밀번호와 같은 민감정보를 YAML 코드에 입력해서 git commit 기록으로 남겨둔다면, 더 이상은 그 비밀번호를 사용할 수 없게 될 것입니다.

  • GitHub에서는 이러한 환경 변수를 안전하게 보관할 수 있는 기능을 제공합니다. Settings -> Secrets에서 환경 변수를 설정하세요.

✏️ Dockerfile 빌드 결과를 확인하고, Docker Hub에 이미지가 제대로 push 되었는지 확인

Step 1 : 앞서 이 과정을 다 잘 따라왔다면, 여러분 각 개인의 Docker Hub에는 mini-node-server 이미지가 성공적으로 push되어 있을 겁니다. https://hub.docker.com/u/<여러분_아이디>에 들어가서 결과를 확인해 보세요.


# TROUBLE SHOOTING LOG


💡 문제 내용

원인

해결 방안

tags 키값은 github 레파지토리 이름이 아닌 dockerhub의 레파지토리로 생성할 이미지 명으로 설정해야 하므로 위와 같이 수정을 하였다.


# 피드백

오태경박찬규
지난 스프린트 때 이해하지 못했던 steps: uses 변수에 정의되는 값의 의미를 알 수 있었다.이번 기회에 자동화 도구에 대해 관심이 많아 졌고 다른 자동화 도구도 접해야 겠다.

#References

Leave a Comment