Gom3rye

Git Hub Action & Jenkins 본문

현대 오토에버 클라우드 스쿨

Git Hub Action & Jenkins

Gom3rye 2025. 7. 17. 19:58
728x90
반응형

Git Hub Action

  • 새로운 기능을 개발하고 프로젝트 코드를 테스트하고(단위 테스트) 빌드하고(빌드, 패키징) 원격 저장소에 반영하고(push, pull request) 배포(정적 분석 및 release)하는 일련의 과정이 완료되어야 작업이 마무리 된다.
  • 위의 작업을 자동화하는 것을 CI/CD라고 한다.
    • 빌드: 실행 가능한 프로그램, 패키징: 배포 가능한 프로그램
    • Black Box: 기능(Input → Output) 테스트, 내부 구조 x
    • White Box: 내부 구조(for, while, if)
  • CI 작업은 별도의 도구보다는 명령으로 수행하는 경우가 많다.
    • Circle CI나 Bamboo 같은 CI 도구도 존재하긴 한다.
  • CD 작업은 별도의 도구를 이용하는 경우가 많다.
    • Git Hub Action, Jenkins, Argo CD(Public Cloud), Terraform(Private Cloud), Ansible(Private Cloud) 등이 이용된다.
    • CSP에서 별도로 CI/CD 기능을 제공한다.
  • Git Hub Action의 경우는 이벤트 기반 명령 실행 구조이다.

용어

  • Event: 정의된 깃 허브 액션 작업을 실행시키는 특정 활동
  • Jobs: 단일 환경에서 실행될 명령의 집합
  • Steps: Job 안에서 실행하게 될 명령을 정의
  • Actions: 단일 명령 체제

node 프로젝트를 git hub action으로 docker hub에 이미지를 만들어서 배포

  • 프로젝트에서 사용할 디렉토리 생성: nodetest
  • 노드 프로젝트 생성: npm init
  • 테스트 패키지 설치: npm install mocha
  • test.spec.js 파일 작성
describe('Default Test Set', () => {
    it('test1 should be passed', () => {
        console.log('test1 passed')
    })

    it('test2 should be passed', () => {
        console.log('test2 passed')
    })
})
  • 테스트 실행
cd node_modules
cd .bin
mocha ../../test.spec.js
  • package.json 파일 수정
"scripts": {
    "test": "./node_modules/.bin/mocha test.spec.js"
  }, # 부분만 수정
  • .gitignore 파일 만들어서 node_modules/ 적어주기
  • git 로컬 저장소와 연동
    • git init
    • git add .
    • git commit -m “nodetest”
  • 깃헙 저장소와 연결
  • 코드를 업로드
    • git branch # → main으로 되어 있으면 git push origin main, master로 되어 있으면 git push origin master
  • github action 파일 생성
    • 프로젝트에 .github/workflows 디렉토리에 yaml 파일을 생성해도 되고 github 사이트에서 추가해도 되는데 파일 이름은 아무 상관 없다.
    • 프로젝트에 .github/workflows 디렉토리를 생성하고 nodetest.yaml 파일을 만들고 작성
    name: nodejs CICD
    
    # 구독할 이벤트
    on:
      push:
        branches: [main]
      pull_request:
        branches: [main]
    
    jobs:
      build:
        runs-on: ubuntu-latest # os를 써주기
    
        strategy:
          matrix:
            node-version: [14.x]
        # step에서 uses와 run의 차이는 uses는 존재하는 기능을 호출하는 거고 run은 실행 명령
        steps:
          - uses: actions/checkout@v2 # 코드 가져오기
          - name: Use Node.js ${{ matrix.node-version }}
            uses: actions/setup-node@v1 # use는 내가 만든게 아니라 존재하는 거 가져오기
            with:
              node-version: ${{ matrix.node-version }}
          - run: npm install # run: 작업의 작은 단위
          - run: npm build --if-present
          - run: npm test
    
  • commit 후 push

python web project를 git hub actions를 이용해서 Docker Hub에 배포

  • Docker Desktop을 킨 후 mongo db를 docker에서 실행
    • docker run --name mongodb -v ~/data:/data/db -d -p 27017:27017 mongo
    • 확인 docker ps, docker exec -it mongodb bash
  • python 가상환경 생성 및 활성화
    • python -m venv myvenv
    • Scripts까지 이동 후 activate
  • 필요한 패키지를 설치: pip install flask, requests, beautifulsoup4, pymongo
  • app.py 작성
from flask import Flask, render_template, jsonify, request
app = Flask(__name__)

# 기본 요청이 오면 index.html 파일을 출력
@app.route("/")
def home():
    return render_template("index.html")

if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)
  • templates 디렉토리를 생성하고 그 안에 index.html 파일을 작성
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h4>Flask Web Application</h4>
</body>
</html>
  • 실행: python app.py
  • 확인: 브라우저에서 localhost:5000
  • 패키지 정보를 requirements.txt 파일에 전송: pip freeze > requirements.txt
  • 애플리케이션을 도커 이미지로 생성하기 위한 Dokcerfile 작성
FROM python:3.8-slim

