검색

레이블이 Gradle인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Gradle인 게시물을 표시합니다. 모든 게시물 표시

2023년 5월 12일

코딩 - Docker 을 이용한 개발 환경 만들기 ( SpringBoot + MySql )

 ◼︎ 환경 

  • Model : MacBook Pro (14-inch, 2021)
  • CPU : Apple M1 Pro
  • MENORY : 16GB
  • DISK : 512 GB SSD
  • OS : macOS 13.2.1 (22D68)
  • TOOLS : Visual Studio Code, Java 11, Gradle
  • Version Control : GitHub
  • Programming Language : Java , Vue3
  • DBMS : MySql

Docker(도커) Dasktop 설치하기

도커는 애플리케이션을 빌드, 실행 및 배포하는 데 사용되는 오픈 소스 플랫폼이다. 도커는 애플리케이션을 컨테이너로 패키징하여 어디서나 실행할 수 있도록 한다. 컨테이너는 가볍고 이식 가능하므로 개발, 테스트 및 프로덕션 환경에 이상적이다.

도커는 다음과 같은 여러 가지 이점을 제공한다.

  • 개발 및 테스트 속도 향상: 도커를 사용하면 개발자가 애플리케이션을 빠르고 쉽게 빌드하고 테스트할 수 있다. 이는 개발 프로세스를 가속화하고 버그를 더 빨리 식별하는 데 도움이 될 수 있다.
  • 배포 용이성: 도커를 사용하면 개발자가 애플리케이션을 어디서나 쉽게 배포할 수 있다. 이는 애플리케이션의 배포 프로세스를 단순화하고 애플리케이션의 가용성을 높이는 데 도움이 될 수 있다.
  • 비용 절감: 도커를 사용하면 서버 및 인프라 비용을 절감할 수 있다. 이는 도커가 서버를 사용하지 않고도 애플리케이션을 실행할 수 있도록 하기 때문이다.

도커는 개발자, 시스템 관리자 및 컨설턴트에게 인기 있는 도구이며 기업에서도 애플리케이션의 개발, 배포 및 관리를 위해 도커를 사용하고 있다.

M1 맥 환경에서 도커를 아래와 같이 설치할 수 있다.


❶ Rosetta 2 을 설치한다.

Docker Desktop은 Intel Mac 용으로 빌드되었다. M1 Mac에서 에서 Intel Mac 용으로 빌드된 앱을 실행하려면 Rosetta 2를 설치해야 한다. Rosetta 2는 리눅스 Wine (윈도우 프로그램을 리눅스에서 실행하게 하는 가상머신) 과 유사하게 Intel 코드를 Apple Silicon 으로 번역하는 가상 머신이다.

softwareupdate --install-rosetta

❷ Docker.dmg 프로그램을 다운로드 후 더블 클릭하여 설치를 진행한다.

Docker Dasktop 은 명령 과 데스크탑  UI 프로그램이 제공되어 누구나 쉽게 이용할 수 있다.


MySql  배포하기

❶ MySql Docker 이미지 다운로드

가장 최신 MySql Docker 이미지를 다운로드 한다.  

docker pull mysql

특정 버전 이미지가 필요하다면 tag 을 같이 사용하여 아래와 같은 방법으로 다운로드 한다.

docker pull mysql:8.0.33

docker 는 다운로드 가능한 이미지들에 대한 검색 기능을 제공하고 있는데 docker search [검색어] 명령을 사용하거나  Docker Desktop 에서 mysql 을 검색하여 이미지를 다운로드 할 수도 있다. 

% docker search mysql

NAME                            DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED

mysql                           MySQL is a widely used, open-source relation…   14116     [OK]       

mariadb                         MariaDB Server is a high performing open sou…   5392      [OK]       

percona                         Percona Server is a fork of the MySQL relati…   607       [OK]       

phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   793       [OK]       

circleci/mysql                  MySQL is a widely used, open-source relation…   29                   

bitnami/mysql                   Bitnami MySQL Docker Image                       85                   [OK]

bitnami/mysqld-exporter                                                          5                    

ubuntu/mysql                    MySQL open source fast, stable, multi-thread…   46                   

cimg/mysql                                                                       0                    

rapidfort/mysql                 RapidFort optimized, hardened image for MySQL    14                   

google/mysql                    MySQL server for Google Compute Engine           23                   [OK]

