What is PVS Studio

PVS Studio

https://pvs-studio.com/en/
“PVS‑Studio is a static analyzer on guard of code quality, security (SAST), and code safety”
홈페이지에 적혀있는 문구 그대로 보면 코드 정적 분석 툴로 코드 퀄리티와 보안을 위해 사용할 수 있는 툴입니다.

C, C++과 Java 코드를 분석하는 툴로 다른 정적 분석 툴로는 Cppcheck, Clang Static Analyzer, SonarQube 등이 있습니다.
PVS Studio는 클라우드 제품은 없어보이고 설치형 프로그램으로 CI에 붙여서 사용하거나 코드 에디터에 설정하고 사용할 수 있습니다.

PVS-Studio for Visual Studio-PVS Studio blog

정적 코드 분석 툴로 TS(TypeScript)나 자바스크립트 앱을 제작할때 사용하는 TSLint, ESLint와 비슷하다고 볼 수 있겠네요.
실제로 빌드 및 프로그램이 실행할 때에 문제가 없을 수는 있지만 정적 코드 분석 결과 문제가 있을 요소는 미리 수정하는게 좋겠죠.

PVS Studio 기본 설명

https://youtu.be/4Fy-JTYzEs0

사실 기본 설명은 위에 정적 코드 분석 툴 정도로 다 설명이 될 수 있다고 생각합니다.
정적 코드 분석 -> 분석 코드 Warning 확인 -> 수정 -> 코드 개선의 흐름이 정적 코드 분석 툴을 사용하는 흐름이겠죠.

분석 코드 Warning 몇가지를 살펴보고 넘어가겠습니다.
Warnings: https://pvs-studio.com/en/docs/warnings/

  • V501. Identical sub-expressions to the left and to the right of ‘foo’ operator.
    • 왼쪽, 오른쪽 동일한 표현식이 있음. -> “유의미한 표현식을 사용하지 않았네. 수정해라” warning으로 볼 수 있겠네요.
  • V502. The ‘?:’ operator may not work as expected. The ‘?:’ operator has a lower priority than the ‘foo’ operator.
    • ? 연산자의 활용이 적절하지 않게 되어있음. 말 그대로 ? 연산자가 적절히 사용되었는지 확인하고 수정하라는 warning.
  • V503. Nonsensical comparison: pointer < 0.
    • 포인터 비교가 잘못된 코드가 있음. 포인터가 아닌 다른 것을 비교해야한다는 warning으로 이해할 수 있습니다.

위 처럼 Warning에 따라 수정하고 코드를 개선할 수 있는 서비스로 이해해볼 수 있겠습니다.

https://stackshare.io/stackups/pvs-studio-vs-sonarqube
stackshare라는 서비스의 장단점 비교 서비스를 보았을 때 SonarQube와 인지도 차이가 크지만
PVS Studio도 C++ 개발하거나 게임 개발에 사용해볼만한 프로그램으로 사용되긴하는 것 같습니다. 😃
(SonarQube가 인지도가 높아 PVS Studio랑 어떤 차이가 있는지 확인차 살펴보았는데 PVS Studio는 인지도가 역시 낮았네요)

PVS Studio 가이드 문서 살펴보기

공식 가이드 문서: https://pvs-studio.com/en/docs/
블로그: https://pvs-studio.com/en/blog/posts/

마무리

게임 개발을 하면서 코드 분석툴은 어떤 것들이 있고 그중에 PVS Studio는 뭘까 싶어 한번 찾아보게되었네요.
기본적으로 PVS Studio는 정적 코드 분석 툴로 분석한 코드는 개발자들이 확인하고 개선해나가야하는 중간 도우미 같은 친구이긴합니다.
Warning을 다 해결한다고 다 좋은 코드는 아니지만 안정성, 품질을 신경쓰고 있는 코드로 볼 수는 있겠다는 생각이듭니다.

Perforce(P4V) 체크아웃, 체크아웃 해제

체크아웃(Check Out), 체크아웃 해제(Check out file Revert)

Perforce Client(P4V) basics

체크아웃 방법

