2 분 소요

기존에 우분투 서버 자체에서 설치했던 mysql을 도커 컴포즈를 이용하여 설치하고 배포할 예정이다.
이전에 정리해놨던 글을 참고하여

  1. Jenkins를 통한 애플리케이션 빌드 및 자동 배포
  2. 슬랙으로 젠킨스 알림 받기
  3. 젠킨스와 소나큐브 연동하기

순서로 진행한다.


우선, 1번(Jenkins를 통한 애플리케이션 빌드 및 자동 배포) 과정부터 아래와 같이 다섯 단계로 진행할 것이다.

  1. 우분투 인스턴스 생성 및 EIP 연결
  2. swap file 할당
  3. 우분투 인스턴스에 Docker Engine & Docker Compose 설치
  4. 젠킨스 설치 (with. Docker Compose)
  5. 젠킨스와 github webhook을 통한 자동 빌드 & 자동 배포

1~4번 과정은 무리없이 진행할 수 있을 것이고,
5번 과정에서 이전과 달라진 부분 위주로 기록할 예정이다.

5-1. Jenkins 빌드 할 때 Parameter사용하기

docker-compose.yml에 db 패스워드와 다른 민감 정보들을 .env 파일에 숨기고, jenkins 빌드할 때 주입해주자!

1) Spring Boot 프로젝트 구성

docker-compose.yml

version: '3'
services:
  database:
    container_name: my_mysql
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_ROOT_HOST=%
    command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
    ports:
      - "${MYSQL_LOCAL_PORT}:${MYSQL_DOCKER_PORT}"
    volumes:
      - ./docker/data:/var/lib/mysql
    restart: always
    networks:
      - test_network

  application:
    container_name: my_app
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "${SPRING_LOCAL_PORT}:${SPRING_DOCKER_PORT}"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://database:${MYSQL_DOCKER_PORT}/${MYSQL_DATABASE}?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true
      - SPRING_DATASOURCE_USERNAME=${MYSQL_USER}
      - SPRING_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD}
    restart: always
    depends_on:
      - database
    networks:
      - test_network

networks:
  test_network:
    driver: bridge

.env 파일 작성

MYSQL_ROOT_PASSWORD=****
MYSQL_DATABASE=****
MYSQL_USER=****

MYSQL_LOCAL_PORT=****
MYSQL_DOCKER_PORT=****

SPRING_LOCAL_PORT=****
SPRING_DOCKER_PORT=****

.gitignore에 등록한다!

2) 젠킨스 설정

파라미터와 함께 빌드

스크린샷 2023-03-20 오후 1 40 55

중요🌟
만약에 String Parameter의 value에 / 기호가 포함되어 있다면,
/ 기호 앞에는 escape 문자(\)를 넣어주어야 한다!

만약 abc/def 라는 값이면 abc\/def가 되는 것이고,
만약 abc//def라면 abc\/\/def가 되는 것이다.

위에서는 jenkins 대시보드에서 직접 환경변수를 넣어줬지만,
Jenkins 빌드 시 환경변수 파일 넣기도 가능하다!

5-2. 설정 파일 복사하기

1) 우분투 인스턴스 설정

인스턴스 내부에 환경 변수 파일을 모아둘 디렉토리 생성

Jenkins 컨테이너가 가동되고 있는 우분투에 접속하여 환경 변수 파일을 생성한다.
폴더 구조는 아래와 같다.

env
⎿ aws-s3.yml

스크린샷 2023-03-20 오후 2 59 52

환경 변수 파일 내용 작성

aws-s3.yml 에는 S3 와 연결하기 위한 설정 정보를 적는다.

cloud:
  aws:
    credentials:
      access-key: ********
      secret-key: ********
    s3:
      bucket: ********
    region:
      static: ********
    stack:
      auto: false

젠킨스 컨테이너 접속 후 폴더 생성

호스트에 생성한 aws-s3.yml 파일을 젠킨스 컨테이너 내부로 복사할 것이다.
복사할 폴더를 생성해주자.

$ docker exec -it jenkins /bin/bash
$ mkdir my-env

스크린샷 2023-03-20 오후 3 05 51

호스트 -> 컨테이너 파일 복사

# docker cp [host 파일경로] [container name]:[container 내부 경로]
$ docker cp /home/ubuntu/env/aws-s3.yml jenkins:/my-env/aws-s3.yml

스크린샷 2023-03-20 오후 3 08 05

🚨 컨테이너를 지웠다가 다시 생성하면 my-env가 사라지기 때문에 파일 복사를 다시 해주어야 함..
나중에 스크립트로 만들 수 있을듯

2) 젠킨스 설정

젠킨스 build Steps 변경

기존 shell 에서 "@@@@@ 환경변수 파일 주입 @@@@@" 단계를 추가해야 한다!
(프로젝트에 .gitignore에 등록되어 있는 aws-s3.yml 파일을 주입하기 위해서)

echo "@@@@@ 환경변수 파일 주입 @@@@@"
cp /my-env/aws-s3.yml ./src/main/resources

echo "@@@@@ aws-s3.yml 파일 위치 확인 @@@@@"
find -name aws-s3.yml

echo "@@@@@ jar 파일 생성 @@@@@"
./gradlew build jar -x test

echo "@@@@@ jar 파일 위치 확인 @@@@@"
find -name practice-0.0.1-SNAPSHOT.jar

echo "@@@@@ 도커 이미지 빌드 @@@@@"
docker-compose build --no-cache

echo "@@@@@ 도커 컨테이너 생성 및 실행 @@@@@"
docker-compose up --force-recreate -d

sleep 5s
docker ps -a


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기

태그:

카테고리:

업데이트: