ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Github Actions을 이용한 간단한 Docker 빌드/배포 자동화
    AI&ML 2023. 2. 7. 20:41
    반응형
    • GitHub Actions는 CI/CD(Continuous Integration/Continuous Deployment) 플랫폼으로 개발자가 코드를 빌드, 테스트 및 배포하는 작업을 자동화할 수 있습니다. GitHub 저장소에 있는 이벤트에 응답하여 사용자 지정 스크립트 또는 미리 정의된 작업을 실행할 수 있습니다.
    • GitHub Actions 워크플로우는 저장소의 .github/workflows 디렉토리에 있는 yml 파일의 YAML 구문을 사용하여 정의됩니다. 다음은 소스에 대한 푸시 이벤트에 대해 실행하는 간단한 워크플로의 예를 보여드릴게요.
    name: CI
    
    on:
      push:
        branches:
          - main
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
        - name: Checkout code
          uses: actions/checkout@v2
    
        - name: Run tests
          run: |
            echo "Running tests"
            # Your test command here

    이 예제에서는 워크플로가 main 브랜치에 푸시 이벤트에서 트리거됩니다. 누군가 소스를 변경하고 코드를 push 하면 이벤트가 발생합니다. Ubuntu의 최신 버전에서 런타임이 실행되며 코드를 체크아웃하고 테스트 명령을 실행하는 두 단계를 수행하는 예제입니다.

    기본개념

    • Workflows : 작업그룹
    • Events : 작업이 트리거되는 이벤트
    • Jobs : 수행가능한 작업단위
    • Runners : 실제 Job이 실행되는 서버,(Linux,macOS,Windows)
    • Steps : Job 안에서 순서대로 실행되는 task 단위
    • Actios: 재사용가능한 job의 step. Github Marketplace 에서 구할수 있음.

    express.js 를 활용한 api 서비스를 docker hub 에 등록하는 workflows

    • 사전설치: node , vs code 설치
    express.js 라이브러리를 이용해서 간단한 API 서비스를 만들고, 이것을 도커 이미지로 만든다음 Docker Hub로 배포하는 부분을 Github action을 통하여 Automation 워크플로우를 구성해볼게요.
    • 폴더를 만들고 초기화한 다음 필요한 라이브러리를 설치해줍니다.
    npm init
    
    npm install express nodemon
    
    • package.json 부분에 아래부분을 nodemon 사용을 위해서 변경합니다.
    "scripts": {
        "start": "nodemon index.js"
      },
    
    • index.js 파일을 생성하고 아래와 같이 api 서비스 테스트를 할수 있게 기본 코드를 작성합니다.
    var express = require('express');
    var app = express();
    
    app.get('/', (req, res)=>{
        res.send('<h1>Hello Github Actions!</h1>')
    });
    
    app.listen(3000,'0.0.0.0',()=>{
        console.log('Server Start : port 3000');
    });
    
    • 모든 소스코드를 저장하고, 아래처럼 실행합니다.
    npm start
    
    • 아래처럼 잘 동작하는 것을 확인합니다.

    • 이제 도커이미지를 만들기위해서 Dockerfile 을 생성합니다.
    # 최신 Node.js LTS 버전
    FROM node:19.6.0
    
    # Node.js 앱을 위한 app 폴더 생성
    RUN mkdir -p /app
    
    # 어플리케이션 폴더를 WORKDIR명령어로 지정 - 서버 가동용
    WORKDIR /app
    
    # 가능한 package.json 과 package-lock.json을 모두 복사하기 위해서 와일드 카드 사용
    COPY package*.json /app/
    
    # 의존성 설치
    RUN npm install
    
    # 앱 소스코드 추가
    COPY index.js /app/
    
    # 앱이 3000번 포트에 바인딩 되어있기 때문에 컨테이너의 3000번 포트를 열어줌
    EXPOSE 3000
    # 인자값을 지정하지 않을시 node app.js를 실행
    CMD [ "node", "index.js" ]
    
    • 터미널에서 도커 이미지를 빌드합니다.
    docker build . -t my-express-api
    
    • 도커 이미지가 등록된것을 확인합니다.
    PS C:\\src\\express\\actions-template> docker images
    REPOSITORY                                                        TAG       IMAGE ID       CREATED              SIZE
    my-express-api                                                    latest    1ba9ddb1d1a4   About a minute ago   1GB
    
    • 도커 실행
    docker run --name my-express-api -p 3000:3000 -d my-express-api
    
    • 아래처럼 잘실행되는것을 확인합니다.

    • 지금까지 소스를 Github 로 push 합니다.
    •  

    • Github Action을 선택하여 Automation workflow를 구성해 봅니다.
    name: Docker Image CI
    
    on:
      push:
        branches: [ "main" ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
        - uses: actions/checkout@v2
          name: Check out code
    
        - uses: mr-smithers-excellent/docker-build-push@v5
          name: Build & push Docker image
          with:
            image: <docker-hub-userid>/my-express-api
            tags: v1, latest
            registry: docker.io
            username: ${{ secrets.DOCKER_USERNAME }}
            password: ${{ secrets.DOCKER_PASSWORD }}
    • docker hub 에 로그인할 비밀정보를 넣습니다.

    소스코드를 저장하고 commit을 하게 되면, action 워크플로우가 시작이되고, 빌드가 완료됩니다.

    • Docker Hub에서 확인하면 아래와 같이 등록된 것을 확인할 수 있습니다.

    • github source code

    JahvoTrust/actions-template (github.com)

     

    GitHub - JahvoTrust/actions-template

    Contribute to JahvoTrust/actions-template development by creating an account on GitHub.

    github.com

    Docker Hub가 아닌 Private docker hub 나 Container registery로 배포할수도 있을것입니다. Azure 클라우드를 사용한다면,container registery로 배포하고, Web App 이나 ACI,AKS에서 배포하는데 활용할수 있을것 같습니다.

     

    Github Actions에 관심이 많지만, 인터넷에 나와있는 예제들이 너무 이해하기가 어려워 간단한 예제를 만들어보았습니다. 도움이 되었으면합니다^^

    반응형

    댓글

Designed by Tistory.