rapidfort/mysql8-ib             RapidFort optimized, hardened image for MySQ…   0                    

hashicorp/mysql-portworx-demo                                                    0                    

rapidfort/mysql-official        RapidFort optimized, hardened image for MySQ…   0                    

newrelic/mysql-plugin           New Relic Plugin for monitoring MySQL databa…   1                    [OK]

databack/mysql-backup           Back up mysql databases to... anywhere!          84                   

linuxserver/mysql               A Mysql container, brought to you by LinuxSe…   38                   

bitnamicharts/mysql                                                              0                    

mirantis/mysql                                                                   0                    

docksal/mysql                   MySQL service images for Docksal - https://d…   0                    

linuxserver/mysql-workbench                                                      49                   

vitess/mysqlctld                vitess/mysqlctld                                 1                    [OK]

eclipse/mysql                   Mysql 5.7, curl, rsync                           0                    [OK]

drupalci/mysql-5.5              https://www.drupal.org/project/drupalci          1                    [OK]

drupalci/mysql-5.7              https://www.drupal.org/project/drupalci          0                    



다운로드된 이미지들은 docker images 명령 또는 Docker Desktop 프로그램에서 목록을 확인할 수 있다. 

 

 % docker images

 mysql                      latest     5371f8c3b63e   3 weeks ago    592MB




❷ MySql 이미지 컨테이너 생성 및 실행
아래와 같은 명령으로 간단하게 컨테이너를 생성하고 실행한다.  (<password> 값은 원하는 값으로 변경)

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest

생성되어 실행중인 컨테이너는 docker ps 명령을 사용하거나 Docker Desktop Containers 에서 확인 할 수 있다.


❸ 데이터베이스 생성 및 권한 부여 
아래 명령으로 Docker 컨테이너 MySql 에 접속한다. MySql root 계정의 비밀번호는 앞서 입력한 값을 사용한다.

docker exec -it mysql-container bash 
mysql -u root -p 


% docker exec -it mysql-container bash 

bash-4.4# mysql -u root -p 

Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 10

Server version: 8.0.33 MySQL Community Server - GPL


Copyright (c) 2000, 2023, Oracle and/or its affiliates.


Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> 



이제 새로운 데이터베이스 및 계정을 추가한다 . (아래는 예시)

-- testdb 생성
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- test 계성 생성
CREATE USER 'tester'@'%' IDENTIFIED BY 'tester';
-- testdb에 대한 권한을 tester 에게 부여한다.
GRANT ALL PRIVILEGES ON testdb.* TO 'tester'@'%' WITH GRANT OPTION;

마지막으로 Workbench 와 같은 클라이언트 도구를 사용하여 생성된 데이터베이스에 접속한다.


SprinbBoot 이미지 생성 및  배포하기

Spring 2.3 이상부터는 bootBuildImage Task 가 지원되고 있는데, 이 Task를 사용하면 Dockerfile 없이 Docker 이미지를 쉽게 생성할 수 있다. 이미지는 ./gradlew bootBuildImage 명령을 사용하여 이미지를 생성한다. 


 ./gradlew bootBuildImage



주의 할 것은 bootBuildImage 는 Buildpacks 기술을 사용하고 있는데 Buildpacks 는 기본적으로 docker daemon을 사용하고 있기 때문에 docker가 설치되어 있어야지 동작할 수 있다.

컨테이너 배포 및 실행은 다음과 같은 명령을 사용하면 된다.


 docker run -p 8080:8080 [이미지 이름]



VS Code 에서 도커 사용하기 

Docker 확장을 사용하면 Visual Studio Code에서 컨테이너화된 애플리케이션을 쉽게 빌드, 관리 및 배포할 수 있습니다. 이때 도커 서비스는 실행중이여야 한다.
 
Docker 확장 설치는 VS Code 에서 ⇧⌘X 명령을 입력하여 좌측 사이드 확장 뷰를 열고  docker  이름을 검색하여 설치하면 된다. 


Docker 확장 프로그램은 VS Code에 Docker 탐색기 보기를 제공한다.  Docker Explorer를 사용하면 컨테이너, 이미지, 볼륨, 네트워크 및 컨테이너 레지스트리와 같은 Docker 자산을 검사하고 관리할 수 있다.

여기에서는 mysql 컨테이너를 시작하고 중지하는 용도로만 사용하고 있다. 
 

