최근들어서 개발에서 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에 대한 실습입니다.