체크아웃 후 파일 오픈!
체크아웃 후 파일이 열린 모습
  • 체크아웃하려는 파일을 워크스페이스 파일 트리에서 파일을 선택, 오른쪽 버튼으로 체크아웃합니다.
  • Check Out, Check Out and Open 메뉴를 통해서 체크아웃할 수 있습니다.

체크아웃 참고

작업할 이미지 파일이 Lock된 상태"
이미 누군가 파일을 체크아웃했다고 합니다

  • 이미지, 에셋 등 Exclusive file을 체크아웃할 때 다른 작업자가 체크아웃하고 있을 경우 체크아웃할 수 없습니다.
  • 작업을 하고자할 경우 현재 진행중인 작업이 마무리되고 체크아웃하여 작업할 수 있습니다.

체크아웃 해제

파일 체크아웃 해제: Revert

  • 체크아웃한 파일들을 더 이상 수정하지 않는다면 Revert를 이용하여 체크아웃을 해제할 수 있습니다.
  • Changelist에서 마우스 오른쪽 버튼 -> Revert Files 또는 Revert Unchanged Files로 리버트할 수 있습니다.
    • Revert Files : Changelist에 있는 모든 파일의 수정을 취소합니다.(리버트합니다)
    • Revert Unchanged Files : Changelist에 있는 수정되지 않은 파일을 pending list를 제외합니다. (이것도 리버트라고 볼 수 있겠네요)
  • 파일 각각 선택하여 리버트할 수도 있습니다.

Revert시 변경한 내역이 있는 파일이 있는 경우

  • 다른 옵션 설정 없이 그냥 리버트해도 상관 없습니다.
  • 두번째 옵션(Get the latest revision and then check out all files that were reverted)의 경우 리버트 후 파일들을 최신 데이터로 업데이트한 뒤 체크아웃해줍니다.

다른 Perforce 가이드 문서들

Perforce Stream, task stream / 태스크 스트림

Perforce stream: Task stream

예전 포스트에서 스트림을 살펴보았는데요. Perforce(P4V) Stream(스트림)
각 스트림 타입별 내용을 한번 정리해보고자 합니다. 😃
이번 포스트에서는 Task stream, 태스크 스트림을 공부해보겠습니다.

가이드 문서: Working with task streams

참고: 스트림 유형(Stream types)

  • Mainline: 최상위 스트림으로 메인 브랜치로 볼 수 있습니다.
  • Release: 안정적인 소스 상태로 관리하기 위한 스트림으로 주로 안정적인 릴리스를 준비하기 위해 사용하는 스트림입니다.
  • Development: 개발이 이뤄지는 피쳐 스트림입니다.
  • Task: 작은 단위의 작업을 할 때 사용할 수 있는 특수한 스트림입니다. 자세한 내용은 링크를 참고하세요.
  • Virtual: 특정 인원에게 제한된 뷰를 제공하기 위한 스트림입니다. 자세한 내용은 링크를 참고하세요.

Task stream overview(요약)

먼저 가이드 문서에 있는 내용들을 요약해보겠습니다.

  • 태스크 스트림은 버그 수정이나 작은 기능 개발과 같이 제한된 작업에 적합합니다.
  • 태스크 스트림은 브랜치의 총 파일 수에 비해 적은 수의 파일에 영향을 주는 가벼운 브랜치입니다.
  • 태스크 스트림은 대개 일시적인 경우가 많으며 변경 사항이 통합되면 삭제되거나 언로드됩니다.
  • 태스크 스트림은 리포지토리 메타데이터의 양을 최소한으로 유지하여 Helix Core Server 성능에 도움이 될 수 있습니다.
  • ⭐각 태스크 스트림에는 고유한 이름이 필요하며, 이 이름은 태스크 스트림이 삭제된 후에도 재사용할 수 없습니다.
    • 따라서 사이트에 사용자-날짜-작업 번호와 같은 명명 규칙이 있는지 관리자에게 문의하세요.
    • 여기서 작업 번호는 이슈 추적 애플리케이션에서 식별자 또는 ‘작업(job)’을 나타냅니다.

