Gitlab + AWS 연동에 관한 글을 참 많지만.. 저처럼 IDC 서버를 사용하는 사람들에겐 해당하지 않는 내용이라..
자료도 많지 않고, 설명이 부실한 글들이 많아서 직접 정리해봅니다.
무작정 따라하는것 보다, 공개키를 이용한 SSH 접속의 전체적인 흐름을 이해하고 읽는 것이 훨씬 더 도움됩니다.
클라이언트 키쌍 생성 (공개키-비밀키)
Gitlab Variables 등록
/etc/ssh
경로에 있으며, ssh 설치 시 생성됨배포 서버에 공개키 등록 (생성한 키의 공개키)
~.ssh/authorized_keys 파일에 등록.
SSH 클라이언트 접속 시, 등록되어있는 공개키의 해당하는 비밀키를 가지고 있다면 접속을 허용해줍니다.
Gitlab 스크립트 작성
자동 배포 확인
ssh-keygen
명령어를 입력하고, 엔터를 쭉쭉 눌러주면 C:Users\계정\.ssh\ 경로에 키쌍이 생성됩니다.Settings -> CI/CI -> Variables -> Add variable
저는 이미 변수를 등록해놓은 상태입니다.
/etc/ssh/ssh_host_*.pub
파일들을 확인합니다.[IP주소]:포트
형태로 입력합니다.키를 등록하는 이유
Gitlab 변수로 등록하는 이유
이 과정을 하지 않으면?
type $env:공개키위치 | ssh 계정@IP "cat >> .ssh/authorized_keys"
C:\Users\계정\.ssh\id_rsa.pub
입니다.ssh-copy-id 계정@IP
stages:
- build
- deploy
image: java:8-jdk # jdk8 도커 이미지 사용 (배포환경에 따라 변경할 것)
cache:
paths: # .gradle 캐시 적용
- .gradle/wrapper
- .gradle/caches
build:
stage: build
before_script:
- chmod +x ./gradlew # gradlew 실행권한 부여 (초기 권한 666 [-rw-rw-rw-])
script:
- ./gradlew build
artifacts:
paths:
- build/libs/*.jar # build의 결과물인 jar파일을 artifacts로 지정.
expire_in: 1 week # 1주일 동안 보관
deploy-to-server:
stage: deploy
before_script:
- mkdir -p ~/.ssh
- eval $(ssh-agent -s) # ssh-agent 백그라운드 실행
###############################################
# 공개키 등록을 안했다면 Host Key Checking 비활성화 옵션 추가 (중간자 공격 위험)
# - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" >> ~/.ssh/config'
# 공개키 등록을 했다면 known_hosts 등록 및 권한 변경
# - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
# - chmod 644 ~/.ssh/known_hosts
###############################################
- chmod 600 "$SSH_KEY" # 개인키 파일 권한변경
- ssh-add "$SSH_KEY" # SSH 개인키 추가
script:
# SSH를 이용한 원격 파일 업로드
- scp build/libs/*.jar 계정명@"$DEPLOY_SERVER_IP":~/BUILD_PATH/build.jar
# 원격 스크립트 실행
- ssh 계정명@"$DEPLOY_SERVER_IP" /BUILD_PATH/start.sh
#!/bin/sh
cd ~/BUILD_PATH
PID=$(ps -ef|grep build.jar|grep -v grep|awk '{print $2}')
if [ "$PID" == "" ]; then
echo "no process exist"
else
echo "process id (${PID}) killed"
kill -9 ${PID}
fi
echo "Program Start"
nohup java -jar build.jar 1 > /dev/null 2>&1 &