지난시간에 project를 docker로 컨테이너화 하여 ec2서버에 배포하는것을 해봤습니다. 이번엔 githubaction을 추가해서 CI/CD를 자동화 하려고합니다.
좀더 편리하게 하기 위해 github 의 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 에 가보시면 확인 할 수 있습니다.
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"]
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 ps -a
명령어로 삭제 되어있는것도 확인했는데 ec2 서버에 변화가 없습니다.
docker images
명령어로 이미지 확인이것때문이라고 생각됩니다. 테스트하느라 있던 수많은 tag가 없는 이미지들 때문에 도커에서 오류가 있었을 것으로 판단됩니다. docker image rm -f $(docker image ls -q)
명령어로 이미지 전부 삭제
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