RUN apt-get update
RUN apt-get install -y --no-install-recommends
RUN rm -rf /var/lib/apt/lists/*

WORKDIR /usr/src/app

COPY requirements.txt /
RUN pip install flask
COPY . .

EXPOSE 5000
CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]
  • 이미지 생성: docker build -t kyla333/flaskweb .
  • 이미지를 컨테이너로 만들어서 접속되는지 확인: docker run -dit -p 5000:5000 --name flaskweb kyla333/flaskweb
  • 이미지는 만들어지는데 컨테이너로 만들었을 때 에러가 발생하면 docker logs 컨테이너이름 으로 로그를 확인해보자.
  • DockerHub에 이미지를 자동으로 배포
    • docker hub에 레포지토리를 생성: kyla333/flaskweb
    • DockerHub에서 키를 발급받는다.
      • 예전 방식의 비밀번호를 입력하는 형태로는 코드로 로그인해서 작업을 수행할 수 없기 때문이다.
      • dckr_pat_0rstXSzv2kpnrjj1HJN7c4wIG8o
    • github action 파일을 작성 (.github/workflows
    name: flask CICD
    
    on:
      push:
        branches: [main]
      pull_request:
        branches: [main]
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout
            uses: actions/checkout@v3
          - name: Set Up Python 3.10
            uses: actions/setup-python@v4
            with:
              python-version: "3.10"
          - name: Install Packages
            run: pip install flask
          - name: Login to Dockerhub
            uses: docker/login-action@v1
            with:
              username: kyla333
              password: dckr_pat_0rstXSzv2kpnrjj1HJN7c4wIG8o
          - name: Build and release to Dockerhub
            env:
              NAME: kyla333
              REPO: flaskweb
            run: |
              docker build -t $REPO .
              docker tag $REPO:latest $NAME/$REPO:latest
              docker push $NAME/$REPO:latest
    
  • git hub과 연동
    • 깃헙 바이트에서 레포지토리 생성
    • 코드를 푸시
      • git init
      • git add .
      • git commit -m “메시지”
      • git remote add origin https://github.com/Gom3rye/flaskweb.git
      • git push origin main
        • 지금은 외부 사이트에 접속할 때 비밀번호나 키를 직접 작성하면 reject된다.
        • Git Hub에 가서 Access Token을 Secrets and variables로 등록해야 한다.
          • DOCKERHUB_USERNAME에 계정 이름을,
          • DOCKERHUB_TOKEN에 AccessToken을 저장
      • git action yaml 파일을 수정
      name: flask CICD
      
      on:
        push:
          branches: [main]
        pull_request:
          branches: [main]
      jobs:
        build:
          runs-on: ubuntu-latest
          steps:
            - name: Checkout
              uses: actions/checkout@v3
            - name: Set Up Python 3.10
              uses: actions/setup-python@v4
              with:
                python-version: "3.10"
            - name: Install Packages
              run: pip install flask
            - name: Login to Dockerhub
              uses: docker/login-action@v1
              with:
                username: ${{secrets.DOCKERHUB_USERNAME}}
                password: ${{secrets.DOCKERHUB_TOKEN}}
            - name: Build and release to Dockerhub
              env:
                NAME: ${{secrets.DOCKERHUB_USERNAME}}
                REPO: flaskweb
              run: |
                docker build -t $REPO .
                docker tag $REPO:latest $NAME/$REPO:latest
                docker push $NAME/$REPO:latest
      
  • 배포된 이미지를 가지고 컨테이너를 생성해서 실행 여부 확인
    • docker run -dit -p 5000:5000 --name flaskweb kyla333/flaskweb

Jenkins

자바로 작성된 오픈 소스 자동화 서버

  • 원래 이름은 Hubson이었는데 오라클이 인수하면서 Jenkins로 바뀌었다.
  • 특징
    • 다양한 프로그래밍 언어 지원
    • 다양한 플러그인 지원
    • 이식성: Java로 개발돼서 대부분의 운영체제에서 실행할 수 있다.
    • WAR이나 Docker Image, Windows Linux Max OS X 의 바이너리도 제공한다.
    • 대부분의 버전 관리 시스템을 지원한다.
    • 분산 처리도 지원한다.
      • Master/Agent 모드를 지원하기 때문에 여러 컴퓨터로 노드를 분산해 실행하는 것이 가능하고 다른 기종에서도 실행되므로 노드마다 다른 운영체제가 설치돼도 문제 없이 사용할 수 있다.
    • 단순성
      • 설치와 구성 과정이 단순하다.

설치 방법

https://www.jenkins.io/doc/book/installing/docker/

  • docker를 이용한 설치
    • docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-server --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins
    • 초기 비밀번호 확인
      • docker logs jenkins-server 또는
      • docker exec -it 컨테이너ID cat /var/jenkins_home/secrets/initialAdminPassword
        • docker exec -it 7094a4c18093 cat /var/jenkins_home/secrets/initialAdminPassword b5ccccde55bf4a6eb18f07f73aec5fa3
  • localhost:8080 으로 접속해 b5ccccde55bf4a6eb18f07f73aec5fa3 를 넣고 기본 plugin 설치
728x90
반응형

'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글

AWS  (1) 2025.07.21
Jenkins  (0) 2025.07.18
Git 협업  (2) 2025.07.16
Git  (0) 2025.07.15
CI/CD  (1) 2025.07.14