CICD

한라봉봉·2025년 5월 13일

0. 하기전에 java를 설치하라!!! 무조건!!

1. OpenJDK 풀 버전 설치

# 1. OpenJDK 17 풀 버전 설치
sudo apt update
sudo apt install -y openjdk-17-jdk

# 2. 설치 경로 확인
ls /usr/lib/jvm/
# 보통은 /usr/lib/jvm/java-17-openjdk-amd64 로 설치됨

2. /etc/environment에 시스템 전체 환경변수 적용

sudo nano /etc/environment
  • 추가/수정: ctrl+c , 콘솔에서 오른쪽 클릭버튼으로 붙여넣기, 콘솔에서 ctrl + O -> enter로 저장, ctrl + X 로 나가기
PATH="/usr/lib/jvm/java-17-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"

# PATH 알아내는법
# ubuntu 기본 path 확인
env -i bash -c 'echo $PATH'
# 결과 예: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# Java bin 경로 확인
readlink -f $(which java)
# 결과 예: /usr/lib/jvm/java-17-openjdk-amd64/bin/java
  • 저장 후 적용:
source /etc/environment

3. 사용자 전용 환경변수 설정 (~/.bashrc)

3-1. ncloud 사용자 전용

nano ~/.bashrc
  • 추가:
# Jenkins 및 Java 툴용
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
# CLASSPATH는 필요할 때만 사용
# export CLASSPATH=$JAVA_HOME/lib
  • 적용:
source ~/.bashrc

3-2. jenkins 사용자 전용(이건 젠킨스 설치 후 jenkins 사용자 나오면 진행)

sudo -i -u jenkins bash
nano ~/.bashrc
  • 추가:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
  • 적용:
source ~/.bashrc
exit   # 다시 ncloud 계정으로 돌아오기

4. systemd Jenkins 서비스에서 환경 적용(이건 젠킨스 설치 후 jenkins 사용자 나오면 진행)

  • Jenkins가 systemd로 실행될 때도 JAVA_HOME을 정확히 참조하도록 service 파일 수정
sudo nano /etc/systemd/system/jenkins.service
  • Service 섹션에 추가:
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
  • 변경 후 적용
sudo systemctl daemon-reload
sudo systemctl restart jenkins
  • trouble shooting:
    case
    sudo systemctl restart jenkins 시, 아래 이슈발생
    Failed to restart jenkins.service: Unit jenkins.service has a bad unit file setting. See system logs and 'systemctl status jenkins.service' for details.
    => systemctl status jenkins -l 찍은 결과 확인.
    => Binding to IPv6 address not available since kernel does not support IPv6. Binding to IPv6 address not available since kernel does not support IPv6. 이 나오면,
    => sudo nano /etc/default/jenkins
    => JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=8080 --httpListenAddress=0.0.0.0" 로 변경
    => 변경 반영 확인
    sudo systemctl daemon-reload
    sudo systemctl restart jenkins
    sudo systemctl status jenkins -l
    "bad-setting" 메시지는 치명적인 오류가 아니라 systemd의 검증 단계에서 잡힌 경고에 불과하지만, restart 가 되지 않는다. 해당 부분은 java path 설정에 오류가 없는지 확인할것.

5. 최종 확인

echo $JAVA_HOME
java -version
javac -version

sudo -i -u jenkins bash
echo $JAVA_HOME
java -version
javac -version
exit
  • 출력 예시
/usr/lib/jvm/java-17-openjdk-amd64
openjdk version "17.0.16"
javac 17.0.16

정상적으로 나오면 Jenkins 설치 준비 완료 ✅

1. 서버 자체에 젠킨스 설치( scp 명령어를 쓰지도 못하고 로컬에서 vpn 돌리면서 직접할수밖엔..)

#Jenkins 공식 GPG 키를 다운로드해서 저장
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
  https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key

#정상적으로 다운로드 되었는지 확인:
ls -l /usr/share/keyrings/jenkins-keyring.asc

#APT 소스 등록, /dev/null 로 출력 제거
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list> /dev/null
# APT 소스 등록확인   
cat /etc/apt/sources.list.d/jenkins.list

# apt-get 업데이트 후 젠킨스 설치. 설치 과정에서 자동으로 jenkins 계정 생성됨. 설치가 끝나면 Jenkins 서비스 자동 시작
sudo apt-get update
sudo apt-get install jenkins

