이전에 빌드 방식과 배포 방식에 대해 정리했었다. 각각을 선택한 이유와 결과에 대해서 작성해본다.
참고. 프로젝트 정보
JDK : 1.6 버전
이클립스 JavaBuilder 사용
web/was : jeus6, webtob
선택과 결과
빌드방식
우선 대부분은 스프링으로 maven 프로젝트 일 것이다. maven 프로젝트에는 pom.xml 이 있기 때문에 빌드 파일을 따로 작성해주지 않아도 된다. Gradle 도 마찬가지
나의 경우에는 빌드 파일이 없었다. maven 프로젝트로 변경하면 에러가 난대서 제외하고, ant 빌드는 build.xml 파일만 작성하면 되기 때문에 ant 빌드를 택했다.
배포방식
war 압축
여기서 나의 무지함이 나타났다. 사실 나는 “ant 빌드는 배포물을 war 로 꼭 압축해야하는 줄 았았다.(절대 아님)”
아는 게 없으니 가이드가 하는대로 일단 따라 했던 것이다. 😅 덕분에 여기서 고생 많이 했다.
① .war 파일 그대로 사용
이 경우에 sftp 에 접속하여 .war 파일을(보통 resource 압축파일도 같이) 올려주면 된다. 압축 파일 하나만 올리면 되니까 굉장히 편하다. 그리고, 전체 파일도 항상 함께 업데이트 되니 로컬과 운영의 코드 불일치에 대한 불안함이 줄어든다.
<포기한 이유>
- 다른 방식의 폴더 접근: JEUSMain.xml 에서 컨테이너에서 접근하는 파일 경로를 변경해줘야한다. 기존에는 폴더 구조로 관리했기 때문에 /wasapp/proj/ 형식이었다면, proj.war 로 변경이 필요할 것이다.
- 이미지 파일 관리: 기존 폴더 구조 내에 시스템에서 이미지를 생성하는 경로가 있다. (예를들어, 공지사항에 첨부파일을 추가할 경우 그 파일을 저장하는 경로가 프로젝트 내부다.) 이 경로가 압축파일 내부에 있게되면 로컬에서 압축할 땐 해당 이미지들이 없는 채로 압축하게 되므로 접근할 수 있을까? 라는 의문이 들었고, 복잡하고 이해가 안되었다.
② 압축해제
gitlab cicd 환경에서 docker image 를 가져오는데, jar 명령어가 안돼서 포기.
lftp 명령어도 안됐었는데, 이미지로 ‘minidocks/lftp’ 이거였나,, docker hub에서 검색하여 나오는 이미지를 사용하니 됐었다. 직접 docker 이미지를 생성하는 건 갈 길이 멀어서 못했다.
https://hub.docker.com/r/minidocks/lftp
Docker
hub.docker.com
target 폴더
target 폴더에 컴파일된 소스들을 copy 하도록 빌드파일을 수정했다.
③ 모든 파일 적용
이건 팀에 다른 분이 예제를 짜서 공유해주셨다. 분석하는 데 시간이 조금 걸렸지만, 동작은 되는데 전부 변경한다는 게 무서웠다.
④ 선택 적용
아는 만큼 보인다고 예전에 전달받았던 참고자료와 예제 파일의 코드가 눈에 들어왔다. 근데, yaml 문법 지옥이었다. 똑같이 따라 썼다고 생각했는데, 띄어쓰기 하나만 잘못해도 오류가 난다.
선택 적용
변경된 파일만 배포하는 로직
script:
- IFS=$'\\n' CHANGE_FILE=( $(git diff-tree --name-only -r ${CI_COMMIT_BEFORE_SHA} ${CI_COMMIT_SHA}) )
- |
for FILE in "${CHANGE_FILE[@]}"
do
if [[ ${FILE} == *"src/"* ]]
then
DEPLOY_FILE=${FILE//".java"/".class"}
TARGET_FILE=${DEPLOY_FILE//"src"/"/wasapp/WEB-INF/classes"}
DEPLOY_FILE=${DEPLOY_FILE//"src"/"target"}
TARGET_DIRECTORY=$(dirname "${TARGET_FILE}")
lftp -c "set sftp:auto-confirm yes; open -u $SYSTEM_USER,$SYSTEM_USER_PW sftp://@DEV_SSH_HOST; cd ${TARGET_DIRECTORY} || (mkdir -p ${TARGET_DIRECTORY} && echo 'Create ${TARGET_DIRECTORY}')"
lftp -c "set sftp:auto-confirm yes; open -u $SYSTEM_USER,$SYSTEM_USER_PW sftp://@DEV_SSH_HOST; put -O ${TARGET_DIRECTORY} ${DEPLOY_FILE} || rm ${TARGET_FILE};"
elif [[ #todo ]]
then
# todo
else
continue
fi
done
하나씩 살펴보겠다.
- IFS=$'\\n' CHANGE_FILE=( $(git diff-tree --name-only -r ${CI_COMMIT_BEFORE_SHA} ${CI_COMMIT_SHA}) )
- git diff-tree --name-only -r ${CI_COMMIT_BEFORE_SHA} ${CI_COMMIT_SHA}
CI_COMMIT_BEFORE_SHA 와 CI_COMMIT_SHA 를 비교하여 변경된 파일만 가져온다. (경로포함)
개행문자가 담긴채로 문자열을 저장하기 때문에 IFS=$’\n’ 을 사용하여 개행을 끊어준 것이다.
기본으로 제공하는 GitLab CICD variables 가 정의되어있다.
https://gitlab.pavlovia.org/help/ci/variables/README.md
Readme · Variables · Ci · Help
Sign In/Register
gitlab.pavlovia.org
for FILE in "${CHANGE_FILE[@]}"
for 문 돌기. "${CHANGE_FILE[@]}" 에서 [@] 의 의미는 정확하게는 모르겠지만, 문자열이 저장된 주소를 참조하는 게 아닌가 싶다. c 에서 포인트로 저장된 배열의 첫번째를 가리키듯이
if [[ ${FILE} == *"찾을문자열"* ]]
if 문을 사용할 때 [[ 조건 ]] 으로 사용한다. FILE 에 내가 찾고자하는 문자열이 있는가? 에 대한 조건문이다.
DEPLOY_FILE=${FILE//".java"/".class"}
TARGET_FILE=${DEPLOY_FILE//"src"/"/wasapp/WEB-INF/classes"}
DEPLOY_FILE=${DEPLOY_FILE//"src"/"target"}
TARGET_DIRECTORY=$(dirname "${TARGET_FILE}")
- .java → .class 로 문자열 치환.
- 실제 서버의 classes 파일 경로로 변경.
- 배포할 class 파일의 위치로 변경.
왜 이렇게 했냐하면, 변경된 자바파일의 클래스파일을 배포하는 게 목적이다. 우선 class 로 확장자를 변경시키고, 실제 서버에 class 파일이 배포될 위치로 경로를 설정한다. 실제 배포될 파일의 경로는 src 가 아닌 gitlab cicd에서 빌드한 결과물이 저장된 target 폴더이기 때문에 변경해주었다.
❗️폴더 경로는 시스템마다 다르기 때문에 경로를 잘 확인하고 맞춰야한다.
NEW_STR=${STR//"찾을문자열"/"변경할문자열"}
// : 찾을문자열 전부 변경할문자열로 치환하겠다.
NEW_STR=${STR/"찾을문자열"/"변경할문자열"}
/ : 찾을문자열에 가장 먼저 나오는 문자열 하나만 변경할문자열로 치환하겠다.
DIR_PATH=$(dirname "파일명")
$(dirname “파일명”) 은 파일명에서 디렉토리 경로를 추출한다.
yaml 문법과 linux shell 문법
이게 yaml 문법이라고 해야할지 모르겠다. 아마 리눅스 쉘에서 사용가능한 문법들을 yaml 에서 작성하여 동작시키는 것이기 때문에 정확히는 리눅스 쉘에서의 문법이다. 섞여있다!
YAML
| : 여러줄로 작성할 것이다.
IFS=$’’ : ‘’ 을 만나면 문장을 끊는다. 보통 ‘\\n’,‘\\t’등을 사용한다.
$ : 참조의 의미?
${VAR} : VAR변수를 사용한다.
shell
for 문 : for do ~ done
if 문 : if [[ ]]; then ~ elif [[ ]]; then ~ else ~ fi
NEW_STR=${STR//"찾을문자열"/"변경할문자열"}
DIR_PATH=$(dirname "파일명")
이번에는 내가 배포할 방식을 선택한 이유와 작성한 yaml 파일에 대해서 주로 썼다. 다음에는 sftp 에 파일 업로드할 때 공부했던 내용과 기타 오류가 났던 것들에 대해 작성해봐야겠다. 순서가 엉망진창 같지만 그만큼 정신없었다는 뜻이겠지👾
'IT' 카테고리의 다른 글
[DB] PostgreSQL에서 숫자 앞에 0 채우기 (001, 002처럼 만들기) (0) | 2025.05.01 |
---|---|
스타트업 혁신가 육성, TEU (0) | 2023.09.08 |
GitLab CICD 도입기 ① (1) | 2023.04.15 |
'2023 서울모빌리티쇼' 지극히 주관적인 일반인 후기 (1) | 2023.04.09 |
AWS Certified Cloud Practitioner (CLF-C01) 시험 안내 (0) | 2023.02.19 |
댓글