The One DevOps Platform
From planning to production, bring teams together in one application. Ship secure code more efficiently to deliver value faster.
about.gitlab.com
GitLab :
중앙 서버에서 Git 저장소를 관리하며, CI / CD 를 통해 DevOps 환경을 구축할 수 있게 도와준다.
CI / CD 는 지속적 통합, 지속적 서비스 제공, 지속적 배포를 말한다.
😒 개발팀에서는 보통 메인 리포지토리에 주기적으로 머지 또는 push 한다.
CI 원칙을 통한 MERGE → 자동으로 팀에서 만든 CI 스크립트를 통해 빌드 및 유닛 테스트 및 기타 등등을 스크립트등을 통해 실행된다.
이러한 과정에서 통과 싸인이 나온다면 머지.
아닐 경우 배포한 사용자에게 알림.
일반적으로는 애플리케이션 통합과 테스트에서부터 제공 및 배포에 이르며, CI / CD 파이프라인이라 부른다.
CI CD 배포 데모를 보며 깃랩을 통해 자동 배포 설정과 배포 확인을 해보려 한다.
아래는 java와 spring boot 프로젝트를 .gitlab-ci.yml 을 적용한 예시이다.
GitLab-examples / spring-gitlab-cf-deploy-demo · GitLab
GitLab.com
gitlab.com
프로젝트 구조 :
작업 진행 :
- CODE MERGE 및 수정 후 COMMIT - PUSH 연계
- CI / CD
- build - jar
- test - test
- package - docker image push
- deploy - 원격지 Server에 Docker Container로 spring boot app 배포
최종 결과 :
프로젝트 생성 및 초기 세팅 :
프로젝트를 등록한다.
![](https://blog.kakaocdn.net/dn/csUZtJ/btrSB4CdjgX/XreCpKus4CL2c7QFbGUKH0/img.png)
30일 무료 스타터 버전이다.
![](https://blog.kakaocdn.net/dn/2xamH/btrSxELyCi2/OdphwO1jz7y2O7rtqIAg2K/img.png)
저장소를 클론하고 테스트할 연습 프로젝트를 올리도록 한다.
![](https://blog.kakaocdn.net/dn/bIG9dn/btrSCbuyDab/OG6hIBsPG9GQ4mMCeaJKr0/img.png)
실행 및 어떤 화면이 나올 지 미리 만들어본다.
![](https://blog.kakaocdn.net/dn/bWyIQH/btrSxPzBO8p/jI0lZW2RckwGG7OkjWEBJ1/img.png)
테스트할 클라우드 서버에도 올려본다.
![](https://blog.kakaocdn.net/dn/NOtZn/btrSE9xPOMJ/hEr1vgRPKkF8At8UmNB0qK/img.png)
깃랩에 올라가는지도 테스트 해본다.
![](https://blog.kakaocdn.net/dn/cxRfFF/btrSB3KdkD5/h1rhvf7yu7bdho6ctZfzg1/img.png)
![](https://blog.kakaocdn.net/dn/uxZau/btrSxPM8cTT/iVJxkxLrVQdvLkR0GBDMP0/img.png)
.gitlab-ci.yml :
repository - files - new file - 화면에서 다음과 같은 템플릿을 지정한다.
![](https://blog.kakaocdn.net/dn/bjXDBQ/btrSJmKdyBE/K88jj2Fa3IB5v4vkrmomh1/img.png)
생성 했다면 다음과 같이 CI 파이프라인이 실행되는 지 테스트 할 수 있다.
![](https://blog.kakaocdn.net/dn/bjEbYn/btrSDFCnxTB/mPFcxeycJgEoG5VkpDJA00/img.png)
![](https://blog.kakaocdn.net/dn/c9xsgb/btrSy8M3agd/jwknn7kFtd7dqYDldHRoNK/img.png)
.gitlab-ci.yml
stages:
- build
- test
- package
- deployToServer
build:
image: gradle:7.1.0-jdk11
stage: build
before_script:
- chmod +x ./gradlew
script:
- ./gradlew clean
- ./gradlew build
artifacts:
paths:
- build/libs/*.jar
test:
image: gradle:7.1.0-jdk11
stage: test
before_script:
- chmod +x ./gradlew
script:
- echo gradlew test
- ./gradlew test
package:
# Use the official docker image.
image: docker:latest
stage: package
variables:
IMAGE_NAME: jm/jmc
services:
- docker:dind
before_script:
- echo docker login.....
- docker login -u $DOCKER_HUB_USER -p $DOCKER_HUB_PW
# Default branch leaves tag empty (= latest tag)
# All other branches are tagged with the escaped branch name (commit ref slug)
script:
- echo docker build...
- docker build -t $IMAGE_NAME .
- echo docker push...
- docker push $IMAGE_NAME
after_script:
- echo docker logout...
- docker logout
# Run this job in a branch where a Dockerfile exists
only:
- main # main 브랜치만 감지
# server ssh deploy
deployToServer:
stage: deployToServer
before_script:
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )'
- eval $(ssh-agent -s) # ssh-agent 백그라운드 실행
- echo "$SSH_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan $FTP_HOSTNAME >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
# ssh를 이용한 원격 파일 업로드.
- echo $USER@$FTP_HOSTNAME "docker login -u $DOCKER_HUB_USER -p $DOCKER_HUB_PW"
- ssh $USER@$FTP_HOSTNAME "docker login -u $DOCKER_HUB_USER -p $DOCKER_HUB_PW"
- ssh $USER@$FTP_HOSTNAME "docker pull $IMAGE_NAME"
- ssh $USER@$FTP_HOSTNAME "docker run -d --restart=unless-stopped -p 8080:8080 $IMAGE_NAME"
- ssh $USER@$FTP_HOSTNAME "docker logout"
only:
- main
외부 변수들은 GitLab - Settings - CI / CD - Variables
![](https://blog.kakaocdn.net/dn/YleZv/btrSJEqS6wT/p2zzUZsyfL6yxlZm0MqBs0/img.png)
GitLab Runner 세팅 :
CI / CD 를 위해 프로젝트가 올라가는 서버에 Gitlab Runner를 설치한다.
Install GitLab Runner using the official GitLab repositories | GitLab
Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.
docs.gitlab.com
테스트용 오라클 클라우드 리눅스 서버에 설치해보려한다.
https://www.oracle.com/kr/cloud/free/
오라클 클라우드 서비스를 쓴다면, 무료로 테스트용 리눅스 서버를 쓰기에 부담이 없다.
클라우드 서비스 무료 이용
Oracle Cloud Free Tier는 기업에게 무제한으로 사용할 수 있는 상시 무료 클라우드 서비스를 제공합니다.
www.oracle.com
Oracle cloud instance 설정 :
클라우드 서비스를 이용하는 길은 험난하다.
지급 검증에서 카드를 등록하는 과정에서 통과가 안된다면 결국 라이브 채팅으로 문의를 하는 수밖에 없다.
![](https://blog.kakaocdn.net/dn/eaQJPM/btrSDGBesY4/trBxt9THCU7uVctI0yITSK/img.png)
5분정도 걸리는 듯 하다 상담 직원이 처리해주면 다시 가입하면 된다.
인스턴스 설정은 다음 블로그를 참고했다.
오라클 클라우드 인스턴스 생성, 서버 만들기 1단계
오라클 클라우드 인스턴스 생성 방법, 서버 만드는 1단계 과정으로 인스턴스 생성 전 여러 자료들을 참고하면서 쉽고 빠르게 생성할 수 있도록 정리함
iter.kr
설치환경은 oracle cloud instance 의 centos 8 버전이다.
![](https://blog.kakaocdn.net/dn/cVWqNr/btrSCwsAMlV/tyK6XFYdeLKhrtSl2y58Vk/img.png)
과정을 따라한다면 설치가 완료된다.
$ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
$ sudo yum install gitlab-runner
필요할 경우 java를 설치한다. ( open jdk 11을 설치했다.)
$ sudo dnf install java-11-openjdk-devel
![](https://blog.kakaocdn.net/dn/bJphOH/btrSAxlx1Ad/jU97FRke8Al4jEWOeNbSq0/img.png)
설치 이후 러너를 등록한다.
$ sudo gitlab-runner register
등록시 필요한 URL 및 토큰 정보는 아래 탭에서 볼 수 있다.
![](https://blog.kakaocdn.net/dn/cSABxr/btrSAxlyEfD/uDK3xXcxhNhNQt1VYcCld1/img.png)
러너 실행 명령어는 다음과 같다.
$ gitlab-runner start
$ gitlab-runner run
도커 설치 및 테스트 :
[SERVER] docker / centos 8 / oracle cloud
😢 oracle cloud의 centos 8 에 docker를 설치해서 spring boot 프로젝트를 구동해본다. 도커 : 가상의 공간을 이미지로 만듦. 하나의 이미지를 통해 여러개의 컨테이너를 만들 수도 있음. 이러한 과정이 완
girinprogram93.tistory.com
SSH 설정 : Window 11 기준
CMD
$ ssh-keygen
사용자 홈 디렉토리에 키가 생성된다.
![](https://blog.kakaocdn.net/dn/bnA782/btrSJXqaRLW/khsP10vKqAQLUAgkqB5WaK/img.png)
GitLab - Variables에 등록 ( SSH_KEY )
![](https://blog.kakaocdn.net/dn/by89Y6/btrSM3iRLaM/jxdou5bAqzMvyJJ5k0pkJ0/img.png)
등록 이후 원격지 서버의 SSH 공개 키도 등록.
![](https://blog.kakaocdn.net/dn/bhJywB/btrSPQpVo3z/o1UFZn7S4TK49ysWKaBjDK/img.png)
ssh_host_ed25519_key.pub를 등록한다면, 다음과 같다.
![](https://blog.kakaocdn.net/dn/bO5DtO/btrSKPSY8y2/WyC7Q7F1A2uJEQLERvNDQ0/img.png)
$ cd ~/.ssh
$ vi authorized_keys
키값을 직접 붙여넣는다.
Dockerfile :
# 기본 이미지
FROM gradle:7.1.0-jdk11
# 변수 설정
# 2개 이상의 jar파일이 생성 될 경우 copy 안되는 현상있음
ARG JAR_FILE=build/libs/gitlab-starter-0.0.1-SNAPSHOT.jar
# 빌드파일을 컨테이너로 복사한다.
COPY ${JAR_FILE} app.jar
# jar 파일 실행.
ENTRYPOINT ["java","-jar","app.jar"]
GitLab Documentation
Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.
docs.gitlab.com
참고 : https://docs.gitlab.com/ee/ci/variables/index.html
참고 : https://playit.tistory.com/3
참고 : https://gitlab.com/gitlab-examples/spring-gitlab-cf-deploy-demo/-/blob/master/.gitlab-ci.yml
참고 : https://m.blog.naver.com/infograb/222384517957
참고 : https://medium.com/devops-with-valentine/gitlab-ci-upload-files-with-ftp-dee357ceecce
'SERVER' 카테고리의 다른 글
[Cloud Front] 클라우드 프론트 무효화 (1) | 2023.10.19 |
---|---|
[SERVER] docker command ( Oracle cloud, ubuntu 18 ) (0) | 2023.08.24 |
[SERVER] docker / centos 8 / oracle cloud (0) | 2022.12.03 |
[Server] Session 과 JWT (0) | 2022.11.29 |
iptables / centOS7 / 방화벽 설정 / 공유기 포트포워딩 세팅 (0) | 2022.04.24 |