CI/CD 파이프라인이란?
CI/CD 파이프라인은 새 버전의 소프트웨어를 제공하기 위해 수행해야 할 일련의 단계이다. 지속적 통합/지속적 배포(CI/CD) 파이프라인은 DevOps 또는 사이트 신뢰성 엔지니어(SRE) 방식을 통해 더 효과적으로 소프트웨어를 제공하는 데 초점을 맞춘 방법이다.
CD/CD 파이프라인은 특히 통합 및 테스트 단계와 제공 및 배포 단계에서 모니터링 및 자동호라르 도입하여 애플리케이션 개발 프로세스를 개선한다. CD/CD 파이프라인의 각 단계를 수동으로 실행할 수도 있지만, CD/CD 파이프라인의 진가는 자동화할 때 드러난다
Ci/CD 파이프라인의 단계는 각기 다른 태스크 하위 집합으로 이루어져 있는데, 이를 파이프라인 단계(pipeline stage)라고 부른다. 일반적인 파이프라인 단계는 다음과 같다.
- 빌드(Build) - 애플리케이션을 컴파일하는 단계
- 테스트(Test) - 코드를 테스트하는 단계. 이 단계를 자동화하여 시간과 수고를 줄일 수 있다.
- 릴리스(Release) - 애플리케이션을 리포지토리에 제공하는 단계
- 배포(Deploy) - 코드를 프로덕션에 배포하는 단계 (최종 운영 환경)
- 검증 및 컴플라이언스(Validation & compliance) - 빌드 검증 단계는 해당 조직의 필요에 따라 결정된다. Clair와 같은 이미지 보안 스캔 툴을 사용하여 알려진 취약점(CVE)과 비교하는 방법으로 이미지의 품질을 보장할 수 있다.
Git과 GitHub 개념 및 환경 설정
Git이란 소스코드를 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템'이다. 원래는 Linux 소스코드를 관리할 목적으로 개발되었다. Git에서는 소스 코드가 변경된 이력을 쉽게 확인할 수 있고, 특정 시점에 저장된 버전과 비교하거나 특정 시점으로 되돌아갈 수(롤백)도 있다. 또 내가 올리려는 파일이 누군가 편집한 내용과 충돌한다면, 서버에 업로드 할 때 경고 메시지가 발생된다.
GitHub란 파일이나 폴더를 저장해 두는 곳이다. 그런데 Git 저장소가 제공하는 좋은 점 중 하나는 파일이 변경 이력 별로 구분되어 저장된다는 점이다. 비슷한 파일이라도 실제 내용 일부 문구가 서로 다르면 다른 파일로 인식하기 때문에 파일을 변경 사항 별로 구분해 저장할 수 있다.
Jenkins이란?
Jenkins는 지속적 통합(continuous integration, CI)과 지속적 배포(continuous delivery, CD)를 위한 대표적인 도구이다. 빌드, 테스트, 배포 프로세스를 자동화하여 소프트웨어 품질과 개발 생산성을 높일 수 있다.
편리한 설정
웹 기반의 콘솔로 다양한 인증 기반과 결합이 가능하며 권한 관리 기능을 통해 안전한 빌드/배포 환경을 구축할 수 있다. 수많은 플러그인을 사용하여 자동화할 수 있어 반복되는 작업을 줄일 수 있다. 빌드/배포의 결과에 대해 통지 받을 수 있는 설정이 간편하고 다양한 채널을 통해 빠르게 피드백을 받을 수 있다.
안정적인 빌드/배포 환경
소스 버전 관리 툴(SVC)과 연동하여 코드 변경을 감지(Poll)하고, 자동화 테스트를 포함한 빌드를 수행하여 소프트웨어 품질을 향상시킬 수 있다. 자동화 테스트에는 코딩 표준 준수 여부 체크, 유닛 테스트, 통합 테스트 등을 설정할 수 있고 테스트 결과에 대한 피드백을 받아 잠재적인 오류를 사전에 예방할 수 있다. 빌드 결과물을 지속적으로 배포하도록 설정하여 개발 프로세스 전체를 자동화할 수 있다.
다양한 활용 및 손쉬운 확장
Jenkins는 많이 사용 되고 있는 오픈 소스 소프트웨어로 문서화가 잘 되어 있다. 빌드/배포 이외에도 스케쥴링을 이용한 배치 작업에도 활용되는 등 다양한 적용 사례들을 참고할 수 있다. 플러그 인을 직접 개발하여 기능을 확장하는 것도 가능하다. 네이버 클라우드 플랫폼에서 제공하는 다른 Dev Tools 상품들과도 쉽게 통합할 수 있다.
Git 설치
Git 설치
https://git-scm.com/download/win
Git - Downloading Package
Download for Windows Click here to download the latest (2.41.0) 32-bit version of Git for Windows. This is the most recent maintained build. It was released 11 days ago, on 2023-06-01. Other Git for Windows downloads Standalone Installer 32-bit Git for Win
git-scm.com
사이트에 접속해서 운영체제에 맞는 설치 파일을 받아 설치한다.
Github 회원가입
GitHub: Let’s build from here
GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...
github.com
Github 아이디가 없으면 회원가입을 한다.
Git
Git을 활용한 GitHub에 소스코드 Push
## GitBash 접속
# 테스트 용 폴더 생성 후 파일 생성.
mkdir git-test && cd $_
echo "Hello World" > README.txt
# Git 로컬 저장소를 생성, .git 디렉토리가 생성됨
git init
# 버전 관리를 위해 내 정보 설정
git config --global user.email "test@example.com"
git config --global user.name "kyounggu"
# 파일을 스테이지에 올리는 명령어, 스테이징 영역은 커밋할 준비가 된 변경 내용이 로컬 저장소에 기록되기 전에 대기하는 장소
git add README.txt
# Git 상태 확인
git status
# commit. 변경 사항을 로컬 저장소에 저장하는 명령어
git commit -m "add site"
# log 확인
git log




