상세 컨텐츠

본문 제목

CI/CD 라인 구성 - EKS 웹어플리케이션기반 인프라 구축 - (3)

web-application 시스템 구축

by drogva 2024. 3. 8. 12:09

본문

14. github action - 통합 CI/CD 라인 구축

- 비쥬얼 코드 이용,-> main.yaml을 생성할 git hub 저장소 새로 생성, git pull -> 로컬에 node.js 설치 -> package.json 생성 npm 패키지 -> git push

 

비쥬얼코드

npm init

This utility will walk you through creating a package.json file.

It only covers the most common items, and tries to guess sensible defaults.

 

See `npm help init` for definitive documentation on these fields

and exactly what they do.

 

Use `npm install <pkg>` afterwards to install a package and

save it as a dependency in the package.json file.

 

Press ^C at any time to quit.

package name: (kpop) kpop

version: (1.0.0)

description: jenkins

entry point: (index.js)

test command: test

git repository: https://github.com/drogva/kpop.git

keywords: kpop

author: shin seung ho

license: (ISC)

About to write to C:\Users\ssh87\OneDrive\바탕 화면\새 폴더\kpop\package.json:

 

{

"name": "kpop",

"version": "1.0.0",

"description": "jenkins",

"main": "index.js",

"scripts": {

"test": "test"

},

"repository": {

"type": "git",

"url": "git+https://github.com/drogva/kpop.git"

},

"keywords": [

"kpop"

],

"author": "shin seung ho",

"license": "ISC",

"bugs": {

"url": "https://github.com/drogva/kpop/issues"

},

"homepage": "https://github.com/drogva/kpop#readme"

}

 

 

Is this OK? (yes) yes

-> npm package 생성

 

mkdir ./.github

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop (main)

$ mkdir ./.github/workflows

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop (main)

$ cd ./.github/workflows

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop/.github/workflows (main)

$ touch main.yml

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop/.github/workflows (main)

$ pwd

/c/Users/ssh87/OneDrive/바탕 화면/새 폴더/kpop/.github/workflows

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop/.github/workflows (main)

$ cd ..

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop/.github (main)

$ ls

workflows/

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop/.github (main)

$ pwd

/c/Users/ssh87/OneDrive/바탕 화면/새 폴더/kpop/.github

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop/.github (main)

$ cd ..

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop (main)

$ pwd

/c/Users/ssh87/OneDrive/바탕 화면/새 폴더/kpop

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop (main)

$ git add .

warning: in the working copy of 'package-lock.json', LF will be replaced by CRLF the next time Git touches it

warning: in the working copy of 'package.json', LF will be replaced by CRLF the next time Git touches it

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop (main)

$ git commit -m "Add main.yaml for GitHub Actions workflow"

[main (root-commit) 70e59ed] Add main.yaml for GitHub Actions workflow

3 files changed, 28 insertions(+)

create mode 100644 .github/workflows/main.yml

create mode 100644 package-lock.json

create mode 100644 package.json

 

ssh87@DESKTOP-V025CS3 MINGW64 ~/OneDrive/바탕 화면/새 폴더/kpop (main)

$ git push origin main

Enumerating objects: 7, done.

Counting objects: 100% (7/7), done.

Delta compression using up to 12 threads

Compressing objects: 100% (4/4), done.

Writing objects: 100% (7/7), 697 bytes | 348.00 KiB/s, done.

Total 7 (delta 0), reused 0 (delta 0), pack-reused 0

To https://github.com/drogva/kpop.git

* [new branch] main -> main

 

  1. 비주얼 스튜디오 코드에서 새로운 프로젝트를 시작하고, npm을 사용하여 패키지 초기화를 수행했습니다. 이 과정에서 package.json 파일이 생성되었습니다.
  2. mkdir 명령어를 사용하여 .github 디렉토리를 생성하고, 그 안에 workflows 디렉토리를 생성했습니다.
  3. touch 명령어를 사용하여 main.yml 파일을 생성했습니다. 이 파일은 GitHub Actions의 workflow 설정을 담당합니다.
  4. 파일 및 디렉토리 생성이 완료되면, 해당 프로젝트의 디렉토리로 이동하여 git add . 명령어를 사용하여 모든 변경 사항을 스테이징 영역에 추가했습니다.
  5. git commit -m "Add main.yaml for GitHub Actions workflow" 명령어를 사용하여 변경 사항을 커밋했습니다. 이 커밋 메시지는 새로운 GitHub Actions workflow를 추가했음을 설명합니다.
  6. git push origin main 명령어를 사용하여 변경 사항을 원격 저장소로 푸시했습니다. 이 과정에서 GitHub에 새로운 브랜치인 main이 생성되었습니다.

 

15. 변수 저장

git hub 액션을 위한 조건

