소프트웨어의 규모가 커지고 복잡해지면서 분업과 협업은 필수가 되었습니다. 이 분업과 협업의 과정에서 코드의 Merge 과정은 더욱 더 까다로워졌으며 테스트하는 데에는 더 큰 자원을 소비하게 되었습니다. 이러한 배경 속에서 CI와 CD가 탄생하게 되었습니다.

CI는 빌드/테스트 자동화 과정을 의미하는 용어로 개발자를 위한 자동화 프로세스이며, 지속적인 통합(Continuous Integration)을 의미합니다. 쉽게 GitHub에 특정 브랜치(master)에 새로운 커밋이 될 때 마다, 해당 코드를 바탕으로 빌드하고 사용자가 미리 만들어둔 테스트 코드를 실행하여 문제가 있는지 없는지를 체크하는 과정을 자동화 한것을 의미합니다.
CD는 배포 자동화 과정을 의미하는 용어로 지속적 서비스 제공(Continuous Delivery) 또는 지속적 배포(Continuous Deployment)를 의미합니다. 기존에는 빌드 후 문제가 없다고 판단되면 실제 서버든, 클라우드 환경의 서버 환경에 합쳐진 코드(빌드 된 상태의)를 올리는 과정을 하며 이를 배포한다 라고 하였습니다. 그런데 위에서 설명한 CI의 과정이 되어 있다면, 우리는 배포 마저도 CI가 완료되는 시점에 자동으로 실행하면 됩니다. 이를 CD라고 합니다.
이 실습의 목적은 CI/CD를 위한 시스템 아키텍처 구축을 실제로 해보고 이에 따라 CI/CD 파이프라인의 동작 방식 및 CI/CD의 구성을 이해할 수 있으며 배포 주기 단축 및 빌드/테스트/배포 자동화의 편리함을 느낄 수 있다.

docker 및 docker-compsose가 미리 설치되어 있어야 함
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
우선 원활한 설치를 위해 selinux 설정을 disabled 함
/etc/seliux/config 에서 disabled 함

systemctl status docker 로 docker 실행 상태 확인

docker pull jenkins/jenkins:lts
다운로드 받은 이미지를 이용하여 jenkins 실행
docker run -d -p 8181:8080 --restart=always --name jenkins -u root jenkins/jenkins:lts
vm public ip:8181 접속
docker의 jenkins bash로 접속하여 해당 경로의 암호 파일을 열어 접속한다.apt-get updateapt-get install vim


gitlab-CE 버전을 docker compose 기반으로 설치
메모리 8GB, 2 코어
docker compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

docker compose version 확인

이때, 저는 vm의 os를 CentOS를 사용하고 있기 때문에 docker-compose —version을 실행하면
라는 오류가 발생하였습니다.
이에 따라 낮은 버전의 docker-compose를 다운 받았습니다.
- 1.24.0 버전 설치 명령어
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

docker-compose.yml 파일 생성gitlab:
image: "gitlab/gitlab-ce:latest"
restart: always
hostname: "192.168.45.111"
container_name: gitlab
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.45.111'
# Add any other gitlab.rb configuration here, each on its own line
ports:
- "9090:80"
- "1022:22"
- "443:443"
volumes:
- "~/gitlab/config:/etc/gitlab"
- "~/gitlab/logs:/var/log/gitlab"
- "~/gitlab/data:/var/opt/gitlab"
- "~/gitlab/backups:/var/opt/gitlab/backups"
docker-compose up -d


초기 암호 확인
cat /etc/gitlab/initial_root_password

암호 변경 및 재로그인









Secret token을 발생시킴. 이 토큰을 메모해놓고 gitlab 시스템에 입력해야 함.




Invoke Gradle script 추가Use Gradle Wrapper 와 Make gradlew executable 선택clean과 bootWar 설정
id war 와 bootWar 추가plugins {
id 'java'
# 추가
id 'war'
id 'org.springframework.boot' version '2.7.12'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
# 추가
bootWar{
archiveBaseName="springproject"
archiveVersion="1.0.1-SNAPSHOT"
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
tasks.named('test') {
useJUnitPlatform()
}




~$ mv webapps webapps2
~$ mv webapps.dist/ webapps




http://172.16.48.186:8080/manager/html 로 설정한 계정 정보로 접속