# README.txt 업데이트 후 git status 확인
echo "Aloha" >> README.txt
cat README.txt
git add README.txt
git status
# 변경사항 commit 후 git log 확인
git commit -m "add upadate"
git log


# commit hash의 시점으로 이동
git checkout [commit hash]
# 이전 시점으로 이동
git checkout -


GitHub 원격저장소 커밋

# git 리포지토리 연결
git remote add origin https://github.com/kyounggudev/test-dev
# 연결된 리포지토리의 master 브랜치에 push(업로드)
git push origin master








GitHub 원격저장소의 커밋을 로컬저장소에 내려받기

## 생성한 VM에서
# 자동완성 설치
yum install -y bash-completion
# git 설치
yum install -y git
# git 리포지토리 내려받기
git clone https://github.com/kyounggudev/test-dev.git
cd test-dev/
# 버전 관리를 위해 내 정보 설정
git config --global user.email "test@centos.com"
git config --global user.name "centos"
# README.txt 확인
cat README.txt
# 현재 경로의 모든 것을 add
git add .
# git status
# commit
git commit -m "add list"
# 로그 확인
git log
# master 브랜치에 push
git push origin master




원격저장소의 새로운 커밋을 로컬저장소에 갱신하기
# cat README.txt
# 리포지토리의 matser 브랜치 pull
git pull origin master
# cat README.txt

Git Lab
Git Lab 설치
# Git Lab 패키지 Set up
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
# Git Lab CE 설치 (아이피 입력)
EXTERNAL_URL="http://192.168.2.206" yum install -y gitlab-ce
# 패스워드 수정
cat /etc/gitlab/initial_root_password

# 웹 사이트 파일 업로드
git add .
git commit -m "change site"
git push origin master
Git Lab 접속
# gitlab이 설치한 인스턴스에 방화벽 설정
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
# git lab의 root 계정 패스워드 확인
cat /etc/gitlab/initial_root_password




Git Lab 새 프로젝트 생성



Git을 활용한 GitLab에 소스코드 Push
## git bash에서
# gitlab-test 폴더 생성 후 이동
cd
mkdir gitlab-test && cd $_


# init
git init
# 인적사항에 적힐 사용자 정보 입력
git config --global user.email "gitlab-test@example.com"
git config --global user.name "kyounggu"
# commit
git add .
git commit -m "new gitlab site"
GitLab 원격저장소 커밋

# 복사한 주소를 이용하여 Gitlab과 http 연결
git remote add origin http://192.168.2.206/root/my-dev.git
# Gitlab에 업로드
git push origin master


GitLab 원격저장소의 커밋을 로컬저장소에 내려받기

# 로컬 저장소(VM)에 복사한 주소로 내려받기
cd
git clone http://192.168.2.206/root/my-dev.git
# 처음엔 main 브랜치이므로 아무것도 없다. 업로드한 master 브랜치로 checkout
git checkout master
# 사용자 정보 입력
git config --global user.email "gitlab-test@example.com"
git config --global user.name "kyounggu"



# 웹 사이트 소스코드 수정
vi index.html
//
사진처럼 이름 변경
//
# add
git add index.html
# commit
git commit -m "add my-dev"
# push (gitlab 아이디 패스워드 입력)
git push origin master


원격저장소의 새로운 커밋을 로컬저장소에 갱신하기
## git bash에서
# 갱신 전 index.html 확인
vi index.html
# pull(갱신)
git pull origin master
# 갱신 후 index.html 확인
vi README.txt


원격 저장소 마이그레이션(Github에서 Gitlab으로 마이그레이션)

# github의 test-dev 리포지토리를 git-migration 폴더에 내려받기 ('--mirror': 리포지토리 복제)
cd
mkdir git-migration
git clone --mirror https://github.com/kyounggudev/test-dev.git git-migration
# 내려받은 리포지토리를 gitlab에 push
cd git-migration/
git push -uf http://192.168.2.206/root/my-gitlab.git --all

이렇게 리포지토리를 이동하는 것을 통해 원격 저장소에 migration을 할 수 있다.
Jenkins
Jenkins-server 인스턴스 생성