레포지토리 우측 상단 setting -> security, secret action 에 젠킨슨의 변수 저장 -> main.yml에서 사용

 

 

 

웹훅 설정

Payload URL

https://jen.seunghobet.link/jenkins/github-webhook/

Content type

 

application/json

Secret -- jenkins token 입력

 

15. mian.yml 작성

aws, argo 는 파이프라인 이름 -> 맞게 수정

/job/aws/lastBuild /job/aws/build

/job/argo/lastBuild /job/argo/build

 

name: Jenkins Build and Deploy

 

on:

push:

branches:

- main

 

jobs:

build:

runs-on: ubuntu-latest

steps:

- name: Checkout code

uses: actions/checkout@v2

- name: Setup Node.js

uses: actions/setup-node@v2

with:

node-version: '16.x'

- name: Install dependencies

run: npm install

- name: Install curl and jq

run: |

sudo apt-get update

sudo apt-get install -y curl jq

- name: Build

run: |

echo "Stage build"

CRUMB=$(curl -s -u ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_API_TOKEN }} ${{ secrets.JENKINS_URL }}/crumbIssuer/api/json | jq -r '.crumb')

CRUMB_FIELD=$(curl -s -u ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_API_TOKEN }} ${{ secrets.JENKINS_URL }}/crumbIssuer/api/json | jq -r '.crumbRequestField')

curl -s -u "${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_API_TOKEN }}" -X POST "${{ secrets.JENKINS_URL }}/job/aws/build" -H "$CRUMB_FIELD:$CRUMB" || true

while true

do

sleep 5

result=$(curl -s -u ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_API_TOKEN }} ${{ secrets.JENKINS_URL }}/job/aws/lastBuild/api/json | jq -r '.result')

if [ "$result" == "SUCCESS" ]; then

echo "Jenkins job succeeded"

echo $result > SUCCESS

break

elif [ "$result" == "FAILURE" ] || [ "$result" == "ABORTED" ] || [ "$result" == "UNSTABLE" ] || [ "$result" == "NOT_BUILT" ]; then

echo "Jenkins job ended with status $result"

exit 1

else

echo "Jenkins job is still running..."

fi

done

 

deploy:

needs: build

runs-on: ubuntu-latest

steps:

- name: Checkout code

uses: actions/checkout@v2

- name: Setup Node.js

uses: actions/setup-node@v2

with:

node-version: '16.x'

- name: Install curl and jq

run: |

sudo apt-get update

sudo apt-get install -y curl jq

- name: Deploy

run: |

echo "Stage deploy"

CRUMB=$(curl -s -u ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_API_TOKEN }} ${{ secrets.JENKINS_URL }}/crumbIssuer/api/json | jq -r '.crumb')

CRUMB_FIELD=$(curl -s -u ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_API_TOKEN }} ${{ secrets.JENKINS_URL }}/crumbIssuer/api/json | jq -r '.crumbRequestField')

curl -s -u "${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_API_TOKEN }}" -X POST "${{ secrets.JENKINS_URL }}/job/argo/build" -H "$CRUMB_FIELD:$CRUMB" || true

while true

do

sleep 5

result=$(curl -s -u ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_API_TOKEN }} ${{ secrets.JENKINS_URL }}/job/argo/lastBuild/api/json | jq -r '.result')

if [ "$result" == "SUCCESS" ]; then

echo "Jenkins job succeeded"

echo $result > SUCCESS

break

elif [ "$result" == "FAILURE" ] || [ "$result" == "ABORTED" ] || [ "$result" == "UNSTABLE" ] || [ "$result" == "NOT_BUILT" ]; then

echo "Jenkins job ended with status $result"

exit 1

else

echo "Jenkins job is still running..."

fi

done

 

 

CRUMB(Cross-site Request Forgery protection token)은 Jenkins에서 CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 보안 메커니즘입니다. CSRF 공격은 인증된 사용자의 권한을 사용하여 악의적인 요청을 실행하는 공격으로, 보안 토큰(CRUMB)을 사용하여 이를 방지할 수 있습니다.

CRUMB은 Jenkins가 HTTP 요청을 수신할 때 생성되는 임시 토큰입니다. 이 토큰은 사용자가 Jenkins 웹 인터페이스를 통해 상호 작용할 때 생성되며, Jenkins에서 사용자의 세션을 확인하고 해당 요청이 유효한지 확인하는 데 사용됩니다. 따라서 이 토큰이 없으면 Jenkins는 요청을 거부하게 됩니다.

CRUMB을 요청에 포함시키면 Jenkins는 해당 요청이 원래의 웹 페이지에서 생성되었는지 확인하고, 그렇지 않으면 요청을 거부합니다. 이를 통해 악의적인 사용자가 피해자의 세션을 사용하여 Jenkins에서 악의적인 작업을 수행하는 것을 방지할 수 있습니다.

 

 

 

 

관련글 더보기