본문 바로가기
개발/CI | CD

🎫 CI/CD

by 하얀 루돌프 2022. 3. 15.

깃헙액션과 dockerhub를 이용하면 CodeDeploy를 사용하지 않고 서버빌드 및 배포 가능

1️⃣ CI

⛳ Github Actions이란?

Github Action은 Github 저장소를 기반으로 소프트웨어 개발 Workflow를 자동화 할 수 있는 도구이다. 간단하게 말하자면 Github에서 직접 제공하는 CI/CD 도구라고 할 수 있다.

Github Actions은 Github저장소에서 등록할 수도 있고  .github/workflows 폴더 내에 .yml 파일을 추가하여 등록할 수도 있다.

🚨 주의점
깃허브 액션은 기존 올라간 액션이 아니라, PR보낸 사람의 레포에 .github/workflows가 있다면 해당 PR보낸 사람의 액션이 실행되므로, 꼭 주의해주세요.

GithubActions탭에서 확인 할 수 있다. 현 레포지토리에 추가한 Workflows들도 확인이 가능하다.

 

 

Github Actions을 통한 CI 구현

  1. github repository에서 Actions 탭을 선택
  2. New workflow 로 새로운 정책수립

 

프로젝트 빌드를 자신의 프로젝트에 맞는 Maven, Gradle 빌드를 선택하여 Set up this workflow

 

 

해당 브랜치에 pull request 요청 발생 시 work flow(CI)가 자동으로 실행된다.

즉 이제 깃헙에 PR이나 커밋만 해도 자동적으로 CI를 해주기 때문에, 내 PC에서는 되는데 남의 PC에서 안되는 경우를 방지 할 수있게 됐다.

  • 추가적으로 프로젝트 설정에 맞게 java-version 설정을 잊지말고 해주세요. 

 

 

 

 

2️⃣ 사전세팅

프로젝트에 deploy 디렉토리와 dockerfile 추가하기

FROM openjdk:17-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} alchomist.jar
ENTRYPOINT ["java","-jar","/alchomist.jar"]

# alchomist를 원하는 빌드배포이름으로 지정하시면 됩니다.

 

 

AWS EC2 설정하기

- AWS EC2 - t2.micro 인스턴스 생성

 

인스턴스 할당

 

 

- SSH(22)로만 접속이 가능하므로,
빌드배포 서버로 운영하기 위해서 TCP(8080)인바운드 허용을 위해 보안 그룹(인바운드 규칙) 편집을 통해 추가

 

- 규칙 추가 - 사용자 지정 TCP - 8080

 

 

EC2(리눅스)에서 도커를 설치하기

$ sudo apt-get update
설치 패키지 관리 업데이트

$ sudo apt install docker.io -y
도커 설치

$ sudo docker -v
도커 설치됐는지 버전 확인

 

token(토큰) 생성하기

토큰은 발급 시에만 확인이 가능하니, 꼭 적어두세요. 또한 보안에 신경써주세요.

 

github action - workflow 가 ${{ secrets.변수명 }} 등으로 알 수 있게,
팀 레포 - Settings - SecretsNew repository secret 을 추가해주세요.

 

🎈 Github 토큰 생성하기

Github - 개인 프로필 - Settings - Developer - Personal access token - 토큰 생성하기

 

 

팀 레포 - Settings - SecretsNew repository secret

 

 

🎈 docker hub 토큰 생성하기

Docker Hub - 프로필의 세팅에서 developer token 생성

 

팀 레포 - Settings - Secrets 에 New repository secret

 

🎈 docker hub REPO 레포 생성하기

Docker Hub - Create Repository

  • 도커허브 중 어느 레포에 빌드이미지를 저장하기 위해서 레포가 필요하므로, 레포 생성

 

아래는 CI 워크플로우에 위에 도커 설정까지 마친  github workflow 입니다.

# 해당 브랜치에 pr, push 될 시 실행되는 Production CI/CD 

# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time

name: Alchomist Production CI/CD

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main, release/*, develop]

jobs:
  build:

    runs-on: ubuntu-latest

    # CI 빌드
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 16
      uses: actions/setup-java@v2
      with:
        java-version: '16'
        distribution: 'adopt'
        cache: maven
    - name: Build with Maven
      run: mvn -B package --file pom.xml

    # 도커허브 로그인
    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{secrets.DOCKERHUB_USERNAME}}
        password: ${{secrets.DOCKERHUB_TOKEN}}

    # 메이븐 빌드 이미지 만들어 도커허브로 업로드
    - name: build and release to DockerHub
      env:
        NAME: zer0da9 # DockerHub 계정 명
        REPO: actiontest #  DockerHub 레포 이름
      run: |
        docker build -t $REPO .
        docker tag $REPO:latest $NAME/$REPO:latest
        docker push $NAME/$REPO:latest

    - name: Github Action to EC2
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USER }}
        key: ${{ secrets.SSH_KEY }}
        port: ${{ secrets.PORT }}
        script: |
          ./deploy.sh

 

 

 

 

 

 

3️⃣ CD

AWS EC2 secrets 등록하기

 

 

 

🎫 도메인 https

1️⃣ 무료 도메인 발급받기

내도메인.한국 - 한글 무료 도메인 등록센터

  1. 회원가입을 해주세요.
  2. 일반 도메인 검색 하여 무료 도메인 선택해주세요.
  3. 도커 (글 작성중)
docker run -it --rm --name certbot \
  -v '/etc/letsencrypt:/etc/letsencrypt' \
  -v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
  certbot/certbot certonly -d '*.yourdomain.com' --email youremail@google.com --agree-tos --no-eff-email -d domain.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory