728x90
안녕하세요, 가시다님이 운영하시는 cicd 스터디 스터디 내용을 정리한 포스팅입니다.
CI/CD 정의
CI/CD는 단순한 기술적 접근을 넘어 소프트웨어 개발의 철학적 변화를 대변합니다. 개발부터 운영까지의 전체 생명주기를 유기적이고 seamless하게 연결하는 혁신적인 방법론입니다.
Continuous Integration (지속적 통합)
개발자들의 코드 변경사항을 중앙 저장소에 빈번하고 자동으로 병합하는 소프트웨어 개발 실천 방식입니다.
CI의 라이프 사이클
- 계획: 요구사항 정의와 설계
- 코딩: 실제 코드 작성
- 빌드: 코드를 실행 가능한 애플리케이션으로 변환
- 테스트: 품질 검증 및 오류 탐지
- 패키징: 배포 준비
Continuous Deployment (지속적 배포)
CI를 통해 검증된 소프트웨어를 실제 운영 환경에 자동으로 배포하고 지속적으로 모니터링하는 프로세스입니다.
CD의 라이프 사이클
- 배포: 검증된 애플리케이션을 프로덕션 환경에 릴리즈
- 운영: 실제 서비스 제공
- 모니터링: 성능과 안정성 추적
- 피드백: 지속적인 개선을 위한 인사이트 수집.
CI/CD의 핵심 가치
- 속도: 개발부터 배포까지의 시간 단축
- 품질: 자동화된 테스트를 통한 소프트웨어 품질 향상
- 안정성: 일관된 배포 프로세스
- 협업: 개발팀 간 원활한 통합
멀티 스테이지 빌드
멀티 스테이지 빌드는 Docker에서 이미지 크기를 줄이고 빌드 프로세스를 최적화하는 방법입니다.
# 코드 작성
$ mkdir 1.3 && cd 1.3
$ cat > Hello.java <<EOF
class Hello {
public static void main(String[] args) {
System.out.println("Hello Multistage container build");
}
}
EOF
$ cat > Dockerfile <<EOF
FROM openjdk:11 AS buildstage
COPY . /app
WORKDIR /app
RUN javac Hello.java
FROM openjdk:11-jre-slim
COPY --from=buildstage /app/Hello.class /app/
WORKDIR /app
CMD java Hello
EOF
# 컨테이너 이미지 빌드
$ docker build . -t hello:3 -t hello:latest
$ docker image ls -f reference=hello
# => REPOSITORY TAG IMAGE ID CREATED SIZE
# hello 3 4a058414ac44 11 seconds ago 216MB
# hello latest 4a058414ac44 11 seconds ago 216MB
# hello 2 ba37ddf45c26 24 minutes ago 487MB
# ...
# 컨테이너 실행
$ docker run --rm hello:3
# => Hello Multistage container build
$ docker run --rm hello
# => Hello Multistage container build
# 컨테이너 이미지 내부에 파일 목록 확인
$ docker run --rm hello ls -l
# => total 4
# -rw-r--r-- 1 root root 436 Dec 5 15:26 Hello.class
$ docker run --rm hello javac --help
# => docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "javac": executable file not found in $PATH: unknown.
장점
- 최종 이미지 크기 감소
- 빌드 종속성과 런타임 종속성 분리
- 보안 강화
Jib로 자바 컨테이너 빌드
Jib은 Google에서 개발한 Java 컨테이너화 도구로, Docker 없이 Java 애플리케이션을 컨테이너화합니다.
$ mkdir 1.4 && cd 1.4
$ cat > app.rb <<EOF
require 'sinatra'
get '/' do
"Hello, World! The time is #{Time.now}"
end
EOF
$ cat > Dockerfile <<EOF
FROM ruby:3.3
RUN gem install sinatra rackup puma
COPY app.rb /app/
WORKDIR /app
CMD ["ruby", "app.rb", "-o", "0.0.0.0"]
EOF
# 컨테이너 이미지 빌드
$ docker build . -t timeserver:1 && docker tag timeserver:1 timeserver:latest
$ docker image ls -f reference=timeserver
# => REPOSITORY TAG IMAGE ID CREATED SIZE
# timeserver 1 6393669e5e68 12 seconds ago 1GB
# timeserver latest 6393669e5e68 12 seconds ago 1GB
# 컨테이너 실행
$ docker run -d -p 8080:4567 --name=timeserver timeserver
# 컨테이너 접속 및 로그 확인
$ curl http://localhost:8080
# => Hello, World! The time is 2024-10-01 15:28:18 +0000
$ docker logs timeserver
# => Puma starting in single mode...
# * Puma version: 6.5.0 ("Sky's Version")
# == Sinatra (v4.1.1) has taken the stage on 4567 for development with backup from Puma
# * Ruby version: ruby 3.3.6 (2024-10-01 revision 75015d4c1f) [aarch64-linux]
# * Min threads: 0
# * Max threads: 5
# * Environment: development
# * PID: 1
# * Listening on http://0.0.0.0:4567
# Use Ctrl-C to stop
# 172.17.0.1 - - [01/Oct/2024:15:28:07 +0000] "GET / HTTP/1.1" 200 51 0.0048
# 컨테이너 이미지 내부 파일 확인
$ docker exec -it timeserver ls -l
# => total 4
# -rw-r--r-- 1 root root 76 Dec 6 15:20 app.rb
주요 특징
- Docker 데몬 없이 컨테이너 빌드
- 레이어 캐싱으로 빌드 속도 향상
- 멀티 아키텍처 지원
Jenkins 소개
오픈 소스 자동화 서버로, CI/CD 파이프라인 구축에 널리 사용됩니다.
주요 기능
- 소스 코드 체크아웃
- 자동 빌드
- 테스트 실행
- 배포 자동화
GitLab 소개
GitLab은 DevOps 라이프사이클을 지원하는 통합 플랫폼으로, Git 기반 소프트웨어 개발을 위한 포괄적인 도구입니다.
주요 특징
1. 코드 관리
- 분산 버전 관리 시스템
- 코드 리뷰 및 병합 요청(Merge Request) 기능
- 브랜치 관리 및 워크플로우 지원
2. CI/CD 파이프라인
- 내장된 지속적 통합/배포 도구
- .gitlab-ci.yml 파일을 통한 파이프라인 구성
- 자동화된 빌드, 테스트, 배포 프로세스
3. 협업 도구
- 이슈 트래킹 시스템
- 프로젝트 보드
- 위키 및 문서화 기능
- 팀 커뮤니케이션 통합
주요 기능
- Git 저장소 관리
- CI/CD 파이프라인
- 이슈 트래킹
- 코드 리뷰
- 컨테이너 레지스트리
GitLab CI 예시
이러한 도구들은 개발 프로세스를 자동화하고 효율성을 높여 소프트웨어 개발 생산성을 크게 향상시킵니다.
자바 스프링 부트의 gitlab ci 파일을 확인해 봅니다.
stages:
- build
- test
- package
- deploy
variables:
MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"
build:
stage: build
image: maven:3.8.4-openjdk-11
script:
- mvn compile
artifacts:
paths:
- target/
test:
stage: test
image: maven:3.8.4-openjdk-11
script:
- mvn test
artifacts:
reports:
junit:
- target/surefire-reports/TEST-*.xml
package:
stage: package
image: docker:latest
services:
- docker:dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
only:
- main
deploy:
stage: deploy
script:
- echo "Deploying to production server"
- ssh user@server "docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
- ssh user@server "docker stop myapp || true"
- ssh user@server "docker run -d --name myapp $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
only:
- main
728x90
반응형
'DevOps > GitOps' 카테고리의 다른 글
[GitHub Actions] 커밋 메시지 특수문자 처리하기 (0) | 2024.11.22 |
---|