320x100
320x100

깃허브와 젠킨스 연동
: 완료


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 및 계정 관련 설정을 지속적으로 만들지 않아도 됨

 

 

 

300x250
728x90

'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