깃허브와 젠킨스 연동
: 완료
The Gradle wrapper has not been found in these directories: 오류해결
wget https://services.gradle.org/distributions/gradle-6.9.1-bin.zip
yum install unzip
unzip gradle-6.9.1-bin.zip
export PATH=$PATH:/opt/gradle/gradle-6.9.1/bin
# 젠킨스의 프로젝트 설정에서 wrapper location 설정
/opt/gradle/gradle-6.9.1
# 젠킨스 설정에서 gradle 추가
Jenkins 관리 > Global Tool Configuration > Gradle installations > save
젠킨스 프로젝트 > 관리 > Build > invoke Gradle > 생성한 Gradle 선택 > 저장
=> 빌드성공
깃허브 webhook 도입 및 젠킨스 연동
http://61.96.169.14:18260/github-webhook/
젠킨스 빌드 후 깃허브 Release 브랜치에 업로드
1. 젠킨스 프로젝트 > 구성 > 빌드 후 조치 추가
2. Git Publisher
: Push Only If Build Succeeds
: Tag 추가 > $BUILD_NUMBER
: Target remote name = origin
: Branch 추가 > Release
: Target remote name = origin
※ git bash에서 git remote -v하여 remote name 확인
: 테스트 전 브랜치 생성후 브랜치에 push
: git remote add jk https://github.com/KNUT-Mohaemookji/mohaemookji/tree/release
=> 철회
이후 계획
1. 젠킨스를 통해 도커 파일을 이미지로 빌드 하도록
: 젠킨스를 통해 안될 경우 쉘 파일을 실행하도록 하여 구현
2. 도커 파일 이미지 빌드 후 컴포즈 및 스웜까지 실행
: CI/CD 완성
3. CI/CD 완성 후
: 데이터베이스 서버 정기적 commit하여 데이터 저장 되도록
: nodejs 페이지 렌더링 연구
오늘의 목표
1. 젠킨스 기능 연구
2. 젠킨스 컨테이너 생성
: 도커파일 작성 및 push
3. 젠킨스 컨테이너를 통한 SSH 컨테이너 배포
: DB컨테이너에 commit 되도록
: docker commit 컨테이너이름 이미지이름 <실행중인 컨테이너 커밋>
젠킨스 기능에 대한 연구
: https://2mukee.tistory.com/242
젠킨스 컨테이너 생성
# 젠킨스 이미지 다운로드
: jenkins official 이미지는 더이상 사용되지 않아 공식 대체제 이용
docker pull jenkins/jenkins
# 젠킨스 도커 파일 작성
FROM jenkins/jenkins
LABEL "mh-deploy-server"="v1.00"
EXPOSE 18260
메인 서버 및 API 서버 컨테이너 SSH포트 개방
: 메인서버 (13260)
: API 서버 (13270)
: 컴포즈 수정 <expose를 해서 22포트를 열어라>
services on the same network can access each other's containers on any port.
=> 동일한 네트워크의 컨테이너 끼리는 모든 포트가 개방되어있음
=> expose 안해도 된다
배포 서버 세팅
: 젠킨스 필수 플러그인 설치
: 젠킨스 필수 플러그인에 대해 정리 (https://2mukee.tistory.com/manage/posts/)
ㆍ계정생성
계정명 :
비밀번호 :
ㆍ깃허브 연동
ㆍ자동 빌드 생성
=> 참조 (https://2mukee.tistory.com/239)
SSH를 통한 각 컨테이너로의 배포 구현
※ 컨테이너로의 SSH 접속
ssh -l 아이디 -p 호스트_포트 호스트_아이피
※ 컨테이너 commit
docker commit ~~~ 2mukee/mh_deploy_image:1.01
docker push 2mukee/mh_deploy_image:1.01
1. DB서버 및 배포 서버에 volume 추가
=> 데이터 저장을 위해서는 volume mount가 필요
=> compose 파일 수정 (volumes추가)
: jenkins_home:/var/jenkins_home
2. 메인 컨테이너 및 API 컨테이너 exec 후 설정
: adduser deploier
: passwd deploier
: exit > commit ~~~
: docker push ~~
: shutdown -r now
※ 정보
: docker commit 하면 var과 같은 데이터는 저장되지 않아도 user정보 등 리눅스 시스템 혹은 패키지 관련 데이터는 저장된다
: commit 하면 꼭 push를 해야한다
3. 컴포즈 수정
: volumes 추가함
4. 시스템 시간대 변경
: exec > date > docker exec >
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
date
=> 각 서버 Dockerfile에 추가함
5. SSH 도입
=> 내일 연구
※ 참조
: docker의 터미널 비밀번호는 volta 혹은 jovyan 이다.
오늘의 목표
1. 젠킨스 Publish over SSH에 대해 연구
2. 리눅스 SSH 통신에 대해 연구
3. 모해묵지 SSH 빌드 구현
서버 안정화
: 도커 파일 업데이트 및 이미지 빌드
: 도커 허브로 최신 이미지 push <마지막 버전>
: 시간대 Asia/Seoul 전체 적용 완료
: 자동 Build 확인 완료
ㆍ젠킨스 빌드 위치 확인
: /var/jenkins_home/workspace/mohaemookji
리눅스 SSH 통신에 대한 연구
1. 배포 서버 접속 후 SSH 포트 개방 및 root 패스워드 설정
vi /etc/ssh/sshd_config
: Port 22
: PubkeyAuthentication yes
: PermitRootLogin yes
service ssh restart
passwd root
2. 메인 서버 sshd_config 세팅 및 root 패스워드 설정
vi /etc/ssh/sshd_config
: Port 22
: PubkeyAuthentication yes
: PasswordAuthentication yes
service ssh restart
passwd root
passwd deploier
3. 메인 서버 SSH키 생성
ssh-keygen -t rsa -b 4096 -C "~~~@gmail.com"
ls -al ~/.ssh
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
cd ~/.ssh
touch authorized_keys
cat id_rsa.pub >> authorized_keys
4. 메인 서버 인증파일 권한 조정
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/known_hosts
chmod 600 ~/.ssh/authorized_keys
5. 메인 서버에서 배포 서버로 공개키 전송
ssh-copy-id root@deploy
6. 배포 서버 세팅
touch id_rsa.pub
cat authorized_keys >> id_rsa.pub
chmod 700 ~/.ssh
chmod 644 ~/.ssh/id_rsa.pub
6. 메인 서버 private key 확인 및 Jenkins publish over SSH 테스트
cat ~/.ssh/id_rsa
※ 배포서버에서 접속
ssh -l 아이디 -p 호스트_포트 호스트_아이피
ssh -l deploier -p 22 main
오늘의 할 일
1. 젠킨스 빌드 후 조치 > Send build artifacts over SSH에 대해 연구
2. 메인 서버 및 API 서버에 배포 되도록 세팅
: 서버 종료 > 서버 실행
도커파일 수정
- 메인 서버 및 API 서버에 빌드 후 생기는 workdir문제 디버깅
- 컴포즈 파일명 mohaemookji.yml로 변경
서버 종료 및 실행 명령어
killall -9 node main_server.js -DFOREGROUND
SSH 세팅 순서
1. API 서버 및 메인 서버 SSH 세팅 및 계정 패스워드 설정
vi /etc/ssh/sshd_config
: Port 22
: PubkeyAuthentication yes
: PasswordAuthentication yes
: PermitRootLogin yes
service ssh restart
passwd root
passwd deploier
vi /etc/passwd
: deploier:x:0:0::/usr
vi /etc/group
: root:x:0:deploier
2. 메인 서버 RSA키 생성
ssh-keygen -t rsa -b 4096 -C "~~~@gmail.com"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
chmod 700 ~/.ssh
cat ~/.ssh/id_rsa
3. 메인 서버에서 API 서버로 공개키 전송
ssh-copy-id root@api
4. 젠킨스 설정
: Publish over SSH의 Jenkins SSH 키부분에 RSA키 붙혀넣기
: 메인서버 Use password authentication, or use a different key 체크 후 계정 비번 입력
: 테스트 진행
: Remote Directory /usr
5. 메인서버 및 API서버 이미지 commit 및 push
: docker ps
: docker commit [] []
: docker push [] []
도커파일 디버깅 및 컴포즈 디버깅
: shell file을 이용한 node 종료 및 ENTRYPOINT 추가
: 도커 허브 Push
Jenkins publish SSH command
/usr/mohaemookji/main/main_server.sh
/usr/mohaemookji/api/api_server.sh
1. 컨테이너 SSH 및 계정설정 후 commit -> compose 파일 수정 -> service on
=> SSH 세팅 후 이미지를 commit 한 뒤 컴포즈에서 해당 버전을 읽도록 했을때 모든 설정이 잘 저장됨
=> 재부팅 후 service ssh restart가 반드시 필요했음 <한 번만 실행해도 무관>
=> ENTRY POINT에는 한 명령어만 되므로 각 컨테이너의 systemctl enable ssh 후 commit하고 push 및 컴포즈 변경
=> 쉘 파일에 service ssh restart 추가
참조
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
메인서버와 API서버에 init.d에 ssh 등록
vi /etc/systemd/system/ssh.service
[Unit]
Description=SSH
[Service]
ExecStart=/usr/bin/ssh
ExecStop=/usr/bin/ssh
Restart=on-failure
[Install]
WantedBy=multi-user.target
chmod 700 /etc/systemd/system/ssh.service
cd /etc/systemd/system/
systemctl daemon-reload
systemctl enable /etc/systemd/system/ssh.service
systemctl start /etc/systemd/system/ssh.service
결론
1. SSH 자동실행 불가 <꼭 죽어도 수동으로 해야함>
2. kill node 명령어만 쳐서 node만 죽이면 컨테이너가 죽어버림
: node 컨테이너라 그런지 모르지만 node의 PID가 1번이 아님에도 불구하고 컨테이너가 뒤짐
3. 그나마 다행인건 앞으로 도커파일 안만져도 될듯
: 초기 세팅때 해야하는건 다 함
: commit을 통해서 컨테이너를 저장하고 컴포즈 파일만 수정하는 식으로 진행해도 될듯
: 덕분에 SSH 및 계정 관련 설정을 지속적으로 만들지 않아도 됨
'Development > Project' 카테고리의 다른 글
Hermes_ 개발 중 공부 정리 본 (0) | 2021.10.20 |
---|---|
211011~15 모해묵지 개발일지 (0) | 2021.10.19 |
210916~28 모해묵지 개발일지 (0) | 2021.10.19 |
210912~15 모해묵지 개발일지 (0) | 2021.10.19 |
이게 뭐약 개요 (0) | 2021.09.13 |