https://realyun99.tistory.com/entry/CICD-EC2-CodePipeline-Test-1

 

[CI/CD] EC2 CodePipeline Test -1

Spring project 생성 * 환경: jdk-21, Gradle, vscode 활용 vscode에서 ctrl + shift + p (Show all commands) 단축키를 누르고 spring Initializr 를 검색합니다. 원하는 대로 선택 후 프로젝트 생성하면 됩니다. 테스트 용도

realyun99.tistory.com

https://realyun99.tistory.com/entry/CICD-EC2-CodePipeline-Test-2

 

[CI/CD] EC2 CodePipeline Test -2

이전 포스팅: https://realyun99.tistory.com/entry/CICD-EC2-CodePipeline-Test-1 [CI/CD] EC2 CodePipeline Test -1 Spring project 생성 * 환경: jdk-21, Gradle, vscode 활용 vscode에서 ctrl + shift + p (Show all commands) 단축키를 누르고 sprin

realyun99.tistory.com

 

지금까지 수동 배포를 해보고 수동을 자동화 하는 방법에 대해 알아 봤습니다. 2번 포스팅에서 GithubAction을 활용했다면 이번 포스팅에선 CodeSeries를 사용해 CodePipeline 구성을 해보겠습니다.

* github, codebuild, codedeploy, codepipeline 활용


프로젝트 소스의 경우 1번 포스팅에서 진행했던 spring boot 를 활용합니다.

 

buildspec.yml 작성

