Notice
Recent Posts
Recent Comments
Link
Gom3rye
Git Hub Action & Jenkins 본문
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 hub에 저장소를 생성: https://github.com/Gom3rye/nodetest.git
- git hub 저장소와 연결: git remote add 저장소이름 저장소URL
- git remote add origin https://github.com/Gom3rye/nodetest.git
- 확인은 git remote -v
- 코드를 업로드
- 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 설치
- 기본 플러그인 설치
- 계정 설정
- URL 설정 (http://localhost:8080)
728x90
반응형