Gitlab CI/CD : LFTP 클라이언트를 사용하여 FTP/SFTP 배포 환경 구축기

devforest443·2022년 8월 16일
0

log 2021. 2. 22. 20:33

시작 하기에 앞서.... 왜?

기존 winscp synchronize command를 통해 바이너리 파일들을 서버에 배포를 하고 있었다. 그런데... 운영하면서 지원 하는 옵션이 부족한 느낌이 많이 들었고 결정적으로 간혹 이미지 파일이 완벽히 동기화 되지 않는 큰 이슈가 있었다. 그래서 ftp 클라이언트를 변경하기로 했다.

배포 자동화 환경 구성도

  1. 개발자 각 인터넷 PC에서 개발 진행 후 Gitlab 형상관리 서버에 commit/push하여 업로드 한다.
  2. develop 브랜치에 소스가 merge/push되면 자동으로 알파 서버에 배포 한다.
  3. 개발 및 QA가 완료되면, master브랜치에 merge/push 후 ci/cd Runner Manual의 jop을 클릭하여 프로덕션 서버에 자동 배포 한다.
  4. 프로덕션 서버의 리소스를 CDN서버에 캐싱하고 CDN은 최종 사용자와 가까운 POP(point-of-presence) 위치의 Edge 서버에 캐시된 콘텐츠를 저장하여 사용자에게 제공한다.

Lftp man(ftp Client)

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"

lftp Option

  • e : --delete, 동기화 과정중에 없는 파일을 삭제한다.
  • set file:charset utf-8; : 파일 언어셋을 utf-8로 설정
  • set net:reconnect-interval-base 5; 접속 실패 후 5초간 대기한다.
  • set net:max-retries 10; 재접속 시도 횟수 제한 설정

lftp Mirror Option

  • R : --recursive, 본래 mirror 기능은 목적지 > 로컬 순서로 디렉터리가 표기가 되고 로컬에 목적지에 있는 파일을 다운로드 받는 명령어로, 반대로 로컬 파일을 목적지로 전달하고 싶으면 R 플래그 옵션을 설정 해야 한다.
  • n : --only-newer, 새롭게 업데이트된 파일만 동기화
  • v : --verbose, 파일 전송 로그 표기
  • p : --no-perms, 파일 권한을 설정하지 않음
  • X: --exclude-glob, glob 정규식으로 제외파일을 설정. 일반 정규식과 다르게 asterisk(*)가 와일드카드의 의미를 갖음

(와일드카드 문자(wildcard character)
컴퓨터에서 특정 명령어로 명령을 내릴 때, 여러 파일을 한꺼번에 지정할 목적으로 사용하는 기호를 가리킨다. 이 문자는 어느 곳에서 사용하느냐에 따라 약간의 차이를 보인다. 주로 특정한 패턴이 있는 문자열 혹은 파일을 찾거나, 긴 이름을 생략할 때 쓰인다.)

lftp man 문서 바로가기

lftp 설치

Ubuntu/Debian Linux

$ sudo apt-get update 
$ sudo apt-get install lftp

gitlab-runner 재시작

$ sudo gitlab-runner restart

gitlab-runner 설정

GIT_CLONE_PATH : 빌드 커스텀 디렉터리 설정

Configure runner behavior with variables

먼저, GitLab Runner의 구성을 변경하려면 config.toml 파일을 수정해야 한다.
빌드 커스텀 디렉터리를 사용하려면, config.toml 의 runners.custom_build_dir 항목을 활성화 해줘야 한다.

1. 편집 보드 진입

$ sudo vi /etc/gitlab-runner/config.toml 
i

2. custom_build_dir 활성 옵션 추가

[runners.custom_build_dir]
  enabled = true

3. 편집 모드 저장 및 종료

:wq

4. gitlab-runner 재시작

$ sudo gitlab-runner restart

5. gitlab-ci.yml variables 추가

variables:
    GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_PROJECT_PATH

GitLab 러너 활성화/환경 변수 세팅

  1. 프로젝트 > Settings > CI/CD > Runners > 'Enable for this project' 활성화
  1. Settings > CI/CD > Variables
    프로젝트 그룹 단위로도 설정 가능하다.

GitLab Deploy Pipeline

gitlab-ci.yml

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

Configure runner behavior with variables

variables:
    GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_PROJECT_PATH

GitLab CI/CD pipeline stage

stages:
    - deploy

Jobs

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

Job keywords

GitLab CI/CD script syntax

배포 확인

프로젝트 > CI/CD > Pipelines

stage: deploy 목록을 클릭하면 배포된 파일들의 로그 확인이 가능하다.

이후....

잘 운영하고 있고, 배포가 빠르고 용이해져서 업무 효율이 높아졌다.
사실, 다들 어떻게 바이너리 파일들을 배포하고 운영하는지 잘 모르겠다.
기존 서비스에 영향을 주지 않으면서 업무 효율까지 챙기는것은 앞으로의 지속적인 숙제인것 같다.
배포 후 cdn 서버의 캐시를 갱신하기 위해 퍼지 작업을 하는데, 다수의 파일이 배포되고 그것을 수동으로 갱신하는것이 많은 리소스로 느껴져 다음은 CDN 퍼지 자동화 구축기를 기록해 보려고 한다.....

profile
devforest443

0개의 댓글