GitHub Action CD 구현

알파로그·2023년 5월 23일
0

About Git

목록 보기
11/15

✏️ Runner 설정

📍 github runner

  • runner 는 github action 을 CD 하기 위해 워크플로우가 실행되는 환경을 제공하고,
    필요한 의존성을 설치하고 작업을 수행할 수 있도록 도와주는 실행환경이다.

📍 instance 와 연결

  • 배포하려는 가상 instance 서버를 runner 와 연결해야한다.

    • 연결이 완료되면 instance 는 연결된 runner 의 repository 에서 발생하는 이벤트를 대기하고,
      이벤트가 발생하면 action 의 명령과 shell script 를 통해 CD 를 수행하게 된다.
  • repository → setting → action → runner → new self-host runner

    • Runner image 에서 배포환경의 OS 를 선택해준다.
    • Download 부터 Configue 까지의 명령어를 가상 OS 에서 수행하면된다.
      • 참고로 해당 페이지의 명령어는 1시간 까지만 유효하다.
  • 디렉토리 생성

    • 나의 목표는 하나의 인스턴스에 여러개의 서버를 띄워 MSA 로 구현할 예정이기 때문에 여기서 member 디렉토리를 하나 더 추가해줬다.
mkdir actions-runner && cd actions-runner
mkdir member && cd member
  • runner 파일 다운로드
    • 해당 repository 의 runner 와 연결하기위한 파일을 다운로드하는 명령어이다.
curl -o actions-runner-linux-x64-2.304.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.304.0/actions-runner-linux-x64-2.304.0.tar.gz
  • 유효성 검사
    • 생략해도된다.
echo "292e8770bdeafca135c2c06cd5426f9dda49a775568f45fcc25cc2b576afc12f  actions-runner-linux-x64-2.304.0.tar.gz" | shasum -a 256 -c
  • 파일 설치
tar xzf ./actions-runner-linux-x64-2.304.0.tar.gz
./config.sh --url https://github.com/BAEKER-230522/Member --token A3RPC4EMMH2OAOHLKMA2S2LENOEHQ
  • 아래와 같은 텍스트 이미지가 나타나면 성공이다.
    • 간단한 runner 의 초기 설정 관련해서 질문을 한텐데,
      Enter 2번, 라벨을 설정하는 3번째 질문엔 label-sp 를 입력하고,
      Y , Enter 를 입력하면 설정아 완료된다.
      - label-sp 는 나중에 CD 파일에서 설정할 라벨명이다.
    • 이제 마지막 명령어인 ./run.sh 로 언제든지 원하는 runner 와 연결할 수 있게된다.
    • runner 와 연결하기 전 쉘 스크립트 세팅을 먼저 해줘야 한다.

⚠️ 아래 명령어로 데몬모드로 repostiroy 와 연결할 수 있다.

nohup ./run.sh &

✏️ Shell Script 작성

  • shell script 에서는 runner 에서 이벤트가 발생했을 때 가상 OS 에서 수행시킬 명령을 입력해주면 된다.
    • 파일의 경로는 CD 워크플로우deploy 파트에 작성하는 디렉토리에 생성해주면 된다.
    • config server 를 통해 설정한 application 설정정보는 상속기능을 지원하지 않기 때문에
      프로필 설정을 변경하는 것이 아닌,
      application name 설정을 통해 배포 yaml 파일을 실행시켰다.
docker stop [이미지]
docker rm [이미지]
docker image rm -f choidaekuk/[이미지]
docker run \
  -p [서버]:[도커] \
  -d -e TZ=Asia/Seoul \
  -e JAVA_OPTS=-Djasypt.encryptor.password=[암호키] \
  -e JAVA_ACTIVE=-Dspring.profiles.active=prod \
  --name=[이미지] \
  --restart always \
  choidaekuk/[이미지]

✏️ 워크플로우 작성

  • CD 워크플로우
name: DockerCD
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: 저장소 Checkout
        uses: actions/checkout@v2

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: 17
          distribution: temurin

      - name: 스프링부트 애플리케이션 빌드 # (1)
        run: ./gradlew build -Pjasypt.encryptor.password=${{secrets.JASYPT_ENCRYPTOR_PASSWORD}}

      - name: Docker Hub 로그인 # (2)
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: 도커 이미지 빌드 # (3)
        run: docker build --build-arg JAR_FILE=build/libs/*.jar -t ${{ secrets.DOCKERHUB_IMAGE_NAME }} .

      - name: tag 설정 # (4)
        run: docker tag ${{ secrets.DOCKERHUB_IMAGE_NAME }} ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_IMAGE_NAME }}

      - name: Docker Hub 퍼블리시 # (5)
        run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_IMAGE_NAME }}

  deploy:
    needs: build
    name: Deploy
    runs-on: [ self-hosted, label-sp ]
    steps:
      - name: deploy run
        run: |
          sh /home/ubuntu/dep/docker/run.sh
  • dockerfile 작성
FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} ${JAVA_ACTIVE} -jar /app.jar"]

✏️ Repository 환경변수 추가

  • GitHub Action 이 정상적으로 실행되기위해 필요한 환경변수를 추가해줘야한다.
    • Setting → Secrets and variables 에서 추가할 수 있고,
      이번 워크플로우엔 4개의 환경변수가 있다.

✏️ 배포하기

  • 이제 모든 준비가 완료되었다.
    • 아래 명령어를 실행해 배포 OS 와 runner 를 연결시켜준다.
./run.sh

# 데몬
nohup ./run.sh &
  • 정상적으로 연결되었다면 runner 에서 초록불이 켜진다.

  • 이제 로컬 작업물을 push 하면 된다.
    • 정상적으로 작업이 완료된다면 Action 의 build 와 deploy 에서 모두 초록불이 뜨고 자동배포가 성공한다.
  • 배포가 완료되었다면 가상 OS 에서 Ctr + C 를 눌러 runner 와 연결을 끊어도 된다.
    • 원하면 언제든지 다시 ./run.sh 로 연결하면된다.

✏️ 배포 서버 콘솔 확인하기

  • 도커를 통해 서버가 실행중인 컨테이너 확인
    • 원격에 Push 한 application 이 정상적으로 가상 OS 에 배포된걸 확인할 수 있다.
docker ps
  • 아래 명령어를 통해 컨테이너에서 실행중인 콘솔을 확인할 수 있다.
    • 배포에 성공했어도 서버에 문제가 있어 실행이 실패했다면 아래 명령어로 확인할 수 있다.
docker logs -f {컨테이너 번호}
profile
잘못된 내용 PR 환영

0개의 댓글