1. Workflow 설명
- develop 이나 feature 로 시작하는 브랜치에 코드가 push 되거나 develop 에 pull request가 생성되면,
- ./gradlew clean test를 실행한다.
2. 간단한 Spring Boot Application
// ItemController.java
package com.github_actions.ci_cd;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
@RestController
public class ItemController {
@GetMapping
public String hello() {
return "hello";
}
@GetMapping("/items")
public List<String> items() {
return Arrays.asList("item1", "item2");
}
}
// CiCdApplicationTests
package com.github_actions.ci_cd;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import java.util.Arrays;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class CiCdApplicationTests {
@Autowired
private TestRestTemplate restTemplate;
@Test
void contextLoads() {
}
@Test
void findAll() {
List<String> contents = Arrays.asList("item1", "item2");
assertThat(restTemplate.getForObject("/items", List.class)).isEqualTo(contents);
}
}
Item 리스트를 반환하는 간단한 로직이다.
3. branch 생성
- main(default)
- develop
- feat/add-workflow
git switch -c develop
git push -u origin develop
git switch -c feature/add-workflow
4. run-test.yml 파일 생성
.github/workflow/run-test.yml 을 생성한다.
# Actions 이름 github 페이지에서 볼 수 있다.
name: Run Test
# Event Trigger 특정 액션 (Push, Pull_Request)등이 명시한 Branch에서 일어나면 동작을 수행한다.
on:
push:
# 배열로 여러 브랜치를 넣을 수 있다.
branches: [ develop, feature/* ]
# github pull request 생성시
pull_request:
branches:
- develop # -로 여러 브랜치를 명시하는 것도 가능
# 실제 어떤 작업을 실행할지에 대한 명시
jobs:
build:
# 스크립트 실행 환경 (OS)
# 배열로 선언시 개수 만큼 반복해서 실행한다. ( 예제 : 1번 실행)
runs-on: [ ubuntu-latest ]
# 실제 실행 스크립트
steps:
# uses는 github actions에서 제공하는 플러그인을 실행.(git checkout 실행)
- name: checkout
uses: actions/checkout@v4
# with은 plugin 파라미터 입니다. (java 17버전 셋업)
- name: java setup
uses: actions/setup-java@v2
with:
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'
- name: make executable gradlew
run: chmod +x ./gradlew
# run은 사용자 지정 스크립트 실행
- name: run unittest
run: |
./gradlew clean test
on 항목
처음에 설명한 것처럼 지정한 브랜치에 push, pull request 이벤트가 발생하면, 해당 action이 실행된다.
jobs 항목
build를 하라고 설정되어 있다.
맨 마지막에 ./gradlew clean test를 하라고 명시되어 있다.
테스트가 통과되지 못하면, 원격 저장소에 통합되지 못하고, 이메일로 경고 메일이 날라간다.
5. feat/add-workflow에 push
명령어는 아래와 같다.
git status
git add .
git commit -m "add run-test.yml"
git push -u origin feature/add-workflow
결과는 정상적으로 통합 되었다.
develop 에 pull request 생성하기
develop 에 pull request 이벤트가 발생했으므로 action이 동작한다.
6. 로컬의 develop 브랜치 원격 저장소와 동기화
git switch develop
git pull --prune
git branch
git branch -D feature/add-workflow
git branch
사용하지 않을 feature/add-workflow 브랜치도 깔끔하게 제거해준다.
7. 프로덕션 코드를 수정했는데, 테스트를 고치지 않은 경우
코드를 수정하고 원격 저장소에 push하기전에는 항상 test를 돌려보고 이상이 없는지 확인해야 한다.
만약 코드를 수정했는데 테스트를 돌리지 않고 push 하게 되면 어떻게 될까?
CI 파이프라인이 이를 감지해서 통합시키지 않을 것이다.
7 - 1. feature/add-items3 브랜치 생성
브랜치를 생성하고 코드를 수정해보자
@RestController
public class ItemController {
@GetMapping
public String hello() {
return "hello";
}
@GetMapping("/items")
public List<String> items() {
return Arrays.asList("item1", "item2", "item3");
}
}
items() 메서드에서 기존에는 "item1", "item2"가 반환되었는데,
"item3"도 추가해서 반환하도록 수정했다.
테스트 코드에는 이것이 반영되지 않았으므로, 테스트가 깨질 것이다.
이 상태에서 push 해보자.
7 - 2. action 결과
테스트를 수정하지 않고 프로덕션 코드를 푸쉬한 경우
run unittest 항목에서 문제가 발생했다.
이메일 까지 날라옴
8. 테스트 코드 수정 후 푸쉬
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class CiCdApplicationTests {
@Autowired
private TestRestTemplate restTemplate;
@Test
void contextLoads() {
}
@Test
void findAll() {
List<String> contents = Arrays.asList("item1", "item2", "item3");
assertThat(restTemplate.getForObject("/items", List.class)).isEqualTo(contents);
}
}
"item3"을 추가해서 테스트 코드가 통과되도록 수정했다.
이렇게 했을 때 push 하면 통합이 잘 될 것이다.
8 - 1. 결과
테스트 코드 수정한 것이 원격저장소에 잘 통합 되었다.
'인프라 > CI, CD' 카테고리의 다른 글
GitHub Actions로 CI/CD 파이프라인 구축하고 cloudtype에 배포하기 (0) | 2024.12.11 |
---|---|
2024 12 9 TIL - GitHub Actions로 CI/CD 파이프라인 구축하기(Feat. AWS ECR, ECS) (2) | 2024.12.09 |
2024 12 6 TIL - AWS ECS, ECR, Gitlab CI로 CI/CD 파이프라인 구축하기 (1) | 2024.12.06 |
2024 12 5 TIL - CI/CD (1) | 2024.12.05 |