티스토리 뷰

DevOps

GitLab CI/CD 에러 해결

Seogineer 2021. 8. 19. 10:38

문제

sudo: no tty present and no askpass program specified.

메세지가 나오면서 CI/CD가 안 될 경우

 

해결

 

sudo vi /etc/sudoers 명령어로 파일을 열어서 아래 내용을 스크린샷과 같은 위치에 추가한다.

gitlab-runner ALL=(ALL) NOPASSWD: ALL

 

E45: 'readonly' option is set (add ! to override)

메세지가 나오면서 저장이 안 될 경우 :w! 명령어로 강제 저장한다.


문제

Job's log exceeded limit of 4194304 bytes.
Job execution will continue but no more output will be collected.

위 에러는 gitlab-runner 로그 기본 크기 기본값인 4MB를 초과하는 경우 발생

 

해결

sudo vi /etc/gitlab-runner/config.toml 명령어로 gitlab-runner 설정 파일을 열어서 output_limit = 50000 내용을 스크린샷을 참고하여 추가하고 저장한다. 50000은 로그 출력 한도를 의미한다.

sudo gitlab-runner restart 명령어로 gitlab-runner를 재시작한다.

 

output_limit을 추가해도 해결이 안된다면 gitlab-ci.yml에 mvn 명령어를 아래와 같이 수정한다.

mvn clean install > mvn.log

mvn.log 파일이 프로젝트 루트에 별도로 생성된다.


문제

bash: line 95: mvn: command not found

서버에 maven이 설치되어 있지 않아서 maven 명령을 수행할 수 없는 경우

 

해결

sudo apt install maven 명령어로 maven을 설치하고 mvn -v 명령어로 설치를 확인한다.


문제

불필요한 gitlab-runner 서비스를 삭제하려고 하는 경우

 

해결

sudo gitlab-runner verify --delete


문제

리눅스 서버에서 POI 라이브러리를 이용해서 sheet를 생성할 때 "java.io.IOException: Permission denied"가 발생하는 경우

 

해결

gitlab으로 push 하면 자동으로 gitlab-runner에 의해 CI/CD가 진행된다.

gitlab-runner가 mvn clean install 명령어를 실행하면서 테스트를 진행하는데 이때 엑셀 다운로드 테스트도 진행하게 된다.

엑셀 다운로드 테스트는 temp.xlsx 파일을 임시로 만들고 sheet를 생성한 후 요청한 데이터를 넣어주고 반환한다.

이때 임시폴더에 poifiles라는 폴더를 만들고 여기에 생성한 sheet를 저장한다.

윈도우는 c:\temp 또는 c:\Users\{UserId}\AppData\Local\Temp

유닉스 계열은 /tmp 또는 /var/tmp

경로에 poifiles 폴더를 생성한다.

 

여기서는 테스트 코드가 끝나고 JVM이 종료되면서 temp.xlsx와 poifiles 폴더는 사라지고 아무 문제 없이 테스트를 통과할 수 있다.

 

문제는 개발이나 운영 서버에서 엑셀 다운로드 기능을 사용하면 root 계정이 임시 폴더에 생성하는 poifiles 폴더다.

개발이나 운영 서버의 JVM이 종료되지 않는 이상 root 계정이 만든 poifiles 폴더는 사라지지 않는다.

이때 로컬에서 소스 코드를 수정한 후 gitlab에 push하면 CI/CD가 진행되면서 엑셀 다운로드 테스트도 진행한다.

gitlab-runner는 root 계정이 만든 임시 폴더의 poifiles 폴더에 sheet를 생성하려 하는데 이때 Permission denied가 발생한다.

 

문제를 해결하기 위해 gitlab-runner가 테스트를 수행하는 동안에는 기존의 임시 폴더가 아닌 다른 곳을 임시 폴더로 설정하고 그곳에 poifiles를 생성하도록 gitlab-ci.yml 변경한다.

# master 브랜치에 push가 들어올 때 동작하는 job
deploy-to-server:	# 임의의 job 이름
  stage: deploy 	# stage는 build, test, deploy가 있음

  only:
    - master 	# master 브랜치에 커밋이나 변경사항이 있을 때만 동작

  script:
    - echo 'deploy to server'
    - cd /home/gitlab-runner/builds/[gitlab-runner 이름]/0/../ 	# 프로젝트의 root 폴더로 이동
    - export _JAVA_OPTIONS=-Djava.io.tmpdir='poifiles 폴더 생성 경로' 	# poifiles 폴더의 생성 경로를 변경한다.
    - mvn clean install  # maven 명령어로 jar 파일 생성(maven이 설치되어 있어야 명령어를 실행할 수 있다.)
    - cd /home/프로젝트명/target/		# jar 파일이 생성된 위치로 이동
    - java -jar 파일명.jar 	# jar 파일 실행

  tags:
    - deploy	# runner를 등록할 때 입력했던 tag

 

댓글
Total
Today
Yesterday
링크
Apple 2023 맥북 프로 14 M3, 스페이스 그레이, M3 8코어, 10코어 GPU, 512GB, 8GB, 한글