Github
에서main
브랜치로의push
방지를 하기 위해서는private repository
는 유료로 결제하여 사용해야 했습니다.
- 규제는 있어야하고, 결제는 부담스러운 입장이라 찾다가 CI/CD로 만들어보자고 구현했습니다.
다양한 방법이 있을거라 생각되며, 제가 구현한 방법이 옳은 방법이 아닐 수 있는 점 유의해주세요.- 커밋을 완전히 막을 수는 없습니다. 따라서, 커밋을 한 후, 허용된 사용자가 아닐 경우,
revert
를 하는 방법으로 구현했습니다.reset
의 방법도 있지만, 리스크가 커 안전한 방법인revert
를 사용했습니다.github
와git
관련 플러그인은 필요시, 추가로 설치해야 될 수도 있습니다.
저는
Docker hub
에서jenkins
이미지를pull
받아서 젠킨스서버
를 구축하였습니다.
- 젠킨스 버전마다 조금씩 다른 점 참고해주세요.
- 현재 구현 버전 :
2.503
새로운 Item 만들기
Freestyle
로 저는 구성하였습니다.
- 보통은
pipeline
을 더 많이 사용합니다.
소스 코드 관리
에서 작업을 수행할repository
주소를 입력합니다.
- 해당하는
repository
의credentials
선택- 작업을 수행할 branch 변경 ex)
*/main
Jenkins 관리
->Credentials
->System
->Global credentials(unrestricted)
- 저는
github app
을 통한 인증을 하였습니다.- 개인
repository
이면, 개인 repo에github app
설치- 기관
repository
이면, 따로 기관 repo에github app
설치ssh 토큰
등의 여러 방법이 있어 편한 방법으로credential
을 미리 만들어야합니다.
Repository URL과 Credentials에 오류가 있으면 오류가 나옵니다.
- 제대로 된 주소라면, 오류가 보이지 않습니다.
Github hook
을 통한 트리거
github repository
내webhook
설정 필요
빌드 과정 선택
- 허용된 사용자 설정 -> 체크 -> 아닐 시, revert
Execute shell
쉘 스크립트를 통한 작업 과정 진행
git revert HEAD --no-edit
실행revert
는 새롭게 커밋을 작성을 요구합니다. 스크립트상에서는 바로 실행하기 위한 --no-edit
추가# 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
빌드 후 조치를 통한 변경 이력
git push
Git Publisher
를 통하여, push 진행
Push Only if Build Succeeds
: 빌드가 성공할 경우에만 pushForce Push
: revert를 한 후, 일반 push는 적용되지 않아 강제 푸시branches
: origin의 main 브랜치에 push
오류가 있다면, 피드백 주시면 감사하겠습니다.
감사합니다.