#!/bin/bash
timedatectl set-timezone Aisa/Seoult
yum install -y httpd git
systemctl enable --now httpd
cd /var/www/html
git clone https://github.com/kyounggudev/test-dev.git
mv test-dev/* .



젠킨스 설치
# root 계정으로 전환
sudo su -
# 시간
timedatectl set-timezone Asia/Seoul
# 업데이트
yum update -y
# 젠킨스 패키지 내려받기
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# 공식 주소인지 키를 이용해 확인
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
# 아마존 리눅스 전용 epel 설치 (퍼블릭하게 사용하기 위함.)
amazon-linux-extras install epel -y
# 자바 설치
amazon-linux-extras install -y java-openjdk11
# 젠킨스 설치
yum install -y jenkins
systemctl enable --now jenkins

젠킨스 접속
# 초기 패스워드 확인
cat /var/lib/jenkins/secrets/initialAdminPassword






젠킨스 대시보드









젠킨스에 깃허브 리포지토리 가져오기

# 실습에 사용할 리포지토리를 가져오기
mkdir git-migration
git clone --mirror https://github.com/hali-linux/hello-world.git git-migration
# 가져온 리포지토리를 자신의 Github에 Push
cd git-migration/
git push -uf [새로 생성한 자신의 리포지토리 주소].git --all










# 젠킨스 작업공간 확인
ls /var/lib/jenkins/workspace/

Maven 설치
(자바 기반 프로젝트의 빌드, 패키징, 의존성 관리 등을 자동화하기 위한 도구)
## 젠킨스 서버 CLI에서
# maven 설치
cd /opt
wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
tar -xvzf apache-maven-3.8.8-bin.tar.gz
mv apache-maven-3.8.8 maven
ls maven/bin
# 자바가 설치된 경로 확인
cd ~
find / -name java-11*
#
vi .bash_profile
// JAVA_HOME에 확인한 자바 설치 경로를 붙여넣기
M2_HOME=/opt/maven
M2=/opt/maven/bin
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.amzn2.0.1.x86_64
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:$JAVA_HOME:$M2_HOME:$M2
//
# 변경한 설정 적용
source .bash_profile
# 메이븐 명령어 사용 가능한지 확인
mvn -v












Tomcat 서버 설치


# 인스턴스 세팅
sudo su -
timedatectl set-timezone Asia/Seoul
yum update -y
hostnamectl set-hostname tomcat-server
# 자바 섳치
amazon-linux-extras install -y java-openjdk11
# Tomcat 설치
cd /opt
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz
tar -xvzf apache-tomcat-9.0.76.tar.gz
mv apache-tomcat-9.0.76 tomcat
# Tomcat 기동
cd tomcat/bin/
./startup.sh


## 권한을 허용하기 위해 다음 과정 진행
# 수정할 context 확인
cd /opt/tomcat
find / -name context.xml
# host-manger에 있는 context 수정
vi /opt/tomcat/webapps/host-manager/META-INF/context.xml
// 톰캣 터미널 안에서만 자기자신 허용을 주석 처리
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
//
# manager에 있는 context 수정
vi /opt/tomcat/webapps/manager/META-INF/context.xml
// 똑같이 주석 처리
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
//
# 셧 다운으로 종료하고 다시 시작해서 수정 사항 적용
cd bin/
./shutdown.sh
./startup.sh



# Tomcat 사용자 정보와 권한 수정
vi /opt/tomcat/conf/tomcat-users.xml
//
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="kosa0220" roles="manager-gui, manager-script, manager-jmx, manager-status"/>
<user username="deployer" password="kosa0220" roles="manager-script"/>
<user username="tomcat" password="kosa0220" roles="manager-gui"/>
//
# 링크를 걸어준다. (어디서든 사용 가능)
ln -s /opt/tomcat/bin/startup.sh /usr/local/bin/tomcatup
ln -s /opt/tomcat/bin/shutdown.sh /usr/local/bin/tomcatdown
# Tomcat 종료, 시작
tomcatdown
tomcatup



Tomcat와 Jenkins 통합











Git 소스 업데이트 (윈도우)
해당 페이지의 소스코드를 수정해본다.
# git에서 내려받기
mkdir deploy && cd $_
git clone https://github.com/kyounggudev/hello-world.git
# master 브랜치로 이동
git checkout master
# webapp의 index.jsp 파일 수정
cd hello-world/webapp/src/main/webapp/
vi index.jsp
//
"Thankyou, Happy Learning 2023!!!"를 원한느 문장으로 수정
//
# 수정한 소스 코드 push
git add index.jsp
git commit -m "Hello World!!!"
git push origin master



자동화

# 다시 index.jsp를 수정
vi index.jsp
//
원하는 문장으로 수정
//
# Github에 push
git add index.jsp
git commit -m "Poll SCM Test"
git push origin master


이제 예시 페이지를 교체해본다.
# 잠시 백업
mv index.jsp index.jsp.bak

# Github에 push
git add .
git commit -m "two-rabbit"
git push origin master

'메가존 클라우드 2기 교육 > 실무 특화' 카테고리의 다른 글
Kubernetes - Amazon EKS (0) | 2023.06.12 |
---|---|
Kubernetes - GCP에서의 사용 (0) | 2023.06.08 |
Kubernetes - 모니터링(Prometheus, Grafana), 오토스케일링(HPA) (0) | 2023.06.08 |
Kubernetes - 스케줄링(taint & toleration, cordon , drain), (0) | 2023.06.07 |
Kubernetes - NFS, configMap, namepsace, ResourceQuota (0) | 2023.06.05 |