Github Actions 로 CI/CD 워크플로우를 아래와 같이 작성하고, 여러가지 세팅을 거쳤다.
name: Java CI with Gradle and Docker
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. GitHub 저장소에서 코드 체크아웃
- name: Checkout repository
uses: actions/checkout@v4
# 2. JDK 17 설치
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# 3. Gradle 빌드
- name: Build with Gradle
run: ./gradlew build
# 4. Docker 이미지 빌드
- name: Build Docker image
run: docker build -f Dockerfile -t ${{ secrets.DOCKERHUB_USERNAME }}/pr-deliver .
# 5. Docker Hub 로그인
- name: DockerHub login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
# 6. Docker Hub에 이미지 푸시
- name: Push Docker image
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/pr-deliver
# 7. SSH를 통해 EC2 인스턴스에 접속하여 애플리케이션 배포
- name: Deploy to EC2 via SSH
uses: appleboy/ssh-action@v0.1.3
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu # EC2 사용자 이름 (Amazon Linux일 경우 'ec2-user')
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: 22
script: |
# Docker Hub에서 최신 이미지 풀
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/pr-deliver
# 기존 컨테이너가 실행 중이면 중지
docker stop pr-deliver || true
# 기존 컨테이너 삭제
docker rm pr-deliver || true
# 새로운 컨테이너 실행
docker run --name pr-deliver --rm -d -p 8080:8080 \
-e JASYPT_ENCRYPTOR_PASSWORD=${{ secrets.JASYPT_PASSWORD }} \
${{ secrets.DOCKERHUB_USERNAME }}/pr-deliver
위와 같이 설정하고, EC2 에서 SSH key 발급받고(그리고 퍼블릭키도 설정해주고, 권한설정하고...), 깃허브에서 시크릿 넣어주고, 돌렸는데 안되더라. 에러는 아래와 같다.
...
# 새로운 컨테이너 실행
docker run --name pr-deliver --rm -d -p 8080:8080 \
-e JASYPT_ENCRYPTOR_PASSWORD=*** \
***/pr-deliver
======END======
2024/09/20 12:29:34 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain
ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain
라는 오류가 발생했다. 왤까?
mkdir -p ~/.ssh
nano ~/.ssh/id_rsa
로 프라이빗 키 파일을 하나 생성하고, (해당파일엔 프라이빗키를 넣어준다)
chmod 600 ~/.ssh/id_rsa
로 권한을 설정한다.
ssh -i ~/.ssh/id_rsa {퍼블릭 DNS || IP}
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
yes 를 눌러준다.
그러면 잘 접속이 된다. 근데 왜 workflow에선 실패하지?
https://github.com/appleboy/ssh-action/issues/297
위 링크를 보면,
I was facing the same issue and spent hours trying to resolve it. Turns out, it was a version issue. Got resolved for me once I started using: appleboy/ssh-action@master
라는 글이 있다. 버전관련 문제로 이슈를 겪고 있다는 뜻이라고 하네.
# 7. SSH를 통해 EC2 인스턴스에 접속하여 애플리케이션 배포
- name: Deploy to EC2 via SSH
uses: appleboy/ssh-action@v0.1.3 // 여기를 appleboy/ssh-action@master 로 바꾸자.
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu # EC2 사용자 이름 (Amazon Linux일 경우 'ec2-user')
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: 22
script: |
잘 작동한다.
애플실리콘을 사용한다면 EC2 에 SSH 를 사용하여 접속 시,
uses : appleboy/ssh-action@master
를 추가해준다.