
Run chmod +x gradlew
chmod +x gradlew
./gradlew clean build -x test
shell: /usr/bin/bash -e {0}
env:
JAVA_HOME: /opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.14-7/x64
JAVA_HOME_17_X64: /opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.14-7/x64
chmod: cannot access 'gradlew': No such file or directory
Error: Process completed with exit code 1.
gradlew경로를 잘못주었다
참고: https://rutgo-letsgo.tistory.com/80
github Action Script를 만들면 저장소의 Root에 github 폴더에 들어가게 된다.
그렇다면 기본적으로 저장소의 root로 Build를 진행할텐데, Spring Project가 없기 때문에 build를 실패할 것이다.
따라서 working-directory 라고, 환경 변수를 설정하고 그 폴더에서 Build를 진행하라고 해야 한다.
runs-on: ubuntu-latest
env:
working-directory: ./iz
working-directory를 명시해주었고
위에서 진행한 job step들 중에 working-directory에서 job들에게 working-directory를 붙여 줍니다.
# Gradle 빌드
- name: Gradle 빌드 및 테스트
run: chmod +x gradlew
./gradlew build
working-directory: ${{ env.working-directory }}
# Gradle 빌드
- name: Gradle 빌드 및 테스트
run: |
chmod +x ./iz/gradlew
./iz/gradlew clean build -x test

성공!
Run docker build -t my-app:3743191f429f58cb656ce64581f42d9ab91464f5 .
docker build -t my-app:3743191f429f58cb656ce64581f42d9ab91464f5 .
shell: /usr/bin/bash -e {0}
env:
working-directory: ./iz
JAVA_HOME: /opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.14-7/x64
JAVA_HOME_17_X64: /opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.14-7/x64
#0 building with "default" instance using docker driver
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 2B done
#1 DONE 0.0s
ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory
내가 문제.. 도커쪽에 위에서 만든 working-directory를 또 적어줘야지...
# Docker 이미지 빌드
- name: Docker 이미지 빌드
run: |
docker build -t my-app:${{ github.sha }} .
working-directory: ${{ env.working-directory }}
해결..
🟠 SSH 키 인식 실패

분명넣어놨는데...
$ cat ~/.ssh/id_rsa
이 값을 -----BEGIN OPENSSH PRIVATE KEY-----와 -----END OPENSSH PRIVATE KEY-----까지 포함해서 넣어줘야한다
난 그것도 모르고 중간에 있는 값만 넣어줬다..
-----BEGIN OPENSSH PRIVATE KEY-----와 -----END OPENSSH PRIVATE KEY-----까지 포함된 전체 키를 다시 넣어주었다
해결..
🔴 2. 서버 접속 타임아웃
🐳 도커쪽 이미지 이름을 완전 잘못주고있었다
# 서버에 Docker 이미지 배포
- name: 서버에 Docker 배포
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
docker stop kokiyo1030/izikgram || true
docker rm kokiyo1030/izikgram || true
docker pull kokiyo1030/izikgram:${{ github.sha }}
docker run -d -p 8080:8080 --env-file .env --name izikgram kokiyo1030/izikgram:${{ github.sha }}
이미지 이름을 모두 kokiyo1030/izikgram으로 바꾸어줬다
그래도 안됐다 서버 ACG를 보니 22번포트에 대해 개방을 안해놨다..!
22번 포트 개방!
GitHub Actions 워크플로 수정 (태그 자동 설정)
- name: Docker 이미지 빌드 및 푸시
run: |
docker build -t kokiyo1030/izikgram:${{ github.sha }} .
docker push kokiyo1030/izikgram:${{ github.sha }}
docker push 쪽을 더 적어주었다
Docker Hub에 이미지를 푸시하거나 가져올 때 권한이 부족해서 발생하는 문제!
Docker Hub Access Token 생성
GitHub Secrets 설정
- name: Docker Hub 로그인
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
서버에서 도커를 다시 실행시켜주었더니 성공!
$ sudo systemctl restart docker
$ docker network ls
이 오류는 Docker 컨테이너 이름인 izikgram이 이미 존재하기 때문에 발생!
새 컨테이너를 실행하려면 기존 컨테이너를 중지 및 삭제해야 합니다.
하지만 GitHub Actions에서 매번 수동으로 삭제하는 건 비효율적이니, 자동으로 기존 컨테이너를 정리하는 방법을 사용해보자
서버에다가도 docker-compose.yml을 생성하자!
services:
spring-boot:
platform: linux/amd64
container_name: izikgram-container
image: kokiyo1030/izikgram:${TAG:-latest}
environment:
SPRING_DATASOURCE_URL: {dburl}
SPRING_DATASOURCE_USERNAME: {username}
SPRING_DATASOURCE_PASSWORD: {password}
ports:
- "8080:8080"
env_file:
- .env
restart: always
# 서버에 Docker 이미지 배포
- name: 서버에 Docker 배포
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: 22
script: |
# 최신 이미지로 컨테이너 재시작
docker pull kokiyo1030/izikgram:${{ github.sha }}
# 환경변수 설정 후 배포
cd {docker-compose.yml이 있는 경로}
# 최신 이미지로 컨테이너 재시작
TAG=${{ github.sha }} docker-compose down
TAG=${{ github.sha }} docker-compose up -d
/docker-compose.yml이 있는 경로
├── docker-compose.yml
├── .env
└── (자동 생성된 컨테이너와 볼륨)
서버에 docker-compose가 설치가 안되어있다
docker-compose --version
-bash: docker-compose: command not found
그런데
docker compose version
Docker Compose version v2.27.0
???
참고사이트: https://boramchan-corgi.tistory.com/12#article-1--what-is-docker-compose-?
간단히 docker-compose: 구형
docker compose: 신형
이라고한다
# 최신 이미지로 컨테이너 재시작
TAG=${{ github.sha }} docker compose down
TAG=${{ github.sha }} docker compose up -d
이 부분의 docker-compose를 docker compose로 바꿔주었다