다른 스트림들과 다른 태스크 스트림의 예외 사항

  • 태스크 스트림에는 상위(부모) 스트림이 필요하지 않습니다.
    • 따라서 스트림 depot에서 작업하지 않는 사용자도 태스크 스트림을 만들 수 있습니다.
    • 태스크 스트림은 스트림 저장소에 있어야 하지만, 해당 저장소는 태스크 스트림의 보류 장소일 뿐입니다.
    • 사용할 스트림 보관소에 대한 정보는 관리자나 프로젝트 리드에게 문의하세요.
    • 자세한 내용은 상위 스트림 없이 태스크 스트림 만들기를 참조하세요.
  • 상위 스트림은 다른 depot에 있을 수 있습니다.
    • 태스크 스트림은 삭제되거나 언로드될 때까지 디포에 빠르게 누적될 수 있습니다.
    • 프로젝트 보관함을 태스크 스트림으로 어수선하게 만들지 않으려면 관리자나 프로젝트 리더가 특정 스트림 보관함을 태스크 스트림의 전용 보관 장소로 설정할 수 있습니다.
    • 이 경우, 태스크 스트림 저장소에 스트림을 프로젝트 저장소에 있는 상위 스트림의 하위 스트림으로 만들면 됩니다.
    • 태스크 스트림이 다른 디포에 있더라도 부모 디포의 스트림 그래프 보기에 스트림이 표시되는 것을 볼 수 있습니다.
    • 자세한 내용은 다른 저장소에 태스크 스트림 만들기를 참조하세요.
  • 태스크 스트림은 자식 스트림을 가질 수 없습니다.
    • 태스크 스트림은 상위 스트림을 다시 지정할 수 없습니다.
    • 하지만 태스크 스트림을 일반 스트림으로 변환하면 해당 일반 스트림에 상위 스트림을 다시 지정할 수 있습니다.

💡 태스크 스트림이 다른 스트림과 다른점 💡
P4V나 가이드 문서를 확인해보니 태스크 스트림만 unload 할 수 있네요.
mainline, development, release 스트림은 삭제만 가능하고 Virtual 스트림은 다른 유형의 스트림이니 제외하고 나면 태스크 스트림만 가능합니다.
스트림이 많을수록 서버 성능에 영향이 있을 수 있으니 사용하지 않는 스트림의 정보를 unload하고 데이터를 로딩하지 않는 형태로 서버 성능을 관리할 수 있는 형태인 것 같네요.
추가로 Unload할 수 있는 것은 워크스페이스인데 퍼포스 서버 쪽에서 관리하는 데이터를 unload해서 서버 성능 관리를 좀 해야하나 봅니다.
(저희도 workspace, stream 전체 현황 검토해서 정리가 필요하겠네요 ㅎㅎ 😂)

정리

정리해보면, 태스크 스트림은 작은 작업, 버그 수정 등을 위한 피쳐 브랜치로 사용할 수 있는 스트림이라고 할 수 있네요.
다른 스트림들에 비해 스위칭 속도가 더 빠르거나 그런 것은 아닌 것 같지만 어떻게 스트림을 생성했냐에 따라 다를 수 있을 것 같습니다.
(스트림 생성시 부모 스트림의 데이터를 그대로 사용하는 설정 등..?)

가이드 문서와 다른 메뉴얼들만 보았을때는 퍼포스 서버 성능 관리를 위한 기능 같아서 작업자들 입장에서 어떤 것들이 좋은지는 더 살펴봐야겠네요.
실제로 스트림간 스위치 성능이 다른지 확인해보고 추가 내용으로 포스트해보겠습니다.

다른 Perforce 가이드 문서들

Perforce Trigger로 jira key → jira url로 변경해보기

이전 글 돌아보기

P4 trigger 설정하기: https://pineoc.github.io/blog/2022/01/31/perforce-trigger/

계기

이슈 트래커 연결: https://pineoc.github.io/blog/2022/05/21/think-issuetracker/

최근 이슈 트래커(Jira)랑 Perforce를 연결해보려는 고민을 했었습니다.
내부 엔지니어 피드백으로 “P4V에서 History탭을 볼 때, Changelist에 Jira Key가 있다면 Jira 링크로 연결되었으면 좋겠다”고 말씀해주셨어요.

