[1] 젠킨스

2024. 11. 22. 16:42젠킨스

 

1. 젠킨스 도커 실행

2. VM 내부로 들어가자

3. password입력

 

 

- 젠킨스 

블럭이 나눠져있따. 

 

각 스테이지별로 블럭을 정의해서 시킨다. 

스테이지에 이름을 정의한것이 블럭으로 생성된다. ( 이 블럭하나하나가 스테이지)

- 상태체크, 코드 품질검사, 보안 취약성 검사, 워크스페이스 준비, 베이스 이미지(도커 레지스트리에서 컨테이너를 끌고오는것), 도커 이미지 빌드 ssh가 있다. ( 젠킨스가 특정 타겟서비스에 들어와서 도커를 띄우는것) , 

 

서버하나에 젠킨스 설치 > 서버2에다가 젠킨스 스크립트를 이용해서 원하는 명령어를 접속해서 실행을 시켜나가는것.

- 특정 개발 자체가 발생한다. 우리가 저번에들었던 브랜치 전략에 준해서 데브마스터에 머지가 되었따 > 데브 젠킨스 가 있는것처럼 > 브랜치 별로 젠킨스 파일을 가져다가 실행

 

 

크레덴셜을 만들수 있다. 

ssh를 들어갈때 paswwrod로 들어가는 경우도 있지만 rsa private key같은ㄱ것으로 사용할 수 있다. 

> AWS는 이런것들을 같이 생성해준다. 

> 이정보를  private KEy에 입력을 해준다. 

> RSA패킷에 private, public key두개가 생성이 된다. 입력은 private key

>> ssh로 다른 서버에 접근하기위해 사용

로컬에서 사용할거면 쓸 필요가 없지만 다른서버에 배포해야하기때문에 이 기능을 사용한다. 

 

파이프라인 - 젠킨스 형식은 Groovy라고 한다. 

jenkins pipeline example github을 참고하자

 

- 배포할때는 master기준으로 한다. ( -

- tar : 압축

- scp -> 파일을 전송

/home/ubuntu > 깃프로젝트 압축파일이 서버2로 배포하고자하는 파일을 옮긴다. 

 

정리

[Jenkins]

- 깃에서 레포를 끌고와서 젠킨스가 aws로 옮겨준다 ( 다른서버)

-> 베포를 한다면 서버1의 젠킨스에서 파이프라인을 가져와야한다. ( 파일만 옮기면 안되고 컨테이너를 띄워야 한다. )

 

도커 컴포즈 : 컨테이너로 여러가지 이뤄진것처럼 컨트롤타워로 동시에 한번에 실행시키고 다운시키고 하는것

 

docker run, docker compose up -> git action은 선택(운영, 개발이 분리되어있기 때문에) 

> 업데이트 하자마자 치면 오류가 생기기 떄문에 >  깃액션을 뺴고젠킨스 파이프라는 것을 누르면 제 3자가 운영을 눌렀을때 오류가 생겨도 함부러할 수 없게

 

 

 

  #build/dev-Jenkinsfile
  pipeline{
  agent any
  
  environment {
  //Prepare Workspace in Target Server
  JENKINS_PRJ_NAME = "app-pipeline"
  
  //Git Project
  GIT_MAIN_NAME = "example"
  GIT_PRJ_NAME = "example_front"
  GIT_BRANCH_NAME = "devmaster"
  
  NODE_BASE_IMAGE = "node:18-alpine"
  NGINX_BASE_IMAGE = "nginx:latest"
  IMAGE_TAG = "3.8-slim-buster"
  
  SSH_USER = "ubuntu"
  SSH_HOST = "ec2-15-148-90-78.ap-northeast-3.compute.amazonaws.com"
}
  
  stages {
  
  stage('Clone Source in Jenkins') {
  steps {
  script {
  echo "--------------------"
  echo "[Clone Source in Jenkins]"
  echo "--------------------"
  
  sh "git clone --branch ${GIT_BRANCH_NAME} https://github.com/${GIT_MAIN_NAME}/${GIT_PRJ_NAME}.git"
}
}
}
  
  stage('Prepare Workspace in Target Server') {
  steps {
  echo "--------------------"
  echo "[Prepare Workspace in Target Server]"
  echo "--------------------"
  
  sh 'echo "Current path: $(pwd)"'
  sh "ls -l"
  sh "rm -rf tmp"
  sh "echo '--------------------'"
  sh "tar -cvf ${GIT_PRJ_NAME}.tar ${GIT_PRJ_NAME}"
  sh "rm -rf ${GIT_PRJ_NAME} && ls -l"
  sh "echo '--------------------'"
  
  script {
  sshagent(credentials: [ 'jenkins_ssh_key' ]) {
                          sh """
                          scp -o StrictHostKeyChecking=no ${GIT_PRJ_NAME}.tar ${SSH_USER}@${SSH_HOST}:/home/ubuntu
                          """

                          sh """
                          ssh -o StrictHostKeyChecking=no ${SSH_USER}@${SSH_HOST} '
                          tar -xvf ${GIT_PRJ_NAME}.tar'
                          """
  }
  }
  }
  }
  
  stage('Pull Base Images') {
  steps {
  script {
  echo "--------------------"
  echo "[Pull Base Images]"
  echo "--------------------"
  
  sshagent(credentials: [ 'jenkins_ssh_key' ]) {
                          sh """#!/bin/sh
                          ssh -o StrictHostKeyChecking=no ${SSH_USER}@${SSH_HOST} '
                          base_images=()

                          for i in "${NGINX_BASE_IMAGE}" "${NODE_BASE_IMAGE}"; do
                          base_images+=("\$i")
                          done

                          for image in "\${base_images[@]}"; do
                          sudo docker pull "\$image"
                          done'
                          """
  }
  }
  }
  }
  
  stage('Build & Deploy') {
  steps {
  script {
  echo "--------------------"
  echo "[Build & Deploy]"
  echo "--------------------"
  
  sshagent(credentials: [ 'jenkins_ssh_key' ]) {
                          sh """
                          ssh -o StrictHostKeyChecking=no ${SSH_USER}@${SSH_HOST} '
                          cd ${GIT_PRJ_NAME} && sudo docker-compose up -d'
                          """

}
}
}
}
}
post {
always {
cleanWs()
}
}
}

 

 

- pipeline from SCM

> Github,

> Credentials > 키 입력 : 깃과 젠킨스가 통신하기 위한 키

- Branch Specifier

> dev Jenkins > > 젠킨스 파이프라인이 수정이되면 젠킨스 폴더 안에있는 젠킨스 스크립트를 끌어와서 자동업데이트를 해준다. 

- ScriptPath 에 /  */build/dev-Jenkinsfile  > 스크립트 경로

 

- public branch를 사용해야함

- private branch 이면 안된다. 

> 만약 private를 사용하고싶으면 따로설정을 해야한다.

>> credential Id를 설정해주면된다. 

>>> 즉 특정 plugin이 필요할거고 ssh Agent가 그중 하나일 수도 있다.

>>>> 이걸해야 플러그인을 사용할 수 있다 .( 라이브러리라고 보면됨 )

 

 

rsa.pub ~/.ss ... > public key 입력

credential -> private - pricate key 입력