드디어 성공!!
# Build stage
FROM bellsoft/liberica-openjdk-alpine:17 AS builder
WORKDIR /app
COPY . .
RUN ./gradlew clean build -x test
# Run stage
FROM bellsoft/liberica-openjdk-alpine:17
WORKDIR /app
COPY --from=builder /app/build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
#FROM openjdk:17-jdk-slim
#WORKDIR /app
#COPY build/libs/*.jar app.jar
#EXPOSE 8080
#CMD ["java", "-jar", "app.jar"]
#version: "3"
services:
spring-boot:
platform: linux/amd64
container_name: izikgram-container
image: kokiyo1030/izikgram:${TAG:-latest}
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://{private도메인}:3306/izikgram?useUnicode=true&serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME: {username}
SPRING_DATASOURCE_PASSWORD: {password}
ports:
- "8080:8080"
env_file:
- .env
restart: always
build:
context: .
platforms:
- linux/amd64 # 플랫폼 명시
services:
izikgram:
image: kokiyo1030/izikgram:${TAG:-latest}
container_name: izikgram
ports:
- "8080:8080"
env_file: .env
restart: always
name: CI/CD with Gradle and Docker
on:
push:
branches:
- publish # publish 브랜치에 푸시할 때 실행
jobs:
build:
runs-on: ubuntu-latest
env:
working-directory: ./iz
steps:
# 코드 체크아웃
- name: 소스 코드 체크아웃
uses: actions/checkout@v4
# JDK 설정
- name: JDK 17 설정
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# Gradle 캐시 설정 (빌드 속도 향상)
- name: Gradle 캐시 설정
uses: actions/cache@v4
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle
# Gradle 빌드
- name: Gradle 빌드 및 테스트
run: |
chmod +x gradlew
./gradlew clean build -x test
working-directory: ${{ env.working-directory }}
# Docker Hub 로그인
- name: Docker Hub 로그인
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
# Docker 이미지 빌드 및 푸시
- name: Docker 이미지 빌드 및 푸시
run: |
docker build -t kokiyo1030/izikgram:${{ github.sha }} .
docker push kokiyo1030/izikgram:${{ github.sha }}
working-directory: ${{ env.working-directory }}
# 서버에 Docker 이미지 배포
- name: 서버에 Docker 배포
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: 22
script: |
# 최신 이미지 pull
docker pull kokiyo1030/izikgram:${{ github.sha }}
# 환경변수 설정 후 배포
cd /root
# 최신 이미지로 컨테이너 재시작
TAG=${{ github.sha }} docker compose down
TAG=${{ github.sha }} docker compose up -d