[1] ## 젠킨스 서버 생성
- 젠킨스 설치 스크립트 참고 (우분투)
https://github.com/vikash-kumar01/installation_scripts/blob/master/jenkins.sh
#!/bin/bash
sudo apt update -y
sudo apt upgrade -y
sudo apt install openjdk-17-jre -y
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update -y
sudo apt-get install jenkins -y
- vi jes.sh 파일 생성
- sh jes.sh 실행으로 젠킨스 설치
[2] ## 넥서스 서버 생성 (15분) - 기본 8081 포트 사용
- 넥서스 설치 스크립트 확인
apt-get update -y
echo "Install Java"
apt-get install openjdk-8-jdk -y
java -version
echo "Install Nexus"
useradd -M -d /opt/nexus -s /bin/bash -r nexus
echo "nexus ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/nexus
mkdir /opt/nexus
wget https://sonatype-download.global.ssl.fastly.net/repository/downloads-prod-group/3/nexus-3.29.2-02-unix.tar.gz
tar xzf nexus-3.29.2-02-unix.tar.gz -C /opt/nexus --strip-components=1
chown -R nexus:nexus /opt/nexus
nano /opt/nexus/bin/nexus.vmoptions
```
https://www.howtoforge.com/how-to-install-and-configure-nexus-repository-manager-on-ubuntu-20-04/
```
```
docker run -d -p 8081:8081 --name nexus sonatype/nexus3
```
- 넥서스 nexus.vmoptions 설정 수정 ( .. --> . 하나로 변경)
- 실행자 nexus 등록
- nexus 유저로 실행
[3] ## 소나큐브 설치를 컨테이너로 구동 --> 젠킨스 서버에 도커 설치 (22분)
#!/bin/bash
sudo apt update -y
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" -y
sudo apt update -y
apt-cache policy docker-ce -y
sudo apt install docker-ce -y
#sudo systemctl status docker
sudo chmod 777 /var/run/docker.sock
- 도커 상태 확인 & docker info 확인
[4] ## 넥서스 리포지토리 설정 (23분)
1) Create repository 클릭 --> maven2 (hosted) 선택
- Name : demoapp-release
- Version policy : Release
- Layout policy : Strict
- Deployment policy : Disable redeploy
2) 스냅샷 저장을 위한 저장소 추가 생성 - Create repository 클릭 --> maven2 (hosted) 선택
- Name : demoapp-snapshot
- Version ploicy : Snapshot
[5] ## 젠킨스 서버에서 컨테이너로 소나큐브 설치
# INSTALL SONARQUBE
docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube
- docker container ls 로 확인
[6] ## 테라폼으로 인프라 구성 (29분)
[7] ## 소나큐브 설정 (30분) --> 소나큐브는 미사용으로 중간에 생략
1) 젠킨스와 웹훅 설정
- 젠킨스 내부IP 등록
2) 유저 시크릿 설정 - Security --> Users --> 토큰 설정
[8] ## APP 소스가 있는 Github에서 배포할 yml 파일 생성 (37분)
1) deployment.yml 생성
kind: Deployment
apiVersion: apps/v1
metadata:
name: mydeployment
spec:
replicas: 2
selector:
matchLabels:
app: myspringbootapp
template:
metadata:
labels:
app: myspringbootapp
spec:
containers:
- name: myspringbootapp
image: vikashashoke/mydemoapplication:latest
imagePullPolicy: Always
ports:
- containerPort: 9099
2) service.yml 생성
kind: Service
apiVersion: v1
metadata:
name: myservice
label:
app: myspringbootapp
spec:
selector:
app: myspringbootapp
type: LoadBalancer
ports:
- nodePort: 30036
port: 80
targetPort: 9099
3) jenkins-cd 생성
pipeline{
agent any
stages{
stage('git checkout'){
steps{
git branch: 'main', url: 'https://github.com/dhrbduf/demo-counter-app.git'
}
}
}
}
- 생성한 Git 소스 푸쉬방법 (작성한 jenkins-cd 파일 업로드 되었는지 확인)
: git add .
: git commit -m "git checkout"
: git push origin
[9] ## 젠킨스 서버에서 파이프라인 생성 (43분)
- demoapp-cd (EKS 배포 테스트용)
: jenkins-cd 스크립트 연동
1) 초기 빌드 성공 (git checkout)
2) 2차 빌드 성공 (git checkout - 파라미터 적용)
pipeline{
agent any
parameters{
choice(name: 'action', choices: 'create\ndestory\ndestoryekscluster', description: 'Create/Update or destory the eks cluster')
}
stages{
stage('git checkout'){
steps{
git branch: 'main', url: 'https://github.com/dhrbduf/demo-counter-app.git'
}
}
}
}
3) 3차 빌드 성공 (git checkout - 파라미터 적용 - EKS 연동 설정)
- aws --version
- aws sts get-caller-identity
- aws eks --region region update-kubeconfig --name cluster_name
3-1) 젠킨스에 EKS용 자격증명 생성
- aws_access_key_id
- aws_secret_access_key
3-2) jenkins-cd 파일에 EKS 연동설정 적용
pipeline{
agent any
parameters{
choice(name: 'action', choices: 'create\ndestory\ndestoryekscluster', description: 'Create/Update or destory the eks cluster')
string(name: 'cluster', defaultValue: 'OKY-DEV-EKS-Cluster', description: 'EKS Cluster Name')
string(name: 'region', defaultValue: 'ap-northeast-2', description: 'EKS Cluster Region')
}
environment{
ACCESS_KEY = credentials('aws_access_key_id')
SECRET_KEY = credentials('aws_secret_access_key')
}
stages{
stage('git checkout'){
steps{
git branch: 'main', url: 'https://github.com/dhrbduf/demo-counter-app.git'
}
}
stage('EKS Connect'){
steps{
sh """
aws configure set aws_access_key_id "$ACCESS_KEY"
aws configure set aws_secret_access_key "$SECRET_KEY"
aws configure set region ""
aws eks --region ${params.region} update-kubeconfig --name ${params.cluster}
""";
}
}
}
}
4) 4차 빌드 성공 (git checkout - 파라미터 적용 - EKS 연동 설정 - EKS Deployment & Service)
4-1) kubectl 실행 파일 설정 필요 (에러 발생)
- kubectl 실행파일 설치 (수동으로 Install Kubectl utility 만 설치)
https://github.com/vikash-kumar01/installation_scripts/blob/master/minikube.sh
#!/bin/bash
sudo apt-get update -y
sudo apt-get install curl wget apt-transport-https virtualbox virtualbox-ext-pack -y
echo "1st install docker"
sudo apt update && apt -y install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo chmod 666 /var/run/docker.sock
echo "Apply updates"
sudo apt update -y
sudo apt upgrade -y
echo " Download Minikube Binary"
wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo cp minikube-linux-amd64 /usr/local/bin/minikube
sudo chmod +x /usr/local/bin/minikube
minikube version
echo "Install Kubectl utility"
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
kubectl version -o yaml
echo "Start the minikube"
minikube start
minikube status
## 에러 발생시 다운그레이드 할것!!
error: exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha1" 버전 이슈
https://blog.leedoing.com/239
4-2) service.yml 파일 오타 (kind: kind: --> kind:)
4-3) service.yml 파일 오타 (label --> labels)
error: error validating "service.yml": error validating data: ValidationError(Service.metadata): unknown field "label" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta; if you choose to ignore these errors, turn validation off with --validate=false
- kubectl get all (Deployment & Service 까지 성공)
4) 5차 빌드 성공 (git checkout - 파라미터 적용 - EKS 연동 설정 - EKS Deployment & Service - EKS 삭제)
pipeline{
agent any
parameters{
choice(name: 'action', choices: 'create\ndestory\ndestoryekscluster', description: 'Create/Update or destory the eks cluster')
string(name: 'cluster', defaultValue: 'OKY-DEV-EKS-Cluster', description: 'EKS Cluster Name')
string(name: 'region', defaultValue: 'ap-northeast-2', description: 'EKS Cluster Region')
}
environment{
ACCESS_KEY = credentials('aws_access_key_id')
SECRET_KEY = credentials('aws_secret_access_key')
}
stages{
stage('git checkout'){
steps{
git branch: 'main', url: 'https://github.com/dhrbduf/demo-counter-app.git'
}
}
stage('EKS Connect'){
steps{
sh """
aws configure set aws_access_key_id "$ACCESS_KEY"
aws configure set aws_secret_access_key "$SECRET_KEY"
aws configure set region ""
aws eks --region ${params.region} update-kubeconfig --name ${params.cluster}
""";
}
}
stage('EKS Deployments'){
when { expression { params.action == 'create'}}
steps{
script{
def apply = false
try{
input message: 'Please Confirm the apply to initiate the deployments', ok: 'Ready to apply the config'
apply = true
}
catch(err){
apply = false
CurrentBuild.result= 'UNSTABLE'
}
if(apply){
sh """
kubectl apply -f .
""";
}
}
}
}
stage('Delete Deployments'){
when { expression { params.action == 'destory'}}
steps{
script{
def destory = false
try{
input message: 'Please Confirm the destory to delete the deployments', ok: 'Ready to destory the config'
destory = true
}
catch(err){
destory = false
CurrentBuild.result= 'UNSTABLE'
}
if(destory){
sh """
kubectl delete -f .
""";
}
}
}
}
}
}
https://www.youtube.com/watch?v=MpRd_nJEx_8
https://github.com/vikash-kumar01/demo-counter-app
댓글