[CI/CD] Jenkins로 무료로 github push 제한

제이브로·2025년 3월 31일
0

Jenkins

목록 보기
2/2
post-thumbnail

0. 배경

Github에서 main 브랜치로의 push 방지를 하기 위해서는 private repository는 유료로 결제하여 사용해야 했습니다.

  • 규제는 있어야하고, 결제는 부담스러운 입장이라 찾다가 CI/CD로 만들어보자고 구현했습니다.
    다양한 방법이 있을거라 생각되며, 제가 구현한 방법이 옳은 방법이 아닐 수 있는 점 유의해주세요.
  • 커밋을 완전히 막을 수는 없습니다. 따라서, 커밋을 한 후, 허용된 사용자가 아닐 경우, revert를 하는 방법으로 구현했습니다.
  • reset의 방법도 있지만, 리스크가 커 안전한 방법인 revert를 사용했습니다.
  • githubgit 관련 플러그인은 필요시, 추가로 설치해야 될 수도 있습니다.

1. Jenkins 구축

저는 Docker hub에서 jenkins 이미지를 pull 받아서 젠킨스 서버를 구축하였습니다.

  • 젠킨스 버전마다 조금씩 다른 점 참고해주세요.
  • 현재 구현 버전 : 2.503

2. 새로운 project

새로운 Item 만들기

새로운 Item-1

3. Freestyle

Freestyle로 저는 구성하였습니다.

  • 보통은 pipeline을 더 많이 사용합니다.

FreeStyle

4. 소스 코드 관리

소스 코드 관리에서 작업을 수행할 repository 주소를 입력합니다.

  • 해당하는 repositorycredentials 선택
  • 작업을 수행할 branch 변경 ex) */main

소스코드관리-1

4.1 Credentials

Jenkins 관리 -> Credentials -> System -> Global credentials(unrestricted)

  • 저는 github app을 통한 인증을 하였습니다.
  • 개인 repository이면, 개인 repo에 github app 설치
  • 기관 repository이면, 따로 기관 repo에 github app 설치
  • ssh 토큰 등의 여러 방법이 있어 편한 방법으로 credential을 미리 만들어야합니다.

Credentials-1

4.2 주소 및 인증 오류

Repository URL과 Credentials에 오류가 있으면 오류가 나옵니다.

  • 제대로 된 주소라면, 오류가 보이지 않습니다.

소스코드관리-2

5. Trigger

Github hook을 통한 트리거

  • github repositorywebhook 설정 필요

Trigger-1

6. Build Steps

빌드 과정 선택

  • 허용된 사용자 설정 -> 체크 -> 아닐 시, revert

Build Steps-1

6.2 Execute shell

Execute shell 쉘 스크립트를 통한 작업 과정 진행

Execute shell-1

6.3 실행 과정

  1. 허용된 사용자 이메일 깃 로그에서 체크
  2. 여러 허용된 사용자는 띄어쓰기로 구분 (쉘에서는 괄호 적용 오류)
  3. 허용된 사용자일 경우, 기록만 남긴다.
  4. 허용된 사용자가 아닐 경우, git revert HEAD --no-edit 실행
    • revert는 새롭게 커밋을 작성을 요구합니다. 스크립트상에서는 바로 실행하기 위한 --no-edit 추가
  5. 무한 push 오류로 인하여, Revert 커밋 푸시의 이벤트가 발생하면, 우선적으로 Revert 메세지인지 확인하여 오류를 발생시킵니다.

6.4 소스 코드

# Get recent commit user email
commit_email=$(git log -1 --pretty=format:%ae | tr '[:upper:]' '[:lower:]')

# Allowed users
allowed_users="testuser@gmail.com newtestuser@gmail.com"

# Allowed user variable
is_authorized=false

# Check if allowed user
for user in $allowed_users; do
    if [ "$user" = "$commit_email" ]; then
        is_authorized=true
        break
    fi
done

if [ "$is_authorized" = true ]; then
    echo "Authorized user: ${commit_email}. No action taken."
else
    # Check commit message
    last_commit_message=$(git log -1 --pretty=%B)
    
    # Check message contains "Revert"
    case "$last_commit_message" in
        *"Revert"*)
            echo "Last commit is a revert. Failing the build."
            
            # Make the build fail
            exit 1
            ;;
        *)
            echo "Last commit is not a revert. Continuing..."
            ;;
    esac
    
    # Revert commmit
    echo "Unauthorized commit by ${commit_email}. Reverting the last commit."
    git revert HEAD --no-edit
fi

7. 빌드 후 조치

빌드 후 조치를 통한 변경 이력 git push

빌드 후 조치-1

7.1 Git Publisher

Git Publisher를 통하여, push 진행

  • Push Only if Build Succeeds : 빌드가 성공할 경우에만 push
  • Force Push : revert를 한 후, 일반 push는 적용되지 않아 강제 푸시
  • branches : origin의 main 브랜치에 push

Git Publisher-1

오류가 있다면, 피드백 주시면 감사하겠습니다.

감사합니다.

profile
기록하지 않으면 기록되지 않는다.

0개의 댓글