CI/CD) docker, githubaction을 사용한 배포자동화

박우영·2023년 4월 27일
0

형상관리

목록 보기
6/6

지난시간에 project를 docker로 컨테이너화 하여 ec2서버에 배포하는것을 해봤습니다. 이번엔 githubaction을 추가해서 CI/CD를 자동화 하려고합니다.

좀더 편리하게 하기 위해 github 의 runner 를 이용하겠습니다.

Runner 설정


원하는 레포지토리 settings-actions-runners 에서 자신이 원하는 os 환경에서 download에 있는 파일들을 실행해주면 됩니다.

위 사진을 예를들면

  • mkdir actions-runner && cd actions-runner 로 파일 경로 설정

  • curl -o actions-runner-linux-x64-2.303.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.303.0/actions-runner-linux-x64-2.303.0.tar.gz 경로로 파일다운로드

  • tar xzf ./actions-runner-linux-x64-2.303.0.tar.gz 압축을 풀어줍니다.

  • ./config.sh --url https://github.com/PARKPARKWOO/dockerTest --token A4JRGNC4AS4GZJGI3L3PV4LEJFCFG 이때 토큰 발급기간이 1시간 이기때문에 토큰 을 늦게 입력하면 404 error 페이지가 나옵니다.

  • nohup ./run.sh & 명령어를 통해 백그라운드에서도 실행하고 로그도 확인 할 수 있도록 합니다.

  • tail -f nohup.out 명령어를 통해 로그 확인 가능


runner 에 가보시면 확인 할 수 있습니다.


Github action 배포 환경 yml 작성

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

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

      - name: 도커 이미지 빌드 # (3)
        run: docker build -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-go ]
    steps:
      - name: deploy run
        run: |
          sh /home/ubuntu/dep/docker/run.sh

도커 파일작성

FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar","-Dspring.profiles.active=prod" , "/app.jar"]

ec2환경에서 shell script 작성

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q) 
docker image rm -f $(docker image ls -q)
docker run -d -p 8080:8080 --name=docTest --restart always wy9295/imagetest

권한 부여

docker 는 관리자 권한이 있어야 실행이됩니다. 권한을 부여해줘야 실행이 되는데
권한 이없다는 에러메시지가 나온다면 아래 명령어로 권한을 주면됩니다.

sudo chmod 666 /var/run/docker.sock


문제 발생

Docker hub에 최신화가 됐고

  • docker stop $(docker ps -a -q)
  • docker rm $(docker ps -a -q)

위 명령어를 통해 삭제한 후 docker ps -a 명령어로 삭제 되어있는것도 확인했는데 ec2 서버에 변화가 없습니다.

확인

  1. build -> push 과정에 문제가 있었나
    • dockerhub 내용을 pull 해서 실행해보니 문제x
  2. ec2에서 안꺼지고 실행한거 아닌가?
    • ec2 에 실행되는 시간은 github action 에서push 한 시간이랑 동일
  3. docker images 명령어로 이미지 확인

이것때문이라고 생각됩니다. 테스트하느라 있던 수많은 tag가 없는 이미지들 때문에 도커에서 오류가 있었을 것으로 판단됩니다. docker image rm -f $(docker image ls -q) 명령어로 이미지 전부 삭제


CI/CD 파이프라인 자동화 성공


Jasypt 적용 후 변경

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"]

환경 변수 2개를 줬습니다(배포, jasypt 암호키)

github action.yml

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

run.sh

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q) 
docker image rm -f $(docker image ls -q)
docker run -p 8080:8080 -d -e JAVA_OPTS=-Djasypt.encryptor.password=qozj -e JAVA_ACTIVE=-Dspring.profiles.active=prod --name=baeker --restart always wy9295/baeker

0개의 댓글