본문 바로가기
BackEnd

CICD 구현해보기 (1) - GitAction

by Jiwon_Loopy 2025. 11. 6.
반응형

CICD란?

CI (지속적 통합) : 작성된 코드를 통합하고, 자동화된 빌드 테스트를 거쳐 코드의 안정성을 확보하는 과정

CD (지속적 배포) : CI의 과정을 통해 준비된 코드가 프로덕션 환경에 자동으로 배포될 수 있도록 하는 과정

 

GitAction을 통해 내 레포지토리에 코드가 반영되면 실시간으로 자동화된 테스트를 거쳐 통합하고(CI), 빌드 산출물을 통해 자동으로 배포될 수 있도록 의도하였다. 

 

 

내가 생각한 방법

 

Docker를 이용해 DB와 JAR 빌드 산출물을 각각 컨테이너 이미지로 생성하고, Docker Compose를 통해 동일한 실행 환경에서 통합·배포되도록 구성 후, 모든 빌드 및 배포 과정은 GitHub Actions 워크플로를 통해 자동으로 수행된다.

 

 

GitAction 명령어 알아보기


1. name

  • 워크플로 이름
  • GitHub Actions 탭에서 표시되는 이름
name: Java CI with Gradle

 

 

2. on

  • 워크플로를 실행시키는 트리거(조건)
  • 보통 push, pull_request, schedule 등으로 사용
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

 

 

3. jobs

  • 실행할 작업 단위들을 정의
  • 한 워크플로에 여러 job이 있을 수 있고, job은 병렬 혹은 순차적으로 실행
jobs:
  build:
    runs-on: ubuntu-latest

 

 

 

4. runs-on

  • 해당 job이 어떤 환경(OS) 에서 실행될지를 지정
runs-on: ubuntu-latest  # Linux 환경
# macos-latest, windows-latest 등도 가능

 

 

5. steps

  • 하나의 job 안에서 실행할 단계들을 나열
  • 순서대로 실행돼요.
steps:
  - name: Checkout repository
    uses: actions/checkout@v4

 

 

6. uses

  • 다른 사람이 만든 GitHub Action(플러그인) 을 불러올 때 사용
  • 예: Java 세팅, Gradle 캐싱, Docker 빌드 등.
- name: Set up JDK 17
  uses: actions/setup-java@v4
  with:
    java-version: '17'
    distribution: 'temurin'

 

 

7. run

  • 직접 명령어를 실행할 때 사용
  • 예: Gradle 빌드, Docker 명령, chmod, echo 등
- name: Build with Gradle
  run: ./gradlew build
 
 
여러 줄 명령도 가능하다!
run: |
  chmod +x gradlew
  ./gradlew clean build

 

 

8. env

  • 환경 변수(Environment Variables) 설정
env:
  SPRING_PROFILES_ACTIVE: test
  DB_URL: jdbc:h2:mem:testdb

 

9. secrets

  • GitHub Repository Settings → Secrets에서 등록한 민감 정보를 참조할 때 사용.
env: DB_PASSWORD: ${{ secrets.DB_PASSWORD }}

 

10. needs

  • job 간 순서(의존 관계) 지정.
jobs:
  build:
    runs-on: ubuntu-latest
  deploy:
    runs-on: ubuntu-latest
    needs: build

 

 

 

CI

먼저 github에서 내 레포지토리에 들어가게되면 

 

이러한 화면이 나오는데 이곳에서 나는 java를 쓸 것이므로 java with Ant를 선택해주었다.

 

그러면 레포지토리 메인에

 

이러한 폴더가 생기는데 들어가서 gradle.yml 파일을 열어보면

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
    # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
    - name: Setup Gradle
      uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0

    - name: Build with Gradle Wrapper
      run: ./gradlew build

    # NOTE: The Gradle Wrapper is the default and recommended way to run Gradle (https://docs.gradle.org/current/userguide/gradle_wrapper.html).
    # If your project does not have the Gradle Wrapper configured, you can use the following configuration to run Gradle with a specified version.
    #
    # - name: Setup Gradle
    #   uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
    #   with:
    #     gradle-version: '8.9'
    #
    # - name: Build with Gradle 8.9
    #   run: gradle build

  dependency-submission:

    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    # Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies.
    # See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md
    - name: Generate and submit dependency graph
      uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0

 

이러한 파일이 기본으로 세팅되어있다.

 

일단 실행이 되는지 확인해보기 위해 다시 Action으로 이동해보면,

 

 

실패로 나와있어 에러를 확인해보았다.

 

 

에러핸들링

 

Error: HttpError: Dependency submission failed for dependency-graph-reports/java_ci_with_gradle-dependency-submission.json.
 

submission쪽에서 터진오류이다. 이를 해결해보기 위해 구글링을 해보니, 

 

 

github 상단에 Setting에 들어가준다.

 

 

왼쪽 Security탭에서 Advanced Security로 들어가서, 

 

 

 

 

Dependency graph를 Enable로 바꿔주었다.

 

 

다시 Action으로 가서 실행해보니

/home/runner/work/_temp/1a2a0f83-2333-4ead-8de4-33503c7eb79f.sh: line 1: ./gradlew: Permission denied

Error: Process completed with exit code 126.

 

이번에는 이런 오류가 있는데, 권한 문제인 것 같다.

gradlew 파일에 실행 권한이 없어 중단된 것으로 보인다.

 

yml파일을 조금 수정해서 앞 부분에 권한을 넣어주었다.

- name: Grant execute permission for gradlew
  run: chmod +x gradlew

 

 

 

성공!

 

간단한 CI 작업을 완료해보았다.

728x90
반응형

'BackEnd' 카테고리의 다른 글

AWS EC2 세팅하기  (0) 2025.11.08
CICD 구현해보기 (2) - DockerFile  (0) 2025.11.07
JWT + Security로 로그인 구현해보기  (2) 2025.09.07
6/5 - Mapper 클래스, 트랜잭션 제어  (5) 2025.06.06
6/4 - MariaDB, Log4JDBC  (0) 2025.06.06