notes
Jenkins - webhook CICD
Jenkins webhook 기반 CI/CD 트리거 연결과 자동빌드 설정 메모.
- webhook 이벤트는 Pushes 와 Pull requests 를 골랐다
- BUILD_USER 값으로 자동 빌드와 수동 빌드를 나눈다
- 셸 첫 단계에 Node 환경이 있어야 pnpm 이 돈다
GitHub webhook 이벤트
webhook 은 GitHub 저장소 Settings > Webhooks 에서 만들어 둔 걸 눌러서 편집한다. 아래쪽 Which events would you like to trigger this webhook? 에서 Let me select individual events 를 고르고 Pushes 와 Pull requests 를 체크한 다음 Update webhook 을 누른다.
PR 을 머지하면 결국 대상 브랜치에 push 가 생겨서 빌드는 Pushes 로 돈다. Pull requests 는 같이 켜 뒀다.
소스 코드 관리
Jenkins 프로젝트 Configure 의 Source Code Management 에서 Git 을 고르고 Repository URL 에 저장소 주소, Credentials 에 GitHub 인증 정보를 넣는다. Branches to build 의 Branch Specifier 를 */main 으로 두면 main 변경만 보고 빌드한다. 비워 두면 모든 브랜치를 본다.
누가 빌드를 시작했나
webhook 빌드랑 Jenkins 에서 직접 누른 빌드를 나눠 처리하고 싶어서 Build User Vars 플러그인을 깔았다.
설치하고 프로젝트 구성의 Build Environment 섹션에서 Set Build User Variables 를 켠다.
셸에서 BUILD_USER 를 찍어 보면 빌드를 시작한 쪽에 따라 값이 다르게 나온다.
# pull request case
# echo -> "BUILD_USER : SCM Change”
# jenkins에서 direct 로 build
# echo -> "BUILD_USER : 김민섭”
webhook 이면 SCM Change, 직접 누르면 내 이름이 들어온다. 이 값 하나로 분기를 나눴다.
빌드 셸
셸에서 node 를 쓰려면 NodeJS 플러그인을 깔고 빌드 첫 단계에 Node 환경을 넣어 둬야 한다.
그다음 셸 스크립트가 빌드 정보를 찍고, BUILD_USER 로 webhook 인지 수동인지 나눈 뒤 브랜치나 SELECT_PROJECT 에 맞는 프로젝트를 빌드한다. node_modules 가 없을 때만 설치하게 해서 빌드 시간을 줄였다.
echo "-------------- 빌드 정보 ----------------"
echo "GIT_BRANCH: $GIT_BRANCH"
echo "BUILD_USER: $BUILD_USER"
echo "SELECT_PROJECT: $SELECT_PROJECT"
# node_modules 체크 후 설치하는 함수
check_and_install() {
if [ ! -d "node_modules" ]; then
echo "node_modules 없음, 의존성 설치 시작"
pnpm install
else
echo "node_modules 이미 있음, 설치 건너뜀"
fi
}
# webhook 빌드와 매개변수 빌드 구분
if [ "$BUILD_USER" = "SCM Change" ]; then
echo "GitHub webhook 자동 빌드"
# webhook의 경우 브랜치 기반으로 프로젝트 결정
case "$GIT_BRANCH" in
*"prod/smartq"* | *"origin/prod/smartq"*)
echo "Smart 프로젝트 빌드"
check_and_install
pnpm build:smart
;;
*"prod/cmng"* | *"origin/prod/cmng"*)
echo "Cmng 프로젝트 빌드"
check_and_install
pnpm build:cmng
;;
*)
echo "매칭되는 프로젝트 없음: $GIT_BRANCH"
exit 1
;;
esac
else
echo "수동 매개변수 빌드 (실행자: $BUILD_USER)"
# 매개변수 빌드의 경우 SELECT_PROJECT 값으로 프로젝트 결정
case "$SELECT_PROJECT" in
"smartq")
echo "Smart 프로젝트 수동 빌드"
check_and_install
pnpm build:smart
;;
"cmng")
echo "Cmng 프로젝트 수동 빌드"
check_and_install
pnpm build:cmng
;;
*)
echo "알 수 없는 프로젝트: $SELECT_PROJECT"
exit 1
;;
esac
fi