[DOCKER] 컨테이너 애플리케이션 통합을 위한 docker CI 구성-16

최근들어서 개발에서  CI/CD가 중요한 화두가 되었다. 예전에는 수동으로 빌드를 해서 그 파일을 서버에 배포하곤 했었는데 이 과정을 자동화 하는게 CI/CD이다.
그중에서 CI이란 개발한 소스를 저장소(GIT)에서 통합하고 배포 가능한 아티팩트를 만드는 과정이다. 여기서는 깃에 소스를 push하면 소스를 빌드해서 docker에 이미지를 올리는 과정을 다룬다.

코드 배포를 위한 Gitaction workflow 이해

GitHub Action

  • 코드 저장소인 GitHub에 CI/CD 기능이 추가된 서비스를 GitHub Action 이라고 한다.
  • 이 코드 저장소에서 어ㄴ 이벤트가 발생 하면 특정 작업이 트리거 되도록 자동화 할 수 있다.(코드 검사, cron, 반복작업 등 …)

GitHub Action 주요 개념

  • workflow
    • 자동화된 전체 프로세스 과정을 의미하고, 하나 이상의 job으로 구성
    • event에 의해 스케줄(on.schedule.cron)이나 트리거 되는 자동화 구성
    • on 속성을 통해서 해당 workflow가 언제 실행 되는지를 정의
    • YAML로 작성되고 .github/workflows 폴더 아래 저장
  • event
    • workflow를 실행하는 활동 및 규칙 지정
    • git 저장소에 commit을 하거나 pull request가 생성되면 GitHub 활동 시작(Action)
    • on 속성에 정의 하는 내용
  • jobs
    • job 은 여러 Step으로 구성되고, 단일 가상 환경에서 실행되는 하나의 처리 단위
    •  필요에 따라 다른 Job에 의존 관계를 가질 수도 있고, 실행 순서 제어도 가능
  • step
    • job 안에서 순차적으로 실행되는 프로세스 단위
    • 즉, 하나의 job은 여러 단계(step)의 명령을 순차적으로 실행
    • step은 명령이나 스크립트를 run 속성으로 작성하거나, uses 속성으로 action을 사용
  • action
    • job을 구성하기 위한 step들의 조합으로 구성된 독립적인 명령. workflow의 가장 작은 빌드 단위
    • workflow에서 action을 사용하기 위해서는 action이 step을 포함해야 함
    • 빈번하게 필요한 반복 단계를 재사용 가능하도록 제공되는 작업 공유 메커니즘
    • GitHub Actions Marketplace를 통한 action 공유 커뮤니티
  • runner
    • GitHub Action Runner 애플리케이션이 설치된 가상 머신 환경으로, workflow가 실행될 인스턴스
    • GitHub에서 자체 제공하는 가상머신인 GitHub-hosted Runner와 사용자가 직접 환경을 구성하는  Self-hosted Runner가 있다

 

[실습] GitHub Action demo1

name: GitActions Demo1
on: push
jobs:
  GitActions-demo-job:
    name: Demo Job
    runs-on: ubuntu-latest
    steps:
      - name: Print a environment
        env:
          MY_VAR: Hi there! My name is
          FIRST_NAME: hyunyong
          LAST_NAME: lee
          AWS_JOB_NAME: kevin.lee
        run: |
          echo $MY_VAR $FIRST_NAME $LAST_NAME.
          echo $MY_VAR $AWS_JOB_NAME.

steps를 보면 env에서 변수를 저장하고 run에서 echo로 호출하고 있다.

Actions 탭에서 set up a workflow yourself를 클릭하고 아래와 같이 입력한 다음 Commit changes를 눌러서 작성한다.

 

[실습] GitHub Action demo2

