반응형
CI/CD 도구로 팀시티를 사용하다가 Jenkins로 마이그레이션 하게 되었다. Jenkins는 오픈 소스, 방대한 플러그인 생태계, 유연성, 커뮤니티 지원 등 여러 면에서 강력한 장점을 가지고 있다. 또한 무료로 사용할 수 있어 예산이 제한된 팀이나 복잡한 CI/CD 요구사항이 있는 팀에게 매우 유용할 수 있다.
아직 복잡한 CI/CD 요구사항은 없지만 향후 지속적으로 사용할것을 고려하여 시도해보았다.
Jenkins 설치 및 설정방법에 대해 설명하고 밑에 내가 마주했던 문제들에 대해 정리해보려고한다.
1. Jenkins 설치 및 초기 설정 방법
1. ec2에 Jenkins 설치
sudo apt-get update && sudo apt-get upgrade
# Jenkins는 Java로 제작된 오픈 소스이기에 java 11 버전을 설치
sudo apt-get install openjdk-11-jdk
sudo apt install -y git
# ubuntu용 GPG키 가져오기
wget -q -O - <https://pkg.jenkins.io/debian-stable/jenkins.io.key> | sudo apt-key add -
# jenkins 리포지토리를 추가
sudo sh -c 'echo deb <https://pkg.jenkins.io/debian-stable> binary/ > /etc/apt/sources.list.d/jenkins.list'
# jenkins 설치
sudo apt-get install jenkins
# jenkins 상태확인
sudo systemctl status jenkins
# 초기 비밀번호 확인
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
###################
#jenkins prot 변경 방법 (기본 port는 8080)
sudo vi /usr/lib/systemd/system/jenkins.service
# Environment="JENKINS_PORT=7070" 변경
sudo systemctl daemon-reload
2. 웹에서 jenkins 플러그인 설치 및 관리자계정 생성
- http:/1234.123.123.1234:7070/ (서버주소:포트, 기본 port는 7070으로 설정함) 접속
- Unlock Jenkins -> 확인했던 초기비밀번호를 입력
- Customize Jenkins -> 왼쪽 Install Suggested plugins 선택. 제안하는 플러그인 자동 설치
- 관리자 계정 생성 후 설정한 계정명 / 암호로 로그인
3. 필요한 플러그인 설치 되었는지 확인 : jenkins 관리 - Plugins
- 플러그인 : gradle, github integration, post build task, publish over ssh
- 필요한 플러그인이 설치 되었는지 확인 후 없는 것은 설치
4. 사용자 인증 : jenkins관리 - credentials - add credentials
- credentials 생성
- Username은 github 계정
- github 토큰 만들어서 password에 토큰 넣기
5. github 레포 설정에서 webhooks 설정
- 레포 - Settings - Webhooks에서 webhook 설정
- Payload URL은 http://호스트주소:포트/github-webhook/이다
- Content type은 application/json 선택해주고
- Secret에 credentials에 넣었던 gihub 토큰 넣어주기
- Just the push event을 선택해 push할 때마다 webhook
- 이렇게 webhook 추가
6. 새로운 아이템 - 이름 입력 후 Frestyle project 선택
- 빌드를 위한 프로젝트 생성
7. git repo, branche 설정
- 연결할 git repo 설정
- 앞에서 설정했던 credentials로 인증
- github 변경있을 시 빌드
8. ec2에서 ssh key 생성하기
# jenkins에 .ssh 폴더 만들고 들어가서 ssh key 발급
cd /var/lib/jenkins
sudo -u jenkins /bin/bash #jenkins 계정으로 진행
mkdir .ssh
cd .ssh
ssh-keygen #.ssh에 ssh key 생성(id_rsa, id_rsa.pub)
# 비밀번호는 설정하지 않고 그냥 enter 눌러도됨
vi authorized_keys # authorized_keys에 id_rsa.pub 키 복붙
9. ssh 22번 포트 열어주기
cd /etc/ssh
sudo vi sshd_config
# Port 22(jenkins) 열어주기
sudo service sshd restart
10. Jenkins 관리 - system - publish over SSH에서 ssh key 등록, 서버 설정
- Passphrase에서 ssh key 생성할 때 입력했던 password 입력하기. 생성 할 때 입력하지 않았으면 입력하지 않아도 됨
- key에 경로도 입력해주고
- 전체 키 값도 넣어준다
- ssh 서버 설정도 해준다.
- 하단에서 test 했을 때 Success가 나와야됨
11. 기존에 생성한 project에서 빌드스탭 설정
- 클린빌드
- ssh server : 11 번에서 세팅한 ssh server 선택
- Source files: build/libs/*.jar
- ec2 서버에 전달할 jenkins 서버에서의 jar 파일 경로
- jenkins Source files 절대 경로: /var/lib/jenkins/workspace/REPOSITORY_NAME/build/libs
- Jenkins workspace 기준인 REPOSITORY_NAME 이후부터 작성
- Remove prefix: build/libs
- Source files 경로에서 .jar 을 제외한 경로
- Remote directory: /app/git/deploy
- jenkins 서버에서 빌드된 jar 파일을 전달받을 ec2 서버 경로
- SSH Servers Remote Directory(/home/ec2-user) 이후 경로 작성
- Exec command: sh /app/backend/deploy.sh
- jenkins -> ec2 로 jar 파일을 전달한 이후 ec2 에서 실행할 명령어
- SSH Servers Remot2. 서버-포트에 들어가서 진행
12. 저장 후 빌드
2. Trouble Shooting
1. 젠킨스 빌드 시 Exec exit status not zero. Status [127] 오류발생
문제
ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [127]]
원인
- 터미널을 수동으로 실행할 때 다양한 종료 상태가 있는데 0이 나와야 성공을 의미함. 127의 경우 실패를 의미.
- sh 파일이 비표준 방식으로 종료코드를 사용하는 경우 Jenkins는 실패한다고 판단
해결
- 종료상태가 0이 나올 수 있도록 코드 추가 echo $?
2. 젠킨스 빌드 시 Permission denied 문제 발생
문제
ERROR: Exception when publishing, exception message [Permission denied]
- Remote directory 권한을 다 755로 변경해도 해결안됨
- jenkins로 deploy.sh 파일을 실행했을 때 빌드가 안됨
# jenkins로 접근
sudo -u jenkins /bin/bash
# 이후 deploy.sh 파일 실행
원인
- 젠킨스(Jenkins)가 특정 작업을 실행하거나 파일을 수정하려고 할 때 필요한 권한이 없을 때 발생
- 기본적으로 docker 그룹에 속하지 않은 사용자는 Docker 데몬 소켓 (/var/run/docker.sock)에 접근할 수 없음
- 폴더 및 파일 소유권 없음
해결
- jenkins 사용자를 docker 그룹에 추가
#jenkins 사용자를 docker 그룹에 추가
sudo usermod -aG docker jenkins
#현재 세션에 변경 사항을 적용
newgrp docker
#Docker 데몬 재시작
sudo systemctl reload docker
- 이후 jenkins user로 deploy.sh 파일이 실행이 되나 아직도 Permission denied 오류가 계속됨
2. 폴더 및 파일 소유권 확인 및 변경
sudo chown -R jenkins:jenkins /path/to/folder
sudo chmod -R 755 /path/to/folder
- 이후 빌드 완료
3. 잘 되다가 갑자기 빌드가 안되는 문제 발생
문제
- github repo 연결이 안됨 Failed to connect to repository : Failed to setup credentials
- 빌드 로그
원인
- 젠킨스 작업 공간에 있는 .git 디렉토리 손상
해결
- Dashboard > Jenkins 관리 > Tool 에서 git 경로를 설정해줌 /usr/bin/git
확실히 팀시티보다 설정이 복잡하지만 그렇다고 엄청 어렵지는 않았다! 아직 뻔한 플러그인만 써서 방대한 플러그인 생태계가 와닿지 않지만 기회가 된다면 어떤 것들이 있는지 찾아봐야겠다!
에러를 마주 했을 때는 당연히 있을 수 있는일이라 얼른 찾아보고 해결했다! 많은사람들이 사용하고 있어서인지 빠르게 해결할 수 있었다. 나와 같은 오류를 마주한 사람이 있다면 내 글이 도움이 되길~~
반응형
'개발 꿀팁' 카테고리의 다른 글
[Github] github profile 꾸미기 (0) | 2022.02.05 |
---|---|
Port 8080 was already in use 에러 해결방법 (0) | 2021.12.02 |
[Github] Github repository 병합하기 (0) | 2021.11.20 |
intellij에서 JAVA 알고리즘 풀기 설정 (0) | 2021.11.11 |
intellij 'Recompile with -Xlint:unchecked for details' 오류 해결 방법 (0) | 2021.11.10 |