※ 깃허브를 이용하지 않고, 도커에 만들어둔 깃 서버로부터 배포 자동화할 것이다.
1. 깃 서버 컨테이너 구축
2. 젠킨스 컨테이너 구축
docker run -d --privileged -p 8091:8080 -u root --name myjenk jenkins/jenkins:lts
jenkins/jenkins:lts 이미지를 통해 쉽게 구축하면 된다.
★ --privileged 옵션 추가
★ -u root 옵션 추가
★ 포트번호 _____:8080
3. 젠킨스 - Publish Over SSH 플러그인 설치
보통은, Jenkins 관리 > Plugin Manager > 설치 가능 에서 ssh를 검색해 Publish Over SSH 설치를 진행하면 된다.
하지만 나는 폐쇄망 환경이므로 아래 글의 방법으로 설치했다.
Some plugins could not be loaded due to unsatisfied dependencies.
Fix these issues and restart Jenkins to re-enable these plugins.
Dependency errors:
Publish Over SSH (1.22)
Plugin is missing: publish-over (0.22)
만약 다음 에러가 발생했다면, publish-over 플러그인도 설치한다.
4. SSH 키 등록
ssh-keygen -t rsa
젠킨스 환경에서 ssh 키를 생성한다.
vi authorized_keys
이후, 깃 서버의 .ssh 디렉토리에서 authorized_keys 파일을 생성해, 젠킨스 환경의 id_ras.pub 파일을 복사한다.
파일 자체를 복사하든, 파일 내용을 복붙하든 편한 방법으로 진행하면 된다.
5. Service Server 세팅
docker run --privileged -d -p 8083:8083 --name myservice centos:7 init
docker exec -it myservice bash
서비스 서버 컨테이너를 생성 후 실행한다.
★ --privileged를 꼭 붙여줘야 한다.
yum install net-tools
yum install openssh-server
ssh 포트 (22번 포트)를 열어주기 위해 openssh-server를 설치하고, 네트워크 상태를 확인하기 위해 net-tools를 설치한다.
systemctl start sshd
systemctl status sshd
ssh를 실행시키고 상태를 확인한다.
netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
netstat -ntl을 통해 네트워크 상태를 확인한다. 다음과 같이 22번 포트가 열렸다면 성공이다.
vi /etc/ssh/sshd_config
PermitRootLogin을 찾아 주석을 해제하고 yes로 바꿔준다. >> PermitRootLogin yes
yum list java*jdk-devel
yum install java-11-openjdk-devel.x86_64
설치가능한 jdk 버전을 확인 후, 설치한다.
useradd parkdaeun
passwd parkdaeun
현재 root 계정으로 되어있다면, 유저 계정을 생성하고 비밀번호도 설정해준다.
su parkdaeun
mkdir ~/.ssh
유저계정으로 변경후, .ssh 디렉토리를 생성한다.
cd ~/.ssh
vi authorized_keys
깃 서버의 id_rsa.pub을 authorized_keys에 복사한다.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
ssh 디렉토리와 authorized_keys의 권한을 각각 700, 600으로 설정한다.
만약 설정하지 않는다면, jenkins에서 인증이 불가하다.
6. Jenkins에 Service Server SSH 접근 설정
Jenkins 관리 > 시스템 설정의 하단 부분에서 Publish over SSH를 찾는다.
SSH Servers의 추가 버튼을 누를다.
Name, Hostname, Username, Remote Directory, Passphrase/Password를 설정할 것이다.
- Name: 서버의 이름을 설정한다. (본인이 식별할 수 있는 아무 이름으로 지정해도 무방함)
- Hostname: Service Server의 IP 주소를 입력한다. (Service Server에서 hostname -i 명령어로 알아내기)
- Username: 위에서 설정한 Service Server의 Username을 입력한다.
- Remote Directory: 배포할 서버의 기본 workspace라 보면 된다. 파일 전송 시 디렉토리를 정하지 않으면 이 곳으로 가게 된다.
- Passphrase/Password: 위에서 설정한 Service Server User의 Password를 입력한다.
Test Configuration을 클릭했을 때 다음과 같이 Success가 뜬다면 성공이다.
7. Jenkins 프로젝트 추가
새로운 Item을 클릭한다.
프로젝트 이름을 입력하고 Freestyle project를 클릭 후 좌측 하단의 OK를 누른다.
소스 코드 관리 탭에서 Git을 선택한다.
Repository URL의 깃 서버의 주소를 입력한다. (ssh://깃서버계정@깃서버IP:프로젝트경로)
ex) ssh://root@172.22.0.2:/opt/git/project.git >> git clone 시 사용하는 주소!
이후, Credentials의 Add를 눌러 Jenkins로 설정한다.
※ Username: 식별 이름, ID: git 서버 유저명, Password: git 서버 유저 비밀번호
근데 128 오류가 발생했다.
code 128: stdout:
stderr: Host key verification failed.
fatal: Could not read from remote repository.
1. ssh 제대로 설정했는지 확인, 깃서버 주소 확인, Credentials 확인
2. 같은 네트워크로 연결되어있는지 확인 (도커 네트워크)
3. 현재 연결 상황 확인하기
systemctl status sshd
jenkins 컨테이너에서 명령어 실행
Connection closed by 172.22.0.5 port 56958 [preauth]
다음과 같이 뜬다면, 통신은 되지만 어떠한 이유로 인해 연결이 막힌 것임.
따라서 3번을 시도해보았다.
4. jenkins 서버 컨테이너에서 git clone ssh://깃서버계정@깃서버IP:프로젝트경로 해보기.
혹시 중간에 Are you sure you want to continue connecting (yes/no/[fingerprint])?이 뜬다면 이 때문일 가능성도 있다.
ssh도 최소 10번은 확인했고,, 이를 임시로 막는다면 보안상 좋지 않을지는 잘 모르겠다.
[Linux / Mac] SSH 접근시 "Are you sure you want to continue connecting (yes/no)?" 없이 접근하기 (tistory.com)
이 방법을 사용해보았지만 계속 Are you sure you want to continue connecting (yes/no/[fingerprint])?가 떴다.
jenkins 컨테이너에서 yes라 입력해 벗어나고, 두번째 clone 부터는 위 문구가 뜨지 않는다.
이후, 다시 페이지로 돌아와 Repository URL을 입력했더니 128 오류가 사라졌다!
Build 탭에서 Invoke Gradle script를 누른다. 아래 (1), (2) 중 택해서 진행하면 된다.
1) Use Gradle Wrapper
Use Gradle Wrapper을 클릭하고, Make gradlew executable을 체크한다.
Tasks에 clean build를 입력한다.
2) Invoke Gradle
1번 보다는 번거로운 방법이다. 하지만, 난 1번에 실패해 2번으로 진행하였다.
Invoke Gradle을 체크한다.
Invoke Gradle을 택하기 위해선 설정해야할 것이 있다.
▶ Jenkins 관리 > 플러그인 관리 에서 Gradle 설치
Add build step을 한번 더 누르고, Send files or execute commands over SSH를 클릭한다.
Service Server와 관련해 설정하는 곳이다.
- Name: Service Server을 식별할 수 있는 이름을 설정한다.
- Source files: jenkins 서버에서의 jar 파일의 위치
- Remote directory: service 서버에서 jar파일이 저장될 위치
- Exec command: java -jar {jar 파일 경로} &
- --server.port: 8080이 사용 중이라 8087로 바꾸어주었다.
8. 빌드 후 배포
BUILD SUCCESSFUL이 떠야 성공이다.
난 BUILD SUCCESSFUL이 떴지만, 7번의 SSH Server 설정 과정에서 경로를 잘못 입력해서 원활히 작동되지 않았다.
이런 경우, Transferred 0 file(s)라 뜰 것이다.
Service 서버의 포트로 접속 시, 제대로 작동되면 성공이다!
참고
'Infra > Jenkins' 카테고리의 다른 글
[Jenkins] 젠킨스 빌드 및 배포 자동화 (0) | 2021.11.30 |
---|---|
[Jenkins] 초기 비밀번호 확인하기 login error (0) | 2021.11.29 |
[Jenkins] CentOS에 Jenkins 설치하기 (2) | 2021.11.15 |