github actions 오류 수정!

왬스터·2025년 2월 21일
post-thumbnail

⚠️ chmod: cannot access 'gradlew': No such file or directory

오류 로그

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를 찾을 수 없음!!

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

성공!

⚠️ ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory

오류로그

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

🔍 문제 원인(나)

  • dockerfile 찾을 수 없음!!

내가 문제.. 도커쪽에 위에서 만든 working-directory를 또 적어줘야지...

🚀 해결 방법

# Docker 이미지 빌드
- name: Docker 이미지 빌드
  run: |
    docker build -t my-app:${{ github.sha }} .
  working-directory: ${{ env.working-directory }}

해결..

⚠️ ssh.ParsePrivateKey: ssh: no key found

🟠 SSH 키 인식 실패

분명넣어놨는데...

🔍 문제 원인

$ cat ~/.ssh/id_rsa

이 값을 -----BEGIN OPENSSH PRIVATE KEY-----와 -----END OPENSSH PRIVATE KEY-----까지 포함해서 넣어줘야한다
난 그것도 모르고 중간에 있는 값만 넣어줬다..

⚙️ 해결 방법

-----BEGIN OPENSSH PRIVATE KEY-----와 -----END OPENSSH PRIVATE KEY-----까지 포함된 전체 키를 다시 넣어주었다

해결..

⚠️ dial tcp ***:22: i/o timeout

🔴 2. 서버 접속 타임아웃

🔍 문제 원인

🐳 도커쪽 이미지 이름을 완전 잘못주고있었다

🚀 해결 방법 1

# 서버에 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으로 바꾸어줬다

🚀 해결 방법 2

그래도 안됐다 서버 ACG를 보니 22번포트에 대해 개방을 안해놨다..!
22번 포트 개방!

⚠️ err: Unable to find image

🔍 문제 원인

  1. GitHub Actions에서 이미지를 빌드하고 Docker Hub에 푸시할 때, 태그가 잘못 생성되었거나 푸시가 누락되었을 가능성
  2. Docker Hub에서 해당 SHA 태그로 이미지를 찾을 수 없을때

🚀 해결 방법

GitHub Actions 워크플로 수정 (태그 자동 설정)

- name: Docker 이미지 빌드 및 푸시
  run: |
    docker build -t kokiyo1030/izikgram:${{ github.sha }} .
    docker push kokiyo1030/izikgram:${{ github.sha }}

docker push 쪽을 더 적어주었다

⚠️ unauthorized: access token has insufficient scopes

🔍 문제 원인

Docker Hub에 이미지를 푸시하거나 가져올 때 권한이 부족해서 발생하는 문제!

🚀 해결 방법

  1. Docker Hub Access Token 생성

    • Docker Hub 로그인
    • Account Settings → Security → New Access Token
    • 이름 입력 → Read/Write 권한으로 토큰 생성
    • 생성된 토큰을 복사
  2. GitHub Secrets 설정

    • Settings → Secrets and variables → Actions → New repository secret
    • 다음 환경변수 등록
      • DOCKER_USERNAME → Docker Hub 사용자명
      • DOCKER_PASSWORD → 생성한 Access Token
    1. GitHub Actions 워크플로 수정 (로그인 추가)
- name: Docker Hub 로그인
  run: |
    echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

⚠️ iptables: No chain/target/match by that name

🔍 문제 원인

  1. Docker 네트워크 설정 손상:
    • Docker의 기본 네트워크가 깨졌을 때 발생
    • Docker 재시작이나 시스템 재부팅 시 불완전하게 구성된 경우
  2. iptables 모듈 누락:
    • Rocky Linux에서 iptables 모듈이 제대로 로드되지 않았을 때
  3. 기존 포트 충돌:
    • 8080 포트가 이미 사용 중일 때 발생

🚀 해결 방법

서버에서 도커를 다시 실행시켜주었더니 성공!

$ sudo systemctl restart docker
$ docker network ls

⚠️ err: docker: Error response from daemon: Conflict. The container name "이미지이름" is already in use by container

🔍 문제 원인

이 오류는 Docker 컨테이너 이름인 izikgram이 이미 존재하기 때문에 발생!
새 컨테이너를 실행하려면 기존 컨테이너를 중지 및 삭제해야 합니다.

하지만 GitHub Actions에서 매번 수동으로 삭제하는 건 비효율적이니, 자동으로 기존 컨테이너를 정리하는 방법을 사용해보자

🚀 해결 방법

서버에다가도 docker-compose.yml을 생성하자!

1️⃣ 서버에 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

2️⃣ GitHub Actions 수정

# 서버에 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

4️⃣ 폴더 구조 (서버 기준)

/docker-compose.yml이 있는 경로
├── docker-compose.yml
├── .env
└── (자동 생성된 컨테이너와 볼륨)

5️⃣ 배포 과정 요약!!

  • GitHub Actions에서 빌드 → Docker Hub에 푸시
  • 서버에서 docker-compose로 최신 이미지 pull 및 재시작
  • 기존 컨테이너 중지 → 새 컨테이너 실행

⚠️ err: bash: line 9: docker-compose: command not found

🔍 문제 원인

서버에 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로 바꿔주었다

드디어 성공!!

정리

Dockerfile

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

docker-compose.yml(로컬)

#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  # 플랫폼 명시

docker-compose.yml(서버)

services:
  izikgram:
    image: kokiyo1030/izikgram:${TAG:-latest}
    container_name: izikgram
    ports:
      - "8080:8080"
    env_file: .env
    restart: always

gradle.yml

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
profile
공부를 햄스터하는 남자

0개의 댓글