log 2021. 2. 22. 20:33
기존 winscp synchronize command를 통해 바이너리 파일들을 서버에 배포를 하고 있었다. 그런데... 운영하면서 지원 하는 옵션이 부족한 느낌이 많이 들었고 결정적으로 간혹 이미지 파일이 완벽히 동기화 되지 않는 큰 이슈가 있었다. 그래서 ftp 클라이언트를 변경하기로 했다.
lftp man 클라이언트는 리눅스에서 많이 사용하는 commandline interface 기반의 강력한 ftp 클라이언트로,
ftp, http, fish, sftp, https, ftps 의 다양한 프로토콜을 지원하며, 에러 및 예외 처리가 잘 되어 있고 실패 했을 경우 자동으로 다시 시도 한다.
ipv6, ftp proxy, http proxy, ssl을 지원 하며, 2G이상의 대용량 파일 전송도 가능하며 빠르게 전송 한다.
또한 언어셋 설정 파일 디렉터리 생성, 읽기, 삭제 모두 옵션 설정을 지원하며 디렉터리 구조 이동까지 수행한다.
mirror(동기화) 기능을 사용하였으며, 기본적인 명령어 형식은 아래와 같다.
- lftp -e "set file:charset utf-8; open ftp://[user_account]:[user_password]@[host]:[port]; mirror -R -n -v -p $CI_PROJECT_DIR /target --delete -X *.md -X *.db -X *.yml -X *.git/; exit"
(와일드카드 문자(wildcard character)
컴퓨터에서 특정 명령어로 명령을 내릴 때, 여러 파일을 한꺼번에 지정할 목적으로 사용하는 기호를 가리킨다. 이 문자는 어느 곳에서 사용하느냐에 따라 약간의 차이를 보인다. 주로 특정한 패턴이 있는 문자열 혹은 파일을 찾거나, 긴 이름을 생략할 때 쓰인다.)
$ sudo apt-get update
$ sudo apt-get install lftp
$ sudo gitlab-runner restart
먼저, GitLab Runner의 구성을 변경하려면 config.toml 파일을 수정해야 한다.
빌드 커스텀 디렉터리를 사용하려면, config.toml 의 runners.custom_build_dir 항목을 활성화 해줘야 한다.
$ sudo vi /etc/gitlab-runner/config.toml
i
[runners.custom_build_dir]
enabled = true
:wq
$ sudo gitlab-runner restart
variables:
GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_PROJECT_PATH
variables:
GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_PROJECT_PATH
stages:
- deploy
deploy_alpha:
stage: deploy
script:
- echo "Deploy to alpha server"
- lftp -e "set file:charset utf-8; open ftp://$ALPHA_FTP_ACCOUNT:$ALPHA_FTP_PASSWORD@$ALPHA_FTP_HOST:$ALPHA_FTP_PORT; mirror -R -n -v -p $CI_PROJECT_DIR/directory /directory/directory --delete -X *.md -X *.db -X *.yml -X *.git/; exit"
environment:
name: alpha html
url: https://domain.co.kr/path
only:
- develop
deploy_prod:
stage: deploy
script:
- echo "Deploy to production server"
- lftp -e "set file:charset utf-8; open ftp://$PROD_FTP_ACCOUNT:$PROD_FTP_PASSWORD@$PROD_FTP_HOST:$PROD_FTP_PORT; mirror -R -n -v -p $CI_PROJECT_DIR/directory /directory/directory --delete -X *.md -X *.db -X *.yml -X *.git/ -X @html/; exit"
environment:
name: production
url: https://domain.co.kr/path
when: manual
only:
- master
variables:
GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_PROJECT_PATH
stages:
- deploy
deploy_alpha:
stage: deploy
script:
- echo "Deploy to alpha server"
- lftp -e "set file:charset utf-8; open ftp://$ALPHA_FTP_ACCOUNT:$ALPHA_FTP_PASSWORD@$ALPHA_FTP_HOST:$ALPHA_FTP_PORT; mirror -R -n -v -p $CI_PROJECT_DIR/directory /directory/directory --delete -X *.md -X *.db -X *.yml -X *.git/; exit"
environment:
name: alpha html
url: https://domain.co.kr/path
only:
- develop
deploy_prod:
stage: deploy
script:
- echo "Deploy to production server"
- lftp -e "set file:charset utf-8; open ftp://$PROD_FTP_ACCOUNT:$PROD_FTP_PASSWORD@$PROD_FTP_HOST:$PROD_FTP_PORT; mirror -R -n -v -p $CI_PROJECT_DIR/directory /directory/directory --delete -X *.md -X *.db -X *.yml -X *.git/ -X @html/; exit"
environment:
name: production
url: https://domain.co.kr/path
when: manual
only:
- master
deploy_alpha : Job Name
stage : 작업 단계 정의
script : 러너가 실행하는 쉘 스크립트
environment : 작업이 배포되는 환경 정보
only : 작업이 생성되는시기를 제한
프로젝트 > CI/CD > Pipelines
stage: deploy 목록을 클릭하면 배포된 파일들의 로그 확인이 가능하다.
잘 운영하고 있고, 배포가 빠르고 용이해져서 업무 효율이 높아졌다.
사실, 다들 어떻게 바이너리 파일들을 배포하고 운영하는지 잘 모르겠다.
기존 서비스에 영향을 주지 않으면서 업무 효율까지 챙기는것은 앞으로의 지속적인 숙제인것 같다.
배포 후 cdn 서버의 캐시를 갱신하기 위해 퍼지 작업을 하는데, 다수의 파일이 배포되고 그것을 수동으로 갱신하는것이 많은 리소스로 느껴져 다음은 CDN 퍼지 자동화 구축기를 기록해 보려고 한다.....