from Dictionary - CI/CD

CI/CD

Junit

기본 개념

pipeline

일련의 Job으로 구성된 단위이다.

Job

파이프 라인을 구성하는 최소 작업 단위다.

Variables

Job에서 사용하거나 다른 곳에 재사용 할 때 지정할 수 있는 환경 변수의 한 유형이다.

Runner

pipeline을 따라 Job을 실행시키는 주체다. 러너의 종류로는 1. 공유 러너, 2. 그룹 러너, 3. 지정 러너가 있다.

Artifacts

일련의 단계에서 나온 산출물이다.

예시

## 파이프라인의 단계
stages:
  - test
  - build
  - packing
  - deploy


## 해당 파이프라인에서 사용할 로컬 변수
variables:
  STAGE_TARGET_PATH: /home/service
  STAGE_NAME: $STAGE_NAME
  STAGE_TARGET_SERVER: $STAGE_TARGET_SERVER


  ##Job
test:
  ## 단계
  stage: test
  ##어떤 이미지를 사용 할 것이며
  image: gradle-8.6.0-jdk17
  ##어떤 상황에서 실행되는가
  when: always
  ##트리거가 되는 브랜치
  only:
    - stage
    - master
  ##태그
  tags:
    - test_work
  before_script:
    - pwd
    - chmod +x gradlew
  script:
    - echo [INFO] TEST PROJECT $CI_PROJECT_NAME
    - ./gradlew test




build: ##Job
  ## 단계
  stage: build
  ##어떤 이미지를 사용 할 것이며
  image: gradle:7.6-jdk11-alpine
  ##어떤 상황에서 실행되는가
  when: on_success 
  ## 선행되어야만 하는 작업
  needs:
    - job: test
  ##트리거가 되는 브랜치
  only:
    - stage
    - master
  ##job에 대한 태그
  tags:
    - build_work
  # 스크립트 이전 실행
  before_script:
    - pwd
    ## 자바HOME을 유동적으로 변경(Gradle -> 2024-05-22-[gradle-series]-Summary.md)
    - cp $JAVA_HOME_11 gradle.properties
    - chmod +x gradlew
    - ./gradlew clean
  #스크립트
  script:
    - echo [INFO] BUILD PROJECT $CI_PROJECT_NAME
    - ./gradlew generateDbJooqSchemaSource"
    - ./gradlew -x generateDbJooqSchemaSource bootjar  --continue"
    - echo [INFO] RENAME FILE
    - cp build/libs/*.jar $CI_PROJECT_NAME.jar
  ## 빌드 결과물을 저장할 아티팩트
  artifacts:
    paths:
      - build/libs/*.jar
    expire_in: 1 days

stage:
  stage: deploy
  needs:
    - job: build
      artifacts: true
  when: on_success
  only:
    - stage
  script:
    - echo [INFO] DEPLOY STAGE_MODE $CI_PROJECT_NAME
    - echo [INFO] move to ${STAGE_TARGET_SERVER}
    - cp build/libs/*.jar $CI_PROJECT_NAME.jar
     ## 파일로 된 전역 변수 가져와서
    - cat $STAGE_TARGET_SERVER_KEY 
    ##권한 하향
    - chmod 400 $STAGE_TARGET_SERVER_KEY
      
      ## 파일 만들고 전송하고 하는 일련의 과정
    - echo ssh -i $STAGE_TARGET_SERVER_KEY ${STAGE_NAME}@${STAGE_TARGET_SERVER} mkdir -p ${STAGE_TARGET_PATH}
    - ssh -i  $STAGE_TARGET_SERVER_KEY ${STAGE_NAME}@${STAGE_TARGET_SERVER} mkdir -p ${STAGE_TARGET_PATH}
    - ssh -i  $STAGE_TARGET_SERVER_KEY ${STAGE_NAME}@${STAGE_TARGET_SERVER} << EOT
    - cd ${STAGE_TARGET_PATH}
    - |
      exist=`ls | grep $CI_PROJECT_NAME.jar | wc -l`
      if [ $exist > 0 ]
        then
          echo create backupFile as $CI_PROJECT_NAME.jar_{CI_COMMIT_TIMESTAMP}
          mv ${STAGE_TARGET_PATH}/$CI_PROJECT_NAME.jar ${STAGE_TARGET_PATH}/$CI_PROJECT_NAME.jar_${CI_COMMIT_TIMESTAMP}
      fi
    - scp -i  $STAGE_TARGET_SERVER_KEY $CI_PROJECT_NAME.jar ${STAGE_NAME}@${STAGE_TARGET_SERVER}:${STAGE_TARGET_PATH}
    - cat $START
    - scp -i  $STAGE_TARGET_SERVER_KEY $START ${STAGE_NAME}@${STAGE_TARGET_SERVER}:${STAGE_TARGET_PATH}/start.sh
    - cat $STAGE_TARGET_SERVER_KEY
    - ssh -i  $STAGE_TARGET_SERVER_KEY ${STAGE_NAME}@${STAGE_TARGET_SERVER} chmod 755 ${STAGE_TARGET_PATH}/start.sh
    - ssh -i  $STAGE_TARGET_SERVER_KEY ${STAGE_NAME}@${STAGE_TARGET_SERVER} << EOT
    - cd ${STAGE_TARGET_PATH}
    - ./start.sh
    - EOT
    - echo Congratulation. All done!

deploy_as_production:
  stage: deploy
  needs:
    - job: build
      artifacts: true
  when: on_success
  only:
    - master
  script:
    - echo [INFO] DEPLOY PRODUCTION_MODE $CI_PROJECT_NAME