version: 0.2
phases:
  install:
    runtime-versions:
      java: corretto21 # Java 21 버전
  build:
    commands:
      - echo Build Starting on `date`
      - chmod +x ./gradlew
      - ./gradlew build
  post_build:
    commands:
      - echo $(basename ./build/libs/*.jar)
      - pwd
artifacts:
  files:
    - appspec.yml
    - build/libs/*.jar
    - scripts/**
  discard-paths: yes

cache:
  paths:
    - '/root/.gradle/caches/**/*'

프로젝트 폴더의 최상단에 buildspec.yml을 넣고 위 코드를 입력합니다.

 

 

appspec.yml 작성

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ec2-user/app/
    overwrite: yes
file_exists_behavior: OVERWRITE

# ApplicationStart 단계에서 deploy.sh를 실행시키도록 합니다.
hooks: # CodeDeploy배포 단계에서 실행할 명령어를 지정합니다.
  ApplicationStart: # deploy.sh를 root권한으로 실행합니다.
    - location: deploy.sh
      timeout: 300 # 스크립트 실행 300초 이상 수행되면 실패가 됩니다.
      runas: root

프로젝트 폴더의 최상단에 appspec.yml을 넣고 위 코드를 입력합니다.

 

 

deploy.sh 작성

#!/bin/bash
#BUILD_JAR=$(ls /home/ec2-user/app/build/libs/*.jar)
BUILD_JAR=$(ls /home/ec2-user/app/*.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo "> build cicd-test: $JAR_NAME" >> /home/ec2-user/app/deploy.log

echo "> build 파일 복사" >> /home/ec2-user/app/deploy.log
DEPLOY_PATH=/home/ec2-user/
cp $BUILD_JAR $DEPLOY_PATH

echo "> cicd-test.jar 교체"
CP_JAR_PATH=$DEPLOY_PATH$JAR_NAME
APPLICATION_JAR_NAME=cicd-test.jar
APPLICATION_JAR=$DEPLOY_PATH$APPLICATION_JAR_NAME

ln -Tfs $CP_JAR_PATH $APPLICATION_JAR

echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ec2-user/app/deploy.log
CURRENT_PID=$(pgrep -f $APPLICATION_JAR_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ec2-user/app/deploy.log
else
  echo "> kill -15 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

echo "> $APPLICATION_JAR 배포" >> /home/ec2-user/app/deploy.log
nohup java -jar $APPLICATION_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/app/deploy_err.log &

프로젝트에 scripts 폴더를 생성하고 위 코드를 넣어줍니다.

 

 

CodePipeline 구성

나머진 디폴트로 설정합니다. (아티팩트도 기본 설정으로)

 

소스는 GitHub을 연결해줍니다. 

 

소스 트리거는 본인이 push하는 브랜치로 설정합니다.

 

빌드는 CodeBuild를 선택하고 프로젝트를 생성합니다.

 

새 창이 열리며 위와 같이 build 프로젝트 생성을 시작합니다.

 

설정이 끝났으면 CodePipeline으로 계속 버튼을 누르고 이어 진행합니다.

 

다음 버튼 클릭해 배포 단계 구성 합니다.

 

CodeDeploy의 경우 2번 포스팅에서 생성했던 애플리케이션에 새로운 배포 그룹을 만들어 진행합니다.

프로젝트를 배포할 인스턴스 이름 태그를 걸어줍니다.

로드밸런싱 비활성화를 누른 뒤 배포 그룹 생성합니다.

 

2번 포스팅에서 생성했던 애플리케이션과 위에서 생성했던 배포 그룹을 선택합니다.

검토 후 파이프라인을 생성합니다.

 

 

❗ codedeloy agent 에러 확인 ❗

 cd /var/log/aws/codedeploy-agent
  cat codedeploy-agent.log

 

 

appspec.yml 파일에 아래 코드 추가

file_exists_behavior: OVERWRITE

 

❗ SNAPSHOT-plain.jar 와 SNAPSHOT.jar 중 SNAPSHOT.jar만 실행 가능한 아카이브 ❗

SNAPSHOT-plain.jar를 생성하지 못하게 아래 코드를 build.gradle에 추가해준다.

  jar {
      enabled = false
  }

'Toy Project' 카테고리의 다른 글

[CI/CD] EC2 CodePipeline Test -2  (1) 2024.03.19
[CI/CD] EC2 CodePipeline Test -1  (0) 2024.03.18

이전 포스팅: https://realyun99.tistory.com/entry/CICD-EC2-CodePipeline-Test-1

 

[CI/CD] EC2 CodePipeline Test -1

Spring project 생성 * 환경: jdk-21, Gradle, vscode 활용 vscode에서 ctrl + shift + p (Show all commands) 단축키를 누르고 spring Initializr 를 검색합니다. 원하는 대로 선택 후 프로젝트 생성하면 됩니다. 테스트 용도

realyun99.tistory.com

 

이전 포스팅에서 수동으로 배포하는 방법에 대해 알아보았다면, 이번 포스팅에선 해당 수동 배포를 자동화하는 방법에 대해 알아보겠습니다.

* github, github action, codedeploy 활용


Github Action 설정 (CI)

yaml 파일로 설정하기 위해 해당 네모 부분 클릭해 들어갑니다.

 

# workflow의 이름
name: CI

# 해당 workflow가 언제 실행될 것인지에 대한 트리거를 지정
on:
  push:
    branches: [ master ] # main branch로 push 될 때 실행됩니다.
  pull_request:
    branches: [ master ]  # main branch로 pull request될 때 실행됩니다.

# workflow는 한개 이상의 job을 가지며, 각 job은 여러 step에 따라 단계를 나눌 수 있습니다.
jobs:
  build:
    name: CI
    # 해당 jobs에서 아래의 steps들이 어떠한 환경에서 실행될 것인지를 지정합니다.
    runs-on: ubuntu-latest

    steps:
     # 작업에서 액세스할 수 있도록 $GITHUB_WORKSPACE에서 저장소를 체크아웃합니다.
      - uses: actions/checkout@v2
      - name: Set up JDK 21
        uses: actions/setup-java@v2
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: sudo chmod +x ./gradlew
        shell: bash
      
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

위 코드를 넣어 줍니다.

 

이후 로컬 프로젝트에서 git pull 로 가져와야합니다!!

 

 

AWS IAM User 생성(액세스 키 발급)

S3FullAccess, CodeDeployFullAccess 관련 정책을 넣은 사용자를 생성합니다.

생성된 사용자에서 액세스 키를 생성해 다운로드합니다.

 

 

S3 버킷 생성

zip 파일을 담을 프라이빗 버킷을 생성해줍니다.

 

 

Github Action secrets 추가

위에서 생성했던 액세스키와 리전을 넣어줍니다.

 

 

deploy.sh 파일 생성

#!/bin/bash
BUILD_JAR=$(ls /home/ec2-user/action/build/libs/*-SNAPSHOT.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo "> build cicd-test: $JAR_NAME" >> /home/ec2-user/action/deploy.log

echo "> build 파일 복사" >> /home/ec2-user/action/deploy.log
DEPLOY_PATH=/home/ec2-user/action/
cp $BUILD_JAR $DEPLOY_PATH

echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ec2-user/action/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ec2-user/action/deploy.log
else
  echo "> kill -15 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포"    >> /home/ec2-user/action/deploy.log
nohup java -jar $DEPLOY_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/action/deploy_err.log &

위 스크립트를 프로젝트 폴더에 scripts 폴더 생성 후 그 안에 넣습니다.

 

그 후 github에 push 합니다.

 

 

Github Action 설정 (CD)

.github/workflows 폴더 안에 cd.yaml 파일을 생성하고 아래 코드를 넣어주세요.

# workflow의 이름
name: CD

# 해당 workflow가 언제 실행될 것인지에 대한 트리거를 지정
on:
  push:
    branches: [ master ] # master branch로 push 될 때 실행됩니다.

# 해당 yml 내에서 사용할 key - value
env:
  S3_BUCKET_NAME: realyun-cicd-test
  PROJECT_NAME: cicd-test
  
# workflow는 한개 이상의 job을 가지며, 각 job은 여러 step에 따라 단계를 나눌 수 있습니다.
jobs:
  build:
    name: CD
    # 해당 jobs에서 아래의 steps들이 어떠한 환경에서 실행될 것인지를 지정합니다.
    runs-on: ubuntu-latest

    steps:
     # 작업에서 액세스할 수 있도록 $GITHUB_WORKSPACE에서 저장소를 체크아웃합니다.
      - uses: actions/checkout@v2
      - name: Set up JDK 21
        uses: actions/setup-java@v2
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: sudo chmod +x ./gradlew
        shell: bash
      
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash
        
      - name: Make zip file
        run: zip -r ./$GITHUB_SHA.zip .
        shell: bash

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
          
      # script files 복사
      - name: Copy script
        run: cp ./scripts/*.sh ./deploy
      
      # S3에 업로드
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip

 

성공하면 버킷에 zip 파일이 담긴 것을 확인할 수 있습니다.

 

 

EC2 역할 추가

EC2에 적용할 CodeDeploy role을 만들어 줍니다.

 

IAM 역할 수정을 클릭해 위에서 생성했던 role을 적용합니다. (인스턴스 재부팅 해야 적용됨!)

 

 

EC2에 CodeDeploy agent 설치

aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
chmod +x ./install 
sudo ./install auto
sudo service codedeploy-agent status

# ruby 에러 시
sudo yum install ruby

위 이미지처럼 running 메시지를 확인하면 잘 돌아가고 있음을 알 수 있습니다.

 

 

CodeDeploy 권한 추가 및 애플리케이션 생성

EC2에 권한을 추가한 것 처럼 CodeDeploy에도 EC2에 접근할 수 있는 권한을 생성합니다.

 

애플리케이션 생성
배포그룹 생성

위에서 CodeDeploy를 위해 생성했던 역할을 선택한 뒤 EC2 인스턴스로 구성해주면 됩니다.

(로드밸런싱은 비활성화로 진행)

 

version: 0.0
os: linux
# S3에 있는 zip 파일이 EC2에 배포될 위치를 지정
files:
  - source: / # CodeDeploy에서 전달해 준 파일 중 destination으로 이동시킬 대상을 루트로 지정(전체파일)
    destination: /home/ec2-user/action/ # source에서 지정된 파일을 받을 위치, 이후 jar를 실행하는 등은 destination에서 옮긴 파일들로 진행
    overwrite: yes

permissions: # CodeDeploy에서 EC2서버로 넘겨준 파일들을 모두 ec2-user권한을 갖도록 합니다.
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

# ApplicationStart 단계에서 deploy.sh를 실행시키도록 합
hooks: # CodeDeploy배포 단계에서 실행할 명령어를 지정합니다.
  ApplicationStart: # deploy.sh를 ec2-user권한으로 실행합니다.
    - location: scripts/deploy.sh
      timeout: 60 # 스크립트 실행 60초 이상 수행되면 실패가 됩니다.
      runas: ec2-user

codedeploy를 위한 appspec.yml 파일을 프로젝트의 최상단에 넣어줍니다.

 

 

Github Action(CD) deploy 추가

      # Deploy
      - name: Deploy
        run: |
          aws deploy create-deployment \
          --application-name realyun-ec2-cicd-test \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ec2-cicd-test \
          --file-exists-behavior OVERWRITE \
          --s3-location bucket=realyun-cicd-test,bundleType=zip,key=cicd-test/$GITHUB_SHA.zip \
          --region ap-northeast-2 \

위 코드들을 cd.yaml에 추가하면 끝이 납니다!!

 

 

 

위에서 사용했던 파일들은 위와 같이 저장되어 있어야 합니다.

(* github과 동기화 확인하기!!)

'Toy Project' 카테고리의 다른 글

[CI/CD] EC2 CodePipeline Test -3  (0) 2024.03.25
[CI/CD] EC2 CodePipeline Test -1  (0) 2024.03.18

Spring project 생성

* 환경: jdk-21, Gradle, vscode 활용

 

vscode에서 ctrl + shift + p (Show all commands) 단축키를 누르고 spring Initializr 를 검색합니다.

원하는 대로 선택 후 프로젝트 생성하면 됩니다.

 

CICD-Test/src/main/java/com/example/cicdtest/resoures 아래 static 폴더 생성 후 index.html 추가

테스트 용도의 간단한 페이지를 하나 생성합니다. (! + enter 치면 기본 html 틀 코드 생성됨)

cd <project-folder>

./gradlew
./gradlew build
./gradlew bootRun

vscode의 bash terminal 위에서 해당 명령어들을 입력해 확인합니다. (http://localhost:8080)

 

해당 프로젝트를 github에 올립니다.

cd <project-folder>

git config --global user.email "~~~"
git init

git add .
git status
git commit -m "~~~"

git remote add origin <github-주소>
git push origin master

 

배포할 EC2 인스턴스 생성

원하는 인스턴스 유형과 키페어, 네트워크 설정(퍼블릭) 후 인스턴스를 생성합니다.

(보안그룹의 경우 ssh(내 IP), 8080(0.0.0.0/0) ,http(0.0.0.0/0) 열어주기)

 

 

수동 배포

아래 명령어들을 EC2 인스턴스 ssh 접속 후 차례로 입력합니다.

sudo yum install git

sudo yum install java-21-amazon-corretto
java -version

sudo timedatectl set-timezone Asia/Seoul

mkdir app
cd ~/app
git clone https://github.com/realyun99/cicd-test.git
cd cicd-test

# gradle clean build
sudo chmod +x gradlew
sudo ./gradlew build

cd build/libs/
java -jar cicd-test-0.0.1-SNAPSHOT.jar

nohup java -jar cicd-test-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &
tail -f log.out
tail -f err.out

 

잘 설정되었는지 http://<ec2-public-ip>:8080 으로 확인합니다.

 

현재 수동 배포의 명령어들을 스크립트로 짜보려고 합니다.

 

배포 스크립트 생성

위에서 git clone을 받았던 /app/git 폴더로 들어가 deploy.sh 파일을 생성한 후 아래의 스크립트를 넣어줍니다.

#!/bin/bash

REPOSITORY=/home/ec2-user/app
cd $REPOSITORY/cicd-test/

echo "> Git Pull"
git pull

echo "> 프로젝트 Build 시작"
./gradlew build

echo "> Build 파일 복사"
cp ./build/libs/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f cicd-test)

echo "$CURRENT_PID"

if [ -z $CURRENT_PID ]; then
    echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -2 $CURRENT_PID"
    kill -9 $CURRENT_PID
    sleep 5
fi

echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls $REPOSITORY/ |grep 'cicd-test' | tail -n 1)

echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME &

 

아래의 명령어를 통해 스크립트를 실행합니다.

cd /app/git/cicd-test
sudo chmod +x gradlew

cd /app/git
sudo chmod 755 ./deploy.sh
./deploy.sh

여기까지 다 적용했다면 현재까지 구현된 기능은 아래와 같습니다.

1) 코드 수정 후 git push

2) ec2 접속 후 deploy.sh 실행 → 코드 배포

'Toy Project' 카테고리의 다른 글

[CI/CD] EC2 CodePipeline Test -3  (0) 2024.03.25
[CI/CD] EC2 CodePipeline Test -2  (1) 2024.03.19

Slack 연결

  • 목적: ChatOps
  • slack 채널 생성(무료플랜)

  • Jenkins Plugin 설치

slack notification 플러그인 설치

  • slack 앱 추가

Jenkins CI 추가

  • Jenkins에 slack 연결

자격 증명 추가(secret text로)
slack 자격증명 확인

  • 연결 확인

저장 후 빌드 시작
알림 확인

# Jenkinsfile

node {

  // job
  try {
    stage('build') {
      println('so far so good...')
    }
    stage('test') {
      println('A test has failed!')
      sh 'exit 1'
    }
  } catch(e) {
    // mark build as failed
    currentBuild.result = "FAILURE";

    // send slack notification
    slackSend (color: '#FF0000', message: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")

    // throw the error
    throw e;
  }
}

Sonarqube 연결

  • docker-compose 활용하여 Sonarqube 설치
mkdir jenkins 
cd jenkins
vi docker-compse.yml
  
# docker compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

docker-compse up -d
#docker-compose.yml
version: '2'
services:
  jenkins:
    image: jenkins-docker:latest
    ports:
      - "8080:8080"
      - "50000:50000"
    networks:
      - jenkins
    volumes:
      - /var/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
  postgres:
    image: postgres:9.6
    networks:
      - jenkins
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonarpasswd
    volumes:
      - /var/postgres-data:/var/lib/postgresql/data
  sonarqube:
    image: sonarqube:lts
    ports:
      - "9000:9000"
      - "9092:9092"
    networks:
      - jenkins
    environment:
      SONARQUBE_JDBC_USERNAME: sonar
      SONARQUBE_JDBC_PASSWORD: sonarpasswd
      SONARQUBE_JDBC_URL: "jdbc:postgresql://postgres:5432/sonar"
    depends_on:
      - postgres

networks:
  jenkins:
  • 인스턴스 9000번 포트 열어주고 확인해보자 (소나큐브 설치 완료되었는지 확인)

  • Jenkins pipeline을 통해 Sonarqube 통합
  • Sonarqube Scanner for Jenkins 플러그인 설치
    • 이후 Jenkinsfile에 코드 넣어두면 된다! (sonar-scanner 부분)
node {
    def myGradleContainer = docker.image('gradle:jdk8-alpine')
    myGradleContainer.pull()

    stage('prep') {
        git url: 'https://github.com/wardviaene/gs-gradle.git'
    }

    stage('build') {
      myGradleContainer.inside("-v ${env.HOME}/.gradle:/home/gradle/.gradle") {
        sh 'cd complete && /opt/gradle/bin/gradle build'
      }
    }

    stage('sonar-scanner') {
      def sonarqubeScannerHome = tool name: 'sonar', type: 'hudson.plugins.sonar.SonarRunnerInstallation'
      withCredentials([string(credentialsId: 'sonar', variable: 'sonarLogin')]) {
        sh "${sonarqubeScannerHome}/bin/sonar-scanner -e -Dsonar.host.url=http://sonarqube:9000 -Dsonar.login=${sonarLogin} -Dsonar.projectName=gs-gradle -Dsonar.projectVersion=${env.BUILD_NUMBER} -Dsonar.projectKey=GS -Dsonar.sources=complete/src/main/ -Dsonar.tests=complete/src/test/ -Dsonar.language=java -Dsonar.java.binaries=."
      }
    }
}

 

'Computer Science > DevOps' 카테고리의 다른 글

[AWS] WEB - WAS 구성 (Apache - Tomcat)  (0) 2023.07.27
[Jenkins] Jenkins Pipeline 구축  (0) 2023.07.03
[Jenkins] Jenkins 다뤄보기  (0) 2023.06.27
[OS] OS 모음집  (0) 2021.08.12
[CI/CD] Tool  (0) 2021.08.11

Jenkins 구축 관련해서 아래의 블로그를 참고!

https://realyun99.tistory.com/199


Jekins Pipeline

  • Jenkins를 사용하여 CD Pipeline 을 구현하고 통합하는 것을 지원하는 플러그인의 집합
  • Pipeline DSL 구문을 통해 코드로 전송 파이프라인을 모델링하기 위한 확장 가능한 자동화 서버를 갖추고 있음
  • Jenkinsfile 소스에 해당 내용을 넣고 경로를 보여주면 됨
  • Pipeline에 대한 자세한 내용은 해당 블로그를 참고하면 좋을 듯 싶다!

Jenkins Pipeline 프로젝트 생성

  • project configure

https://github.com/wardviaene/docker-demo 를 내 github으로 fork
해당 docker.build안 docker 주소 본인 환경에 맞게 변경

  • 지금 빌드 클릭

dockerhub 레포지토리에도 이미지 올라간 것을 볼 수 있음!


Docker Pipeline 프로젝트 생성

  • docker pipeline plugin 설치 후 프로젝트 생성

  • project configure

물론 해당 젠킨스 파일 또 잘 수정해야함...

  • 지금 빌드 클릭

dockerhub 에 올라옴!


위의 단계들을 진행하면서 제일 중요한건 Jenkinsfile안의 코드다! 두 프로젝트의 차이점도 Jenkinsfile 밖에 없다.

해당 파일들의 내용을 파헤쳐보자.

 

Jenkinsfile: Jenkins Pipeline ver

node {
   def commit_id
   stage('Preparation') {
     checkout scm
     sh "git rev-parse --short HEAD > .git/commit-id"                        
     commit_id = readFile('.git/commit-id').trim()
   }
   stage('test') {
     nodejs(nodeJSInstallationName: 'nodejs') {
       sh 'npm install --only=dev'
       sh 'npm test'
     }
   }
   stage('docker build/push') {
     docker.withRegistry('https://index.docker.io/v2/', 'dockerhub') {
       def app = docker.build("realyun99/docker-nodejs-demo:${commit_id}", '.').push()
     }
   }
}

Jenkinsfile.v2: Docker Pipeline ver

node {
   def commit_id
   stage('Preparation') {
     checkout scm
     sh "git rev-parse --short HEAD > .git/commit-id"
     commit_id = readFile('.git/commit-id').trim()
   }
   stage('test') {
     def myTestContainer = docker.image('node:16')
     myTestContainer.pull()
     myTestContainer.inside {
       sh 'npm install --only=dev'
       sh 'npm test'
     }
   }
   stage('test with a DB') {
     def mysql = docker.image('mysql').run("-e MYSQL_ALLOW_EMPTY_PASSWORD=yes") 
     def myTestContainer = docker.image('node:16')
     myTestContainer.pull()
     myTestContainer.inside("--link ${mysql.id}:mysql") { // using linking, mysql will be available at host: mysql, port: 3306
          sh 'npm install --only=dev' 
          sh 'npm test'                     
     }                                   
     mysql.stop()
   }                                     
   stage('docker build/push') {            
     docker.withRegistry('https://index.docker.io/v2/', 'dockerhub') {
       def app = docker.build("realyun99/docker-nodejs-demo:${commit_id}", '.').push()
     }                                     
   }                                       
}

 

  • test 단계에서 docker 이미지를 당겨와서 사용할 수 있다 → jenkins configure에서 따로 설정해줄 필요가 없다!
    • 즉 nodejs를 jenkins 컨테이너가 아닌 옆에 새 컨테이너를 생성하고 해당 커멘드들을 실행하게 된다.
    • 커멘드 실행이 끝나면 컨테이너는 폐기되고 다음 단계로 넘어간다.

 

 

❗ 원하는대로 컨테이너 생성해서 이미지 올리는 등의 코드를 작성하고 싶으면 Docker Pipeline이 유용할 듯 싶다? ❗

'Computer Science > DevOps' 카테고리의 다른 글

[AWS] WEB - WAS 구성 (Apache - Tomcat)  (0) 2023.07.27
[Jenkins] 다양한 플러그인 활용  (0) 2023.07.24
[Jenkins] Jenkins 다뤄보기  (0) 2023.06.27
[OS] OS 모음집  (0) 2021.08.12
[CI/CD] Tool  (0) 2021.08.11

Jenkins란

  • 모든 언어의 조합과 소스 코드 레포지토리에 대한 CI/CD 환경을 구축하기 위한 도구
    • 빌드: 서버에 올릴 수 있는 상태로 만드는 것
    • 배포: 서버에 올려 사용자가 사용할 수 있게 하는 것
  • 기능: 컴파일 오류 검출, 자동화 테스트 수행, 정적 코드 분석으로 인한 코딩 규약 준수 여부 체크, 성능 변화 감시 등..

 EC2에 Jenkins 설치

#!/bin/bash

# this script is only tested on ubuntu focal 20.04 (LTS)

# install docker
sudo apt-get update
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker
usermod -aG docker ubuntu

# run jenkins
mkdir -p /var/jenkins_home
chown -R 1000:1000 /var/jenkins_home/
docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -d --name jenkins jenkins/jenkins:lts

# show endpoint
echo 'Jenkins installed'
echo 'You should now be able to access jenkins at: http://'$(curl -4 -s ifconfig.co)':8080'
  • http://<EC2-ip>:8080 접속해서 Jenkins 들어가면 됨...

Jenkins 프로젝트(nodejs) 빌드 테스트

  • 원하는 프로젝트 이름 설정

  • 소스코드 추가 - git 주소 적으면 됨

  • 빌드 스텝 추가

  • NodeJS 설정을 위한 Jenkins 관리 - Tools 설정

  • 빌드 환경 설정

  • 지금 빌드 클릭

[확인]


Docker로 애플리케이션 배포 

  • Jenkins Plugin: CloudBees Docker Build and Publish 설치
  • Jenkins Docker: Jenkins 컨테이너가 Docker API와 통신할 수 있는 Docker socket에 접근할 수 있게..
# Dockerfile
FROM jenkins/jenkins:lts
USER root

RUN mkdir -p /tmp/download && \
 curl -L https://download.docker.com/linux/static/stable/x86_64/docker-18.03.1-ce.tgz | tar -xz -C /tmp/download && \
 rm -rf /tmp/download/docker/dockerd && \
 mv /tmp/download/docker/docker* /usr/local/bin/ && \
 rm -rf /tmp/download && \
 groupadd -g <998> docker && \
 usermod -aG staff,docker jenkins

USER jenkins
# groupadd 의 숫자는 cat /etc/group | grep docker 로 확인
# git clone 
cd jenkins-docker
docker build -t jenkins-docker .

docker stop jenkins # 기존의 jenkins 종료
docker rm jenkins

docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name jenkins -d jenkins-docker
docker exec -it jenkins bash
  • docker repository 생성

  • build step 추가

  • 지금 빌드 클릭

[해당 환경 테스트]

docker pull realyun99/docker-nodejs-demo
docker run -p 3000:3000 -d --name my-nodejs-app realyun99/docker-nodejs-demo
# EC2 보안그룹 포트도 열어주기!(3000)

 

'Computer Science > DevOps' 카테고리의 다른 글

[Jenkins] 다양한 플러그인 활용  (0) 2023.07.24
[Jenkins] Jenkins Pipeline 구축  (0) 2023.07.03
[OS] OS 모음집  (0) 2021.08.12
[CI/CD] Tool  (0) 2021.08.11
[CI/CD] 정의  (0) 2021.08.11

+ Recent posts