# 서버 설치 후 확인(상태가 active (running) 이어야 함)
sudo systemctl status jenkins

2. 젠킨스 설치한 서버에 8080 포트로 접속

초기 관리자 비밀번호는 서버상에서 아래와 같이 확인
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
암호 입력

플러그인 수동 설치 필요한거 설치하고 나중에 추가해도됨

계정 비밀번호 생성

3. 젠킨스 접속 후_jenkins 관리 > credential

jenkins 관리 → credential 쪽으로

토큰 값을 유저쪽에서 발급받는 법으로 등록

repo 자체의 토큰을 써도 되는지는 모르겠음 → maintainer 만 발급가능

jenkins 관리에서 시스템설정하는 부분에서 gitlab 카테고리에서 사용 가능

4. 젠킨스 접속 후_jenkins 관리 > Tools

gradle과 Node js 버전을 골라 추후 아이템에서 사용할수 있게 한다.

S3에 배포시 특정 자원 업데이트(재업로드)가 필요하다면, rclone 추가 설치하여 사용 (S3 compatible 용으로 더 유연함)

1. rclone 설치

curl https://rclone.org/install.sh | sudo bash

2. rclone 설정

rclone config

설정 과정:

n → 새 remote 추가

이름: ncp (원하는 이름 가능)

스토리지 종류: s3

Provider: Other

Access Key ID: (네이버 클라우드 Access Key)

Secret Access Key: (Secret Key)

Region: kr-standard

Endpoint: https://kr.object.ncloudstorage.com

Location Constraint: kr-standard

ACL: private

저장 후 q로 종료.
이 설정은 일반적으로 Jenkins에서는 다음 위치에 저장됩니다:

/var/lib/jenkins/.config/rclone/rclone.conf

3. Jenkins 빌드 스크립트 작성

#!/bin/bash

# rclone 명령어 실행
echo "파일 업로드 시작..."
rclone copy ./auth-fe/src/assets test:my-ncp-bucket-name/path/to/deploy --progress

# rclone 명령어의 종료 상태 코드 확인
if [ $? -eq 0 ]; then
    echo "✅ 파일 업로드 성공!"
else
    echo "❌ 파일 업로드 실패!"
    exit 1  # 실패 시 종료
fi

trouble shooting

1. frontend 빌드 에러

/var/lib/jenkins/workspace/rtboard-stg/frontend/node_modules/vite/bin/vite.js:2
import { performance } from 'node:perf_hooks'
       ^

SyntaxError: Unexpected token {
    at Module._compile (internal/modules/cjs/loader.js:723:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

Tools 에서 이렇게 설정해야함

버전이 낮아서 생기는 현상임

이렇게 하고

해당 job 에서 nodeJs를 myNodeJS로 바꿔주면 된다.

그리고 빌드가 다 됐는데 파일이 안옮겨짐 → permission denied

jenkins 권한 상승해주거나

sudo 권한 주면 됨

sudo usermod -aG sudo jenkins
sudo visudo
 추가 : jenkins ALL=(ALL) NOPASSWD: ALL
 
backend 나 frontend 폴더에 권한을 부여
sudo chown -R jenkins:jenkins /path

2. rclone.conf 파일 permission

CRITICAL: Failed to load config file /rclone.conf
permission denied
디렉토리의 읽기 권한이 부족할 때 발생

chmod 755 /home1/ncloud/.config/rclone  # 디렉토리 권한
chmod 644 /home1/ncloud/.config/rclone/rclone.conf  # 파일 권한

3. 아이템 내 Transfer set 설명

Source files: 젠킨스상에 있는 빌드된 파일(jar 등)
Remove prefix: 젠킨스 상에서 빌드된 파일의 경로를 배포대상에서 사용하지 않으므로 이설정으로 삭제
Remote directory: 배포 대상경로를 선택적으로 지정.
젠킨스 상의 jenkins 관리 > System > SSH Servers 에서 Remote Directory로 설정한 경로를 그대로 쓰려면 미설정해도 됨.
비워두거나 . 찍으면 되는데 젠킨스 버전에 따라 비우거나 .찍는게 권장되는게 다름
만약 채워넣으면 jenkins 관리쪽에서 설정한 path + 적어놓은 path가 됨.

Exec command: 배포 대상 서버에서 실행할 커맨드

profile
백엔드 개발공부 로그를 기록합니다

0개의 댓글