참고자료 

  1. https://spring.io/guides/topicals/spring-boot-docker/ 
  2. https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html#_enable_native_image_support 
  3. Docker in Visual Studio Code

2023년 4월 13일

코딩 - Daily Build and Smoke Test on GitHub

Daily Build and Smoke Test

스티브 맥코널은 1996 년 IEEE Software "Daily Build and Smoke Test" 컬럼에서 Microsoft와 일부 다른 소프트웨어 회사에서는 "Daily Build and Smoke Test" 프로세스가 일반적이라고 기술하고 있다. (다른 세상이야기 같이 느끼고 있다면 당장 변화가 필요하다.)



하나의 파일로 구성된 간단한 프로그램을 만들려면 그 하나의 파일을 컴파일하고 링크하기만 하면 된다. 하지만 수십, 수백, 수천 개의 파일이 포함된 팀 프로젝트에서는 (이는 다양한 구성 요소로 프로그램을 '빌드'해야 하기 때문에) 실행 가능한 프로그램을 만드는 과정은 더 복잡하고 많은 시간이 소요된다.  

"Daily Build and Smoke Test" 프로세스는 간단하게 매일 매일 빌드하고 매일 테스트하는 것을 의미한다.

Daily Build(이하 일일 빌드)에서 기본은 '매일'이라는 것이다. 짐 맥카시 말 처럼 (Dynamics of Software Development, Microsoft Press, 1995), 일일 빌드는 프로젝트의 심장박동이고, 심장박동이 없는 프로젝트는 죽은 것 이다. 

Smoke Test (이하 스모크 테스트) 는 새로운 빌드 또는 릴리스 후 시스템의 가장 중요한 기능이 예상대로 작동하는지 신속하게 확인하기 위해 수행하는 소프트웨어 테스트의 한 유형이다. 



스모크 테스트'라는 용어는 하드웨어 테스트 업계에서 유래한 것으로, 기술자가 새 기기를 켜서 연기가 나기 시작하면 하드웨어에 심각한 문제가 있음을 나타낸다. 마찬가지로 소프트웨어 개발에서 스모크 테스트는 일반적으로 애플리케이션 또는 시스템을 시작할 수 있는지, 주요 기능이 올바르게 작동하는지, 주요 문제나 심각한 버그가 없는지 확인하기 위해 실행되는 일련의 기본 테스트이다. 스모크 테스트는 자동화되는 경우가 많으며 일반적으로 개발 주기 초기에 문제를 파악하기 위해 각 빌드 후에 실행된다. 

스모크 테스트가 실패하면 추가 테스트를 수행하기 전에 해결해야 할 중요한 문제가 있다는 것이고, 스모크 테스트가 통과되면 개발자는 빌드가 더 철저한 테스트를 진행할 수 있을 만큼 안정적이라는 확신을 갖게 된다.

컬럼이 1996 년도 에 작성된 것을 고려하면 아직 많은 소프트웨어 개발 현장에서 적용되지 않고 있는 것에 많은 아쉬움이 있다.

◼︎ 이점

이 간단한 프로세스는 몇 가지 중요한 이점을 제공한다. 

  • 통합 위험을 최소화 : 팀 프로젝트가 직면하는 가장 큰 위험 중 하나는 여러 팀원이 개별적으로 작업하던 코드를 결합하거나 '통합'할 때 그 결과물인 복합 코드가 제대로 작동하지 않는다는 것이다. 프로젝트 후반에 비호환성이 발견되면 통합이 더 일찍 이루어졌을 때보다 디버깅 시간이 더 오래 걸리거나, 프로그램 인터페이스를 변경해야 하거나, 시스템의 주요 부분을 다시 설계하고 다시 구현해야 할 수도 있다. 극단적인 경우에는 통합 오류로 인해 프로젝트가 취소되는 경우도 있다. 일일 빌드 및 스모크 테스트 프로세스는 통합 오류를 작고 관리하기 쉬운 수준으로 유지하며 통합 문제가 발생하는 것을 방지한다.
  • 품질 저하 위험을 최소화 : 통합에 실패하거나 문제가 발생할 위험과 관련하여 품질 저하가 발생할 위험이 있다. 매일 모든 코드를 최소한의 스모크 테스트로 테스트하면 품질 문제로 인해 프로젝트가 중단되는 것을 방지할 수 있다. 
  • 더 쉬운 결함 진단을 지원 : 매일 제품을 빌드하고 테스트하면 특정 날짜에 제품이 고장난 이유를 쉽게 파악할 수 있다. 17일째에는 작동하던 제품이 18일째에 고장난 경우, 두 빌드 사이에 어떤 일이 발생하여 제품이 고장난 것으로 추정할 수 있다. 
  • 팀 사기 향상 : 제품이 작동하는 것을 보면 사기가 엄청나게 높아진다. 제품이 어떤 기능을 하는지는 거의 중요하지 않는다. 개발자는 사각형이 표시되는 것을 보는 것만으로도 흥분할 수 있다! 일일 빌드를 사용하면 매일 조금씩 더 많은 제품이 작동하므로 사기가 높아질 것 이다. 

