이번 글에서는 간단하게 실제 Github Actions을 사용해보고 정리하려고 한다.
본 글의 내용 역시 드림코딩님의 제발 깃허브 액션 🔥 모르는 개발자 없게해 주세요 🙏 영상을 바탕으로 작성했다.
1. Repository Init
Github Actions를 사용해보기 위해 gitActionsPractice라는 새로운 레포지토리를 생성했다.
그리고 gradle java project를 만들어 간단한 factorial 함수를 구현하여 commit후 레포지토리에 push를 진행했다.
코드는 다음과 같다.
package gitactionspractice;
public class App {
public static int factorial(int n) {
if (n < 0) {
throw new IllegalArgumentException("n must be >= 0");
}
if (n == 0 || n == 1) {
return 1;
}
return n * factorial(n - 1);
}
public static void main(String[] args) {
System.out.println("Factorial of 5: " + factorial(5));
}
}
테스트 코드는 다음과 같이 작성했다.
package gitactionspractice;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class AppTest {
@Test
void testFactorialOfZero() {
assertEquals(1, App.factorial(0));
}
@Test
void testFactorialOfOne() {
assertEquals(1, App.factorial(1));
}
@Test
void testFactorialOfFive() {
assertEquals(120, App.factorial(5));
}
@Test
void testFactorialOfNegativeNumber() {
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
App.factorial(-1);
});
assertEquals("n must be >= 0", exception.getMessage());
}
}
2. Github Actions Workflow 생성
이제 workflow를 위한 yml 파일을 작성해보자.
이를 위해서는 위 그림처럼 레포지토리에 Actions을 누른다.
그러면 위와 같은 화면이 나오게 될텐데, 내 레포지토리에 맞는 workflow를 추천해준다.
gradle java project를 생성하여 진행했기 때문에, Java with Gradle workflow를 사용했다.
이를 위해 Java with Gradle의 configure 버튼을 눌러 진행했다.
configure 버튼을 누르면 다음과 같은 화면이 나오게 된다.
이는 Github Actions에서 미리 만들어둔 yml 파일이다.
만약 이를 그대로 사용하면 main 브랜치로 push를 하거나 main branch로 pull request를 진행했을 때 자동으로 Runner를 셋업하고 build를 진행하게 된다.
이를 그대로 사용해도 되지만 나는 다음과 같이 다시 작성했다.
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle Wrapper
run: ./gradlew build
- name: Run Tests with Gradle
run: ./gradlew test
build 다음에 test도 하게끔 추가 하였다.
그리고 오른쪽 상단의 commit changes...를 눌러 commit을 진행했다.
3. Workflow 동작 확인
위와같이 진행했다면 main에 push가 되는 것이기 때문에 바로 이 workflow가 동작하게 된다.
하지만 실패했다는 안내를 받았다. 실패한 이유를 확인해보니 gradlew를 실행하기 위한 권한이 없다는 것이었다.
따라서 다음과 같이 yml 파일을 수정해주었다.
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission to Gradle Wrapper #추가
run: chmod +x gradlew #추가
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle Wrapper
run: ./gradlew build
- name: Run Tests with Gradle
run: ./gradlew test
그 후 다시 commit 후 push를 진행했다.
정상적으로 진행됐다는 것을 확인할 수 있다. 또한 현재 코드도 문제 없이 잘 build되고 실행된다는 것을 의미한다.
dev라는 새로운 branch를 만들어 factorial function을 다음과 같이 수정하고 dev branch에 commit 후 push를 진행했다.
package gitactionspractice;
public class App {
public static int factorial(int n) {
/*if (n < 0) {
throw new IllegalArgumentException("n must be >= 0");
}*/
if (n == 0 || n == 1) {
return 1;
}
return n * factorial(n - 1);
}
public static void main(String[] args) {
System.out.println("Factorial of 5: " + factorial(5));
}
}
일부로 오류가 나게끔 if (n < 0) 부분을 주석 처리해주었다.
이는 dev branch에 push하는 것이기 때문에 workflow가 동작하지 않을 것이다.
따라서 다음과 같이 pull request를 진행했다.
pull request를 생성해보면 다음과 같은 화면이 나온다.
자동으로 build 하고 test 중인 것을 확인할 수 있다.
하지만 일부로 오류나는 코드를 주어서 다음과 같이 failed 되었다는 안내를 받을 수 있다.
물론 이메일로도 알림을 보내준다.
따라서, 주석을 해제하고 다시 dev branch에 commit 후 push하여 pull request를 생성했다.
workflow가 다시 실행되고 이번에는 build와 test 모두 통과하였다고 알려주었다.
4. 마무리
이번글에서는 간단하게 Github Actions를 사용한 것에 대해 정리해보았다.
확실히 자동으로 build와 test를 진행해주니 개발 편의성이 증가된 것 같다.
또 문제가 일어날때마다 바로바로 수정할 수 있어 좋은 것 같다.
'CI|CD' 카테고리의 다른 글
[CI/CD] Github Actions란? (0) | 2025.02.12 |
---|---|
[CI/CD] CI/CD 란? (1) | 2025.02.11 |