name: GitActions-Demo2
on: [push]
jobs:
  GitActions-demo-job:
    runs-on: ubuntu-latest
    steps:
      - run: echo "job.triggered.event is ${{ github.event_name }}"
      - run: echo "job.running.os is ${{ runner.os }}"
      - run: echo "job.branch is ${{ github.ref }}"
      - run: echo "job.repository is ${{ github.repository }}"
      - run: echo "job.status is ${{ job.status }}."
      - run: echo "The workflow is code test on the runner."
      - name: Check out repository code
        uses: actions/checkout@v2
      - name: List files on repository
        run: |
          ls ${{ github.workspace }}

gitactions에서 제공해주는 변수들을 출력해 보았다.

 

[실습] Github Actions 활용, docker CI 구성

ch09의 Nodejs 기반의 웹 애플리케이션을 기반으로 실습 하겠습니다.

# 소스 복사하기
cd ~/fastcampus/ch12
mkdir nodejs-ci
cd nodejs-ci
cp -r ../ch09/nodejs .
ls


# 이미지 빌드
docker build -t junseongday/nodejs-ci:v1.0 --no-cache .
docker images | grep ci
docker image history junseongday/nodejs-ci:v1.0 
docker image inspect junseongday/nodejs-ci:v1.0 

# 컨테이너 생성

docker run -d -p 3001:3000 --name nodejs junseongday/nodejs-ci:v1.0
curl localhost:3001

ch09에서 실습한 내용을 ch12로 복사해오고 이미지를 빌드하고 컨테이너를 만들어서 정상 작동 하는지 확인해본다.

# docker 로그인 여부 확인
docker info | grep Username
# 로그인이 안되어있으면 8번째 글에서 실습한 내용
cat .access_token | docker login --username junseongday@gmail.com --password-stdin

docker push junseongday/nodejs-ci:v1.0

빌드한 이미지를 hub.docker.com에 푸시한다.

 

# git 구성 
git init 
ls -al 
git branch -m main 
git remote add origin https://github.com/junseongday/docker-ci 
git pull origin main

git add .
git commit -m "first commit fastcampus"
git push --set-upstream origin main

깃허브에서 docker-ci라는 리파지토리를 만들었다. 강의 내용과 다르게 Readme.md와 라이센스 파일을 생성하였다. 그래서 바로 깃에 소스를 커밋을 할수가 없어서 먼저 git pull을 한다음에 커밋을하고 푸시를 했다.  푸시한 내용이 깃 허브에 잘 올라갔는지 확인해보자.

 

 

git push –set-upsteam origin main 할때 password를 물어보는데 여기서는 github secret token을 입력해야 한다. 아래와 같이 settings>Developer settings>Token classic으로 토큰을 만들어 저장해두자. 이 값을 패스워드 입력할때 사용해서 푸시하면된다.

 

 

name: Docker CI Demo

on:
  push:
    branches:
      - 'main'
    tags:
      - '**'
      
jobs:
  push:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2
  
      - name: Docker meta
        id: docker_meta
        uses: crazy-max/ghaction-docker-meta@v1
        with:
          images: junseongday/nodejs-ci
          tag-semver: |
            {{version}}
            {{major}}.{{minor}}

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_PASSWORD }}

      - name: Build and push Docker Image
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: ${{ steps.docker_meta.outputs.tags }}
          labels: ${{ steps.docker_meta.outputs.labels }}
          platforms: linux/arm64

맥에서 실습을 진행하기에 아래에 platforms: linux/arm64 을 더 추가하여 빌드 환경을 설정해 주었다.

 

 

 

 

오류 내용대로 DOCKER_HUB_USERNAME, DOCKER_HUB_PASSWORD를 설정하지 않았다.

 

    

저장된 이미지를 다른 서버에서 다운로드 받아서 잘 적용이 되었는지 확인해 보았다.  이번 글에서는 깃허브를 통해서 도커 이미지를 올리는 CI작업을 어떻게 하는지 다루어보았습니다. 다음 장에서는 ECS에 대한 실습입니다.

 

Leave A Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다