사내 Private project(운영지원)
Contents
Project 진행 시기: 2021/11/15 - 2021/11/20
BACKGROUND
- 사내 일부 팀원들간 private project가 진행
- Project는 요구사항, UI Design, 기능설계가 진행중인 상황
- 설계가 완료된 시점에서 바로 개발에 착수할수 있도록 환경구축 및 Module Release pipeline작성에 대한 의뢰를 받음
개발 Stacks
- Server: Ubuntu 20.04.02 (사내 운용중)
- Web server: NGINX
- Language & Framework
- Frontend ReactJS
- Backend Node.js (express)
- Database MongoDB
- Tools
- Slack
- Git
- Docker
- docker-compose
- Jenkins
project내 역할
- 초기개발환경 구축
- Live server로의 Release용 pipeline 작성 및 테스트
GOAL
본 project내 역할을 완료
CONTENTS
초기개발환경 구축
-
개발용 MongoDB Container를 운영서버에 실행
- Dockerfile생성 [아래 코드는 Template]
FROM mongo # Environment variables for Initializing DB # Mongodb Global variables ENV MONGO_INITDB_ROOT_USERNAME 'dev_admin' ENV MONGO_INITDB_ROOT_PASSWORD 'dev2140' # Development environment variables ENV DEV_DATABASE 'dev_web' ENV DEV_USERNAME 'dev_manager' ENV DEV_PASSWORD 'devPasswd1@#' # Copy Initialize file COPY ./users_init.sh /docker-entrypoint-initdb.d/ EXPOSE 27017
-
Initialize Shell script 생성
filename
: users_init.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#!/bin/bash set -e echo ">>>>>>> trying to create database and users" if \ [ -n "${MONGO_INITDB_ROOT_USERNAME:-}" ] && \ [ -n "${MONGO_INITDB_ROOT_PASSWORD:-}" ] && \ [ -n "${DEV_DATABASE:-}" ] && \ [ -n "${DEV_USERNAME:-}" ] && \ [ -n "${DEV_PASSWORD:-}" ]; then mongo -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD <<EOF db=db.getSiblingDB('$DEV_DATABASE'); use $DEV_DATABASE; db.createUser({ user: '$DEV_USERNAME', pwd: '$DEV_PASSWORD', roles: [{ role: 'readWrite', db: '$DEV_DATABASE' }] }); EOF else echo "Not exists environment variables..." exit 403 fi
- 원격 서버에 개발용 DB server 실행
1 2 3 4 5 6 7 8 9
# docker 컨테이너실행에 필요한 환경변수 설정 export mongoImageName=aacs_mongo_img export mongoContainerName=aacs_mongo_dev # docker build docker build -f DockerfileForMongo -t ${mongoImageName} . # docker run docker run --name ${mongoContainerName} -p 27017:27017 --rm -d ${mongoImageName}
-
Git repository내 Frontend & Backend 모듈 생성
- Git repository clone
1
git clone {project repository URL}
- Backend folder 생성 & NodeJS init
1 2 3 4 5
# 폴더 생성 mkdir backend # NodeJS init cd backend && npm init
-
React module 생성
1
yarn create react-app frontend
✨ Github 운영 rules
Github flow
Github actions 생성
-
각 feature branch 개발완료 후, develop branch로 pull request
혹은 develop, main branch가 변경된 경우에, npm을 이용한 build 확인을 시행 -
본 project에서 unit test는 따로 진행하지 않기때문에 build만 확인
-
Project repository내 github actions workflow 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
name: aacs-supporter # Controls when the action will run. on: # Triggers the workflow on push or pull request events but only for the main branch push: branches: [ develop, main ] pull_request: branches: [ develop, main ] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: frontend_build_test: runs-on: ubuntu-latest strategy: matrix: node-version: [ 12.x, 14.x, 15.x ] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - name: npm ci, build and test run: | cd frontend npm ci npm run build --if-present backend_build_test: runs-on: ubuntu-latest strategy: matrix: node-version: [ 12.x, 14.x, 15.x ] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - name: npm ci, build and test run: | cd backend npm ci npm run build --if-present
Live server release용 pipeline생성
본 project는 사내 원격 server에 docker container 실행
그리고 사내 원격 server에 운용중인 jenkins가 존재함으로 webhook을 이용한 Jenkins pipeline를 생성
-
Update된 모듈의 이행까지의 flow
- 해당 repository내 main branch가 갱신
- repository내에 설정해놓은 webhook(release pipeline)이 실행
- 사내 Jenkins내 release용 pipeline이 실행
- repository의 main branch checkout
- release용 folder이동 후, docker-compose file을 이용해 build
- build된 image를 container run 실행
🔆 본 project는 아직 개발단계이기때문에, Release pipeline에 대한 Test는 아직 미실시
🔆 통합테스트가 완료된후에 pipeline test 실행예정
CONCLUSION
- 개발 Team의 의뢰 달성, 현재 개발진행중
- Jenkins Pipeline 생성완료