전체 : https://e-room.tistory.com/171 참고
./gradlew clean bootJar 했는데 오류발생
https://breakcoding.tistory.com/394
ec2 ubuntu에 도커 설치
https://velog.io/@osk3856/Docker-Ubuntu-22.04-Docker-Installation
Dockerfile 에 docker 자동 배포 관련 내용추가
오류 : push시 깃헙에서 오류 발생
The workflow is not valid. .github/workflows/gradle.yml (Line: 58, Col: 12): Job 'run-docker-image-on-ec2' depends on unknown job 'build-docker-image'.
해결 :
자동으로 github이 만들어준 gradle.yml에는 아래처럼 build: 였다.
jobs:
build:
runs-on: ubuntu-latest
//생략
그런데 따라한 블로그는 그냥 build:가 아닌 build-docker-image: 였다. 따라서 CI 부분은 build-docker-image:로, CD 부분은 run-docker-image-on-ec2: 이렇게 쓰니 해당 부분에서는 오류가 사라졌고 아래 단계까지는 도달할 수 있었다.

run-docker-image-on-ec2 작업 시 무한로딩
Job defined at: cnh12/spring-practice/.github/workflows/gradle.yml@refs/heads/main
Waiting for a runner to pick up this job...
이 부분만 계속 나오고 무한 기다림이었다..
https://stackoverflow.com/questions/70959954/error-waiting-for-a-runner-to-pick-up-this-job-using-github-actions 에서

이 부분을 보고 참고한 블로그에서도 self-hosted로 써있었던 것을 ubuntu-latest로 바꿨고, 해당 부분을 해결할 수 있었다.
사진처럼 다 됐는데 정작 중요한 변경사항이 반영이 안됐다.

분명히 gradle.yml에서 docker push까지는 잘 됐다. 왜냐하면 main브랜치에 push하고 cmd에서 docker pull 후 docker run 을 하면 변경사항이 잘 반영되었기 때문이다. 즉 gradle.yml파일에서 CD부분이 오류는 안 났지만 변경사항이 반영이 안 된 것 같다..
해결
1. ec2로 접속하는 코드 추가
안산학생님 톡방에서 도움을 얻었다. 우선 gradle.yml파일을 공유했는데 기존 스크립트에는 ec2로 접속하는 코드가 없었다.
https://forcloud.tistory.com/117 를 참고하여 아래처럼 작성했다. with 밑에 각 파라미터가 뭘 뜻하는지 정확히까지는 모르지만 github secret을 사용해서 대충 맞게 때려넣었다.
steps:
- name: login to ec2
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
key: ${{ secrets.SERVER_PRIVATE_KEY }}
envs: GITHUB_SHA
port: 22
블로그의 password 대신 key를 쓴 건 GPT의 도움을 받았다.



2. docker과 관련된 과정을 ec2안의 script 안으로 이동
원래는 아래 내용이 따로 독립적으로 있었다. 나는 그냥 ec2에 접속하고 docker pull등을 이용하면 자동으로 거기서 되는줄 알았다. 그런데 다시 생각해보니 ec2에 접속은 잘 된것 같은데 왜 안 될까, 하는 의문이 들었다. 심지어 명령어들을 거의 복붙수준으로 ubuntu terminal에서 실행하니까 잘 되었기 때문이다. 그러다가 생각해보니 ec2 접속하는 부분과 docker pull 등을 하는 부분이 독립적으로 있어서 안되나?! 하는 생각이 들었고, 참고한 블로그들을 다시 보니 따로 있지 않고 ec2 접근하는 부분에 script로 들어가 있었다.. 바로 아래처럼 합쳐서 실행해봤더니,
steps:
- name: login to ec2
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
key: ${{ secrets.SERVER_PRIVATE_KEY }}
envs: GITHUB_SHA
port: 22
script : |
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
sudo docker stop $(sudo docker ps -q) 2>/dev/null || true
sudo docker run --name github-actions-demo --rm -d -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
sudo docker system prune -f
성공했다..!!
드디어 main에 git push하면 수정사항이 바로 서버로 반영되었다!!
나중에 싹 한번 정리해야겠다.