업무할 때 큰 도움이 될 것 같다는 생각에 간단하게 할 수 있는 방법이 있지 않을까 싶어서 방법을 찾아보기 시작했습니다.

제가 생각한 방법은 2가지 정도였습니다.

  1. Perforce에 Submit할 때 P4 Trigger를 이용해서 Changelist를 서밋할 때, Description을 받아서 Jira Key → Jira URL로 변경해주는 방법
  2. P4 custom HTML Tool을 이용해서 P4 changelist을 볼 때 Description을 받아 Jira Key → Jira URL로 변경해서 보여주는 방법
  3. P4에서 Job 기능을 이용해서 Jira - P4 Job을 연결, Perforce와 Jira 정보 체계를 엮는 방법

이번 글에서는 1번 방법을 고민한 흔적을 공유해보려 합니다.

실제로 설정해보시려면 스크립트 구성 ~ 트리거 설정까지 참고하여 따라 진행해보시면 될 것 같습니다. 👍

1. P4 submit, populate 할 때 URL 변경해보기

https://www.perforce.com/manuals/p4sag/Content/P4SAG/scripting.triggers.submits.html

우리의 목적은 Changelist를 서밋할 때, Description을 변경하는 것이니 submit할 때 Perforce가 어떻게 동작하는지 알아야합니다.

https://www.perforce.com/manuals/p4sag/Content/Resources/Images/p4sag-triggers.png

내부 동작을 보니 이벤트는 change-submit → change-content → change-commit로 우리는 change-submit 쯤 Description 정보를 가져와서 변경하면되지 않을까 싶습니다.

각 이벤트 상세는 가이드 문서에 있네요.

  • change-submit: 변경 목록 생성 후 파일 전송 전에 제출 트리거를 실행합니다. 트리거가 파일 내용에 액세스할 수 없습니다.
  • change-content: 변경 목록 생성 및 파일 전송 후, 그러나 파일 커밋 전에 제출 트리거를 실행합니다.
  • change-commit: 변경 목록 생성, 파일 전송 및 변경 목록 커밋 후에 제출 트리거를 실행합니다.

트리거 설정 작업해봅니다.

참고: change-submit시 볼 수 있는 changelist는 아직 commit된 CL이 아니기에 pending changelist를 받게됩니다.
https://www.perforce.com/manuals/p4sag/Content/P4SAG/scripting.triggers.variables.html
change-submit trigger is passed the pending changelist number; a change-commit trigger receives the committed changelist number.

스크립트 구성

스크립트의 실행 순서를 대충 정리해보면 아래와 같겠습니다.

  1. change-commit 이벤트를 받아 스크립트를 실행
  2. 이벤트와 함께 받은 Changelist에서 Description을 가져온다.
  3. Description에서 Jira key를 확인, Description 마지막에 JIRA 항목으로 링크들을 만들어 추가
  4. p4 –field Description=”3 단계 Description” change -o changelistNum | p4 change -if

스크립트 트리거 설정 전 환경 설정

아래 트러블 슈팅 쪽을 보시면 상세내용을 아실 수 있겠지만 Perforce 서버(P4D)쪽 환경 이슈가 있어서 사전 설정이 필요합니다.

  • P4D 환경 p4 client 설정
  • P4D 환경의 p4 user 권한 확인하여 admin 이상의 권한으로 설정

스크립트

트리거 설정

  • admin 권한을 가지고 있는 계정으로 p4 triggers 명령어 실행
1
2
Triggers:
submit_data_hook_Test change-commit //Test/... "C:\Program Files (x86)\Python38-32\python %//Test/mainline/Tool/P4Triggers/submit_data_hooks.py% %change%"
  • P4D 환경에 맞춰서 파이썬 경로 설정
  • 참고
    • 필요한 파라미터는 trigger variable 에서 각 이벤트별 사용할 수 있는 파라미터를 확인할 수 있습니다.

Trouble shootings

encoding(P4CHARSET) 이슈

python 스크립트에서 p4 description을 가져오는 라인에서 에러가 발생

'utf-8' codec can't decode byte 0xc0 에러가 발생했는데 왜 발생했나 봤더니 p4 client charset이 cp949(euc-kr)로 되었는 것으로 확인

p4 set P4CHARSET=utf8 로 설정 후 해결!

P4 trigger 설정 후 Submit해도 Description 바뀌지 않는 이슈

Try 1: change-submit 트리거로 스크립트를 실행함

→ Description이 바뀌지 않았음
→ p4 –field Description … | p4 change -i -u 명령어와 -f 옵션 모두 해보았으나 안됨

Try 2: change-commit 트리거로 변경하고 스크립트 -f 옵션을 넣음

→ Description이 바뀌지 않았음

Try 3: stackoverflow에 물어보자

https://stackoverflow.com/questions/72506774/p4-triggers-edit-changelist-description-after-submit-on-client
→ 방법은 대략 알았지만 에러가 있다! 스크립트 외에 다른 문제가 있을 것 같아 에러 메세지를 더 분석해보았습니다.

dm-UpdateChangeSpecF 에러

1
CompletedProcess(args=['p4', 'change', '-if'], returncode=1, stdout=b'', stderr=b"Operation 'dm-UpdateChangeSpecF' failed.\r\nRequired parameter 'data' not set!\r\n")

위와 같은 에러가 나는데 가만히 보니 영어만 있는 CL에서는 에러가 발생하지 않음.
한국어, 중국어, 일본어와 같이 아시아권 언어에 또 문제가 있는가보다 😂

관련 이슈 리포트 링크: https://youtrack.jetbrains.com/issue/IDEA-102104

✨ 스크립트쪽 input 값에 .decode(‘cp949’).encode(‘utf-8’) 해서 강제로 utf8로 변환해주었음. 해결!

Client ‘test’ unknown - use ‘client’ command to create it. 에러

실제로 P4D(퍼포스 서버)가 동작하는 곳에 트리거 설정 후 테스트 해보았더니
Client 'test' unknown - use 'client' command to create it. 라는 에러가 발생함

대충봐도 client가 설정되지 않았으니 client 즉 workspace를 설정해야 CL을 수정할 수 있다는 것으로 보입니다.

✨ P4D 동작하는 환경에 client 설정 후 트리거 동작. 해결!
→ 추가로 P4D 동작하는 환경에 유저 권한도 admin 또는 super 권한을 설정해줘야합니다.

마무리

이번에 트리거 설정하면서 P4D 환경에 설정할 것들도 많고, 스크립트에서도 신경써야할 것이 많은 점을 배웠네요.
사실 파일 검사나 Description 검사정도만 한다면 권한 문제는 없었을텐데 다른 사람이 작업한 설명을 수정하는 것이니 권한이 필요한 트리거 작업이었네요.
실제로 설정해보시려면 스크립트 구성 ~ 트리거 설정까지 따라 진행해보시면 될 것 같습니다.
어렵거나 모호한 부분이 있다면 편하게 질문해주세요! 💪

Perforce Swarm 소개

Perforce Swarm?

이번 포스트에는 Perforce를 사용할 때 코드 리뷰를 하기 위해 사용하는 서비스인 Swarm을 소개해보려합니다.

공식 홈페이지: https://www.perforce.com/ko/jepum/helix-swarm

사실 Github, Gitlab, Bitbucket등 다른 소스 관리 서비스에서 기본적으로 제공하는 것을 따로 서비스로 제공하는 것이라 설치나 접근성 면에서 살짝 부족한 면은 좀 있습니다.
Swarm 기능은 다른 소스 관리 서비스와 거의 동일하지만 살짝 훑어보겠습니다.

Swarm 소개

공식 홈페이지에 따르면 아래와 같은 기능을 소개하고 있습니다.

더 나은 코드를 위한 공동 작업 / 맞춤 알림

  • 기본적인 리뷰 기능에 대한 소개입니다
  • 화면이 가로로 분할되어 코드 변경 사항을 확인할 수 있고 코드에 바로 코멘트할 수 있습니다
  • 사용자를 멘션할 수 있고 태스크를 만들어서 할당할 수 있습니다

그 외의 기능들

  • 글로벌 리뷰 대시보드
  • 멀티 팩터 인증
  • CI/CD 자동화
  • 다양한 컨텐츠 리뷰

사실 코드 리뷰 서비스라 다른 기능에 대한 소개는 부가적인 내용들이어서 스킵했습니다 😈
중요한 것은 리뷰 시스템이 얼마나 기본에 충실하냐인 것 같아요

Swarm 맛보기

https://swarm.workshop.perforce.com/

Swarm workshop이라는 서비스를 Perforce에서 운영하고 있는데 Swarm 동작이 어떻게되는지 알 수 있습니다. Github 오픈소스 저장소처럼 어떻게 리뷰가 이뤄지고 코멘트가 어떻게 보이는지 알 수 있어요.

https://swarm.workshop.perforce.com/explore/ 여기서 어떤 프로젝트가 있는지 볼 수 있으니 한번 개발이 활발한 프로젝트를 하나 들어가서 보겠습니다

Perforce 서버 쪽 패키지 관리 쪽 스크립트 저장소가 최근 활발했네요. 요것으로 보겠습니다.
https://swarm.workshop.perforce.com/projects/perforce-software-sdp/reviews/

Swarm workshop

작업 내역을 보니 최근 커밋, 리뷰 요청을 한 분이 열심히하고 있군요 ㅎㅎ 😸

  • 리뷰 페이지 상단에는 브랜치, 리뷰자 유무, 검토 필요/수정 필요/승인됨 등 리뷰 현황을 필터링할 수 있는 기능이 있습니다.
  • 리뷰 진행 상황(열림/닫힘)에 따라 볼 수 있기도 하네요.

대부분의 기능이 Github과 비슷하긴 하지만 열림/닫힘으로 표현되어있으니 리뷰가 완료되서 머지가 된 것인지 알려면 닫힘 탭으로 가서 “승인됨” 상태로 필터링해야 “이건 머지가 되지 않았을까?” 알 수 있겠네요.
사실 정말 머지되었는지 알기는 어렵습니다. 승인만 되었지 실제 작업자가 머지 안했을 수 있으니까요.

참고: Github Pull requests 화면

참고: Github Pull requests 화면

실제 Swarm 서비스 화면

Swarm My dashboard

Swarm Project overview

Swarm Review screen

Swarm workshop 화면과 차이가 크지만 다른 소스 관리 서비스의 코드리뷰 기능과 비슷합니다.
다만 회사에서 사용할때 아쉬웠던 점은 코드에 맞춰 하이라이팅되는 것이 부족하다고 느꼈었네요.

Swarm 가이드 문서

https://swarm.workshop.perforce.com/docs/ko/

Perforce 쪽에서 만든 가이드 문서(한국어)가 있는데 2015년 문서네요. 😂
(영문 가이드 문서도 2016년 버전이라 사실상 관리가 잘 안되고 있는 것처럼 보입니다 ㅎㅎ..)

최신은 따로 Perforce쪽에 있으니 여기를 보시는게 나을 것 같습니다.
https://www.perforce.com/manuals/swarm/Content/Swarm/home-swarm.html

마무리

이렇게 Swarm을 짧게 살펴보았는데 그동안 다른 소스 관리 서비스에서 사용했던 코드 리뷰 시스템에 비해서 너무 날 것이 아닌가 싶기도 합니다. (뭔가 UI도 굉장히 옛날 것이고…)

최신 프론트엔드 UI 맛으로 업데이트할 계획은 없는지 궁금하지만 사실 뭐… 핵심 기능인 코드 리뷰가 잘 이뤄질 수만 있으면 된 것이겠죠 ㅎㅎ

다른 게임 개발사에서는 Swarm을 어떻게 쓰고 계신지 궁금하긴하네요.
다음에는 저희는 Swarm을 어떻게 구성해서 사용하고 있는지 살펴보고 포스트할 수 있는게 있다면 남겨보겠습니다. 감사합니다~