개발 Q&A

제목 젠킨스 배포 질문이요
카테고리 PHP
글쓴이 우왕 작성시각 2022/08/30 11:45:12
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 7309   RSS

안녕하세요. 먼저 무식한 질문 죄송합니다.

php, nginx, aws로 웹페이지 띄우고 젠킨스와 깃헙 연동까지는 했습니다.

그런데 배포가 문제입니다..

제가 원하는건 깃헙 푸시 후에 젠킨스에서 aws로 웹페이지 경로로 소스 반영이 되었으면 좋겠는데

젠킨스 workspace 경로의 소스 반영까지만 되고 있습니다.

그래서 아무리 깃헙에 푸시해도 aws웹까지 반영은 안 되고 있는데요.

검색해보니 .sh을 등록을 해서 cp나 mv로 파일을 처리하면 될 것 같긴한데요

.sh로 배포 쉘스크립트를 짜면 되는 건가요?

다들 배포는 어떻게 처리하셨나요?

초보라서 검색을 해봐도 이해가 안 가네요ㅜ 도와주세요..

 

 다음글 php을 공부하고 있는데 어떻게 공부를 해야할까요.. (3)
 이전글 MySQL 사용자 특정 ip만 외부 접속 가능하게 하기 (3)

댓글

한대승(불의회상) / 2022/08/30 15:24:18 / 추천 0
.sh로 배포 스크립트를 짜시면 됩니다.
tuyitu719 new / 2026/03/14 10:01:29 / 추천 0

안녕하세요.
전혀 무식한 질문 아닙니다. 지금 겪고 계신 상황은 아주 흔합니다.

핵심부터 말씀드리면, 지금 Jenkins는 “소스를 가져오는 것(checkout)”까지만 하고 있고, “배포(deploy)” 단계가 아직 없는 상태입니다. Jenkins Pipeline에서는 nodeagent 안에서 workspace 가 자동으로 할당되고, 거기에 Git 소스가 체크아웃됩니다. 그래서 workspace 에 코드가 들어오는 것 자체는 정상이고, 그 다음에 실제 웹서버 경로로 복사하거나 원격 서버로 전송하는 배포 단계를 따로 만들어야 합니다. Jenkins 공식 문서도 JenkinsfileBuild / Test / Deploy 같은 stage 를 두는 예시를 보여주고 있고, Jenkinsfile 을 소스 저장소에 같이 두는 방식을 권장합니다.

그래서 질문 주신 내용에 답하면, 네, 초보자 기준으로는 .sh 배포 스크립트를 만들어서 Jenkins 에서 실행하는 방식이 가장 쉽고 많이 쓰는 방법 중 하나입니다.
다만 정확히는 “Jenkins가 자동으로 배포해주는 것”이 아니라, Jenkins가 배포 스크립트를 실행해주는 구조라고 이해하시면 됩니다. 즉,
GitHub push → Jenkins 빌드 시작 → workspace 체크아웃 → deploy.sh 실행 → 실제 서버 경로에 반영
이 흐름으로 가면 됩니다. Jenkins는 이런 작업을 Jenkinsfile 의 step 으로 실행할 수 있습니다.

경우는 2가지로 나눠서 생각하시면 됩니다.

1) Jenkins 와 웹서버가 같은 서버에 있는 경우

이 경우가 가장 단순합니다.
Jenkins workspace 의 파일을 /var/www/html 같은 nginx 서비스 경로로 cprsync 로 복사하면 됩니다.

예를 들면 deploy.sh 를 이런 식으로 둘 수 있습니다.


 
 
#!/bin/bash
set -e

TARGET_DIR="/var/www/html/your-project"
WORK_DIR="$WORKSPACE"

rsync -av --delete \
--exclude=".git" \
--exclude=".github" \
--exclude="Jenkinsfile" \
"$WORK_DIR"/ "$TARGET_DIR"/

sudo chown -R www-data:www-data "$TARGET_DIR"
 

그리고 Jenkinsfile 에서는:


 
 
pipeline {
agent any

stages {
stage('Deploy') {
steps {
sh 'chmod +x deploy.sh'
sh './deploy.sh'
}
}
}
}
 

이렇게 하면 됩니다.

2) Jenkins 와 AWS 웹서버(EC2)가 다른 서버에 있는 경우

이 경우는 Jenkins workspace 에서 끝나는 게 당연합니다.
왜냐하면 Jenkins 서버 안에만 코드가 받아진 것이고, 실제 EC2 웹서버로 파일을 보내는 과정이 아직 없기 때문입니다.

이럴 때는 보통 다음 중 하나로 배포합니다.

  • scp / rsync 로 EC2 에 직접 전송

  • SSH 접속 후 원격 경로에 반영

  • AWS CodeDeploy 사용

Jenkins 쪽에서는 SSH 자격 증명을 써서 원격 서버에 접속할 수 있고, Jenkins 의 sshagent step 은 Pipeline 에 SSH 자격 증명을 제공하는 용도로 문서화되어 있습니다.

예를 들어 Jenkinsfile 에서 이런 식으로 할 수 있습니다.


 
 
pipeline {
agent any

stages {
stage('Deploy') {
steps {
sshagent(credentials: ['ec2-ssh-key']) {
sh '''
rsync -av --delete \
--exclude=".git" \
--exclude=".github" \
--exclude="Jenkinsfile" \
./ ubuntu@YOUR_EC2_IP:/var/www/html/your-project/
'''
}
}
}
}
}
 

즉, 지금 상황은 이상한 게 아니라 “배포 단계가 아직 없어서” 그런 것입니다.

실무에서는 어떻게 많이 하느냐?

초보자 입장에서는 보통 아래 순서로 갑니다.

  • 처음엔 deploy.sh + cp/rsync 로 시작

  • 조금 익숙해지면 Jenkinsfile 에 배포 stage 정리

  • AWS 답게 운영하려면 CodeDeploy 도 검토

AWS CodeDeploy 는 EC2 등에 애플리케이션 배포를 자동화하는 서비스이고, 소스 파일과 스크립트가 들어 있는 revision 을 S3 나 GitHub 에 올린 뒤 배포할 수 있습니다. AWS 문서상 CodeDeploy 는 EC2/온프레미스 배포를 지원하고, 롤링 업데이트나 블루/그린 배포로 다운타임 최소화와 롤백도 지원합니다. 그래서 나중에 서버가 늘어나거나 배포를 더 안정적으로 하고 싶다면 Jenkins 에서 직접 cp 하는 방식보다 CodeDeploy 가 더 정석에 가깝습니다.

제 추천은 이렇습니다.

  • 지금 당장 이해하고 적용하는 게 목표라면
    deploy.sh 만들어서 Jenkins 에서 실행

  • 서버가 1대고 구조를 빨리 잡고 싶다면
    rsync 로 웹 경로 반영

  • 나중에 운영 안정성까지 생각한다면
    → AWS CodeDeploy 로 넘어가기

한 줄로 정리하면:
네, 지금은 .sh 배포 스크립트를 짜서 Jenkins 에서 실행하는 방식으로 가시면 됩니다.
지금 안 되는 이유는 Jenkins 가 틀린 게 아니라, workspace 이후의 “실제 배포 동작”이 아직 없기 때문입니다.

참고 사이트: www.cbalist.com