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
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에서 악의적인 작업을 수행하는 것을 방지할 수 있습니다.
maven 프로젝트 빌드 - springboot(rds연동) (0) | 2024.03.10 |
---|---|
eks 웹어플리케이션 배포 영상 (CI/CD) (0) | 2024.03.08 |
CI/CD 라인 구성 - EKS 웹어플리케이션기반 인프라 구축 - (2) (2) | 2024.03.08 |
CI/CD 라인 구성 - EKS 웹어플리케이션기반 인프라 구축 - (1) (0) | 2024.03.08 |
gradle 기반 프로젝트 - rds 연동 (0) | 2024.03.08 |