Daily Build and Smoke Test  프로세스 자동화

◼︎ 환경 

  • Model : MacBook Pro (14-inch, 2021)
  • CPU : Apple M1 Pro
  • MENORY : 16GB
  • DISK : 512 GB SSD
  • OS : macOS 13.2.1 (22D68)
  • TOOLS : Visual Studio Code, Java 11, Gradle
  • Version Control : GitHub
  • Programming Language : Java 


Daily Build adn Smoke Test 프로세스의 기본 아이디어는 단순히 제품을 빌드하고 매일 테스트하는 것이다. GitHub 을 사용하고 있다면 GitHub Actions 을 사용하여 아주 쉽게 프로세스를 자동화 할 수 있다.

Source – https://docs.github.com/en/actions

GitHub Actions 는 리포지토리의 워크플로우를 자동화하는 GitHub에서 제공하는 지속적인 통합 및 배포(CI/CD) 서비스이다. 이를 통해 개발자는 사용자 지정 워크플로를 GitHub 리포지토리에서 직접 빌드, 테스트 및 배포와 같은 다양한 작업을 자동화할 수 있으며 아래와 같은 특징을 가지고 있다.

  • YAML (YAML Ain't Markup Language) 파일을 사용 테스트 실행, Docker 이미지 빌드, 서버에 코드 배포 등 .. 실행할 작업의 순서를 지정하는  워크플로우를 정의한다. 
  • Pull Requests, 커밋 또는 릴리즈와 같은 다양한 이벤트에 의해 동작이 시작될 수 있으며, Linux, Windows 또는 macOS와 같은 다양한 운영 체제에서 실행할 수 있다.
  • 워크플로에서 바로 사용이 가능한 AWS, Google Cloud 또는 Slack 등 타사 도구 및 서비스와의 통합도 지원한다. 
  • 워크플로는 GitHub가 제공하는 Linux, Windows 및 macOS 등 가상 머신에서 실행하거나 자체 데이터 센터 또는 클라우드 인프라에서 호스팅 러너를 설치하여 사용할 수 있다.

Gradle 을 사용하는 Java  스프링 부트 프로젝트를 자동으로 빌드하고 테스트하는 경우를 생각해보자. 

① 프로젝트 레파지토리에서  .github/workflows/gradle.yml  워크플로우 파일 생성. 
직접 파일을 만들어도 되지만 GitHub 에서 제공하는 기능을 사용하면 몇번의 클릭 만으로 생성할 수 있다. 

⑴ GitHub 프로젝트 레파지토리 > Actions  탭 > New workflow 버튼 클릭


⑵ 제공되는 워크플로우 목록에서 필요한 것을 선택. 여기에서는 Java with Gradle > Configure 을 선택 (➜ 선택은 해당 워크플로우을 기반으로 설정 파일 생성을 의미)



⑶ 워크플로우 수정 및 커밋 
기본적으로 대부분의 기능이 포함되어 구성되기 때문에 몇가지 만 확인하고 바로 커밋하면 된다.



main 브랜치에 push, pull requests 가 발생하면 워크플로우를 실행 : main 브랜치에 커밋이 발생하거나 제안된 pull request 관련 소스 브랜치를 main 에 병합하는 경우에 실행되는 것으로 변경하지 않고 사용해도 좋을 것 같다.

Customizing when workflow runs are triggered

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
 
Daily Build 에 맞게 매일 오후 5시에 주기적으로 실행되게 하려면 아래와 같이 schedule 옵션을 사용 cron 표현식을 사용하여 일정을 지정하면 된다. 

on:
schedule:
- cron: '0 17 * * *'
 

Running your jobs on different operating systems

워크플로우 작업을 실행할 러너 지정할 수 있는데 github 에서 제공하는 다양한 가상머신 기반의 러너를 사용하거나 아니면 직접 러너를 설치하여 사용할 수 있다.


최신 맥 가상머신에서 실행하는 것으로 지정하였다. 참고로 private 레파지토리는 사용량에 따라 무료 제공되는 2,000 분을 초과하면 과금이 발생된다.

jobs:
build:
runs-on: macos-latest


런너(Actions/Runner)를 직접 설치하여 사용할 수도 있다. 런너 설치가 지원되는 환경은 아래와 같다. 

About self-hosted runners 

◻︎ Linux
  • Red Hat Enterprise Linux 7 or later
  • CentOS 7 or later
  • Oracle Linux 7 or later
  • Fedora 29 or later
  • Debian 9 or later
  • Ubuntu 16.04 or later
  • Linux Mint 18 or later
  • openSUSE 15 or later
  • SUSE Enterprise Linux (SLES) 12 SP2 or later
◻︎ Windows
  • Windows 7 64-bit
  • Windows 8.1 64-bit
  • Windows 10 64-bit
  • Windows Server 2012 R2 64-bit
  • Windows Server 2016 64-bit
  • Windows Server 2019 64-bit
  • Windows Server 2022 64-bit
  • macOSmacOS 10.13 (High Sierra) or later
◻︎ CPU Architectures
  • x64 - Linux, macOS, Windows.
  • ARM64 - Linux, macOS, Windows (currently in beta).
  • ARM32 - Linux.


레파지토리, 조직 또는 엔터프라이즈에 자체 호스팅 러너를 추가할 수 있다. 레파지토리 러너 추가는 아래와 같은 절차로 진행한다.

Adding self-hosted runners

❶ 레파지토리 메인 > 세팅 탭 > 좌측 메뉴에서 runners 선택


❷ New self-hosted runner 버튼 클릭


❸ 러너 이미지와 아키텍처를 선택하고 안내에 따라 해당 호스트에서 러너를 설치하고 실행한다.

(참고로 장비는 오라클 클라우드에서 무료로 제공하는 VM 인스턴스를 사용하였다. )


라벨명 'self-hosted-oracle' 으로  등록

❹ 마지막으로 편의를 위하여 서비스로 설치하고 실행한다. 

➜ Configuring the self-hosted runner application as a service


[opc@instance-****-**** actions-runner]$ sudo ./svc.sh install
...
[opc@instance-****-**** actions-runner]$ sudo ./svc.sh start


❺ 레파지토리 메인 > 세팅 탭 > 좌측 메뉴에서 runners 선택하면 추가된 러너를 확인 할 수 있다.


❻ 추가된 러너로 워크플로우를 실행하기 위하여 프로젝트 레파지토리 .github/workflows/gradle.yml 파일을 아래와 같이 수정하고 start commit 하면 워크플로우가 등록한 러너에서 실행된다.


jobs
:
build:
runs-on: self-hosted


GitHub 제공 러너,  Mac Mini 에 설치한 러너,  Oracle Cloud VM 에 설치한 러너 에서 각각 실행한 결과 GitHub 제공 러너 (1m42s),  맥미니 호스트 러너(4m32s ), Oracle Cloud VM 호스트 러너(23m51s)  순으로 실행 속도가 나타났다. 


주의할 점은 GitHub Actions 이 14일 동안 실행되지 않으면 GitHub 에서 자동 삭제된다.


⑷ 워크플로우 상태 노출 하기  

마지막 워크플로우 실행 결과를 레파지토리 README 파일을 수정하여 노출할 수 있는데 이를 통하여마지막 빌드 결과를 확인하고 바로 조치할 수 있다.

❶ 레파지토리 메인 > Actions 탭 > 좌측 메뉴에서 앞서 등록한 Java CI with Gradle 선택

❷  Java CI with Gradle 워크플로우 실행 결과 상세 이동


❸ Create status badge 클릭 생성된 markdown 텍스트를 복사하고 README.md 파일에 내용을 추가한다.



이제부터 레파지토리 메인 에서 항상 빌드 결과를 확인할 수 있다.