shinhancard / dev-portal

Shinhancard developer portal public github repository
Apache License 2.0
9 stars 2 forks source link

feat: 컴포넌트 세팅 관련 설계 #27

Closed jobum97 closed 1 year ago

jobum97 commented 1 year ago

Description

backstage에서 프로젝트 initialize할 때 컴포넌트(프레임워크, 라이브러리, 디비, 플랫폼 등등)들을 어떻게 조합시켜줄지에 대한 설계

Ex) Spring boot x.xx 버전 + lombok, tomcat 등 라이브러리 + postgreSql + gitLab 등... 으로 유저가 설정시 설정한 컴포넌트들을 조합하여 하나의 프로젝트로 initialize

jobum97 commented 1 year ago
image

yaml 파일로 템플릿 내용 관리

jobum97 commented 1 year ago

image app-config.yaml 파일에 추가할 템플릿 내용 추가 내용에 맞는 경로에 template 파일 추가시 템플릿 추가되는 모습 확인

jobum97 commented 1 year ago

image gitlab plugin 적용 후 레포지토리 생성할 수 있는 Host (github, gitlab...etc)이 늘어난 모습

jobum97 commented 1 year ago

현재 환경설정 신기술 쪽 주관으로 만든 F/W (core, batch-core) F/W 가 전문 파싱이나, Redis 나 뭔가 공통적인 기능들을 구현해주고 + 디펜던시들도 주입해 core개발쪽에서 이걸로 개발을 할때 위의 F/W 주입을 받아 추가적으로 필요한 것들은 Nexus에서 주입해서 쓴다.

jobum97 commented 1 year ago

back/front => 어떤 기술 스택을 쓸것인지? => 버전 =>

  1. 신기술에서 만든 F/W 어떤거 받아서 쓸지 - 버전 Snapshot 4... 선택까지??
  2. 추가적인 라이브러리 주입
  3. 디비 연결
  4. 도커 파일 만들어주기?
  5. 인코딩
hemoi commented 1 year ago

ref ) spring io init https://start.spring.io/

spring boot grpc backstage template https://github.dev/backstage/software-templates/blob/main/scaffolder-templates/springboot-grpc-template/template.yaml

hellices commented 1 year ago

현재 환경설정 신기술 쪽 주관으로 만든 F/W (core, batch-core) F/W 가 전문 파싱이나, Redis 나 뭔가 공통적인 기능들을 구현해주고 + 디펜던시들도 주입해 core개발쪽에서 이걸로 개발을 할때 위의 F/W 주입을 받아 추가적으로 필요한 것들은 Nexus에서 주입해서 쓴다.

컴포넌트 세팅에서 프레임워크나 라이브러리를 선택할 수 있게 할 수 있을까? start.spring.io처럼

hellices commented 1 year ago

브랜치는 feature/{camelNaming} 으로 따는게 어떨까요?

jobum97 commented 1 year ago

현재 환경설정 신기술 쪽 주관으로 만든 F/W (core, batch-core) F/W 가 전문 파싱이나, Redis 나 뭔가 공통적인 기능들을 구현해주고 + 디펜던시들도 주입해 core개발쪽에서 이걸로 개발을 할때 위의 F/W 주입을 받아 추가적으로 필요한 것들은 Nexus에서 주입해서 쓴다.

컴포넌트 세팅에서 프레임워크나 라이브러리를 선택할 수 있게 할 수 있을까? start.spring.io처럼

이를 목표로 실현 가능한지 알아보겠습니다!

jobum97 commented 1 year ago

템플릿 수정 기능 - yaml 파일 동적으로 생성하는 기능 필요 템플릿 선택 인자 => yaml 파일에 넣기 선택 인자로 Nexus? 에서 소스 들고와서 하나의 프로젝트로 설정해주는 부분 필요 Nexus 플러그인 존재X 고로 이 부분에 대한 플러그인 개발 필요 혹은 우회 방법 필요

Spring 세팅시 프로젝트 구조, gradle, docker file 을 세팅하여 spring 최초 세팅을 쉽게 진행 이때 템플릿에서 선택한 인자들로 어떻게 이를 설정할 것인가? => action을 설정하면 될 것 같음

jobum97 commented 1 year ago

gitlab, Jenkins, argoCd 연결은 플러그인 존재 => 내부에 맞게 조금만 건들면 될 것으로 예상

hemoi commented 1 year ago

custom action

https://backstage.io/docs/features/software-templates/writing-custom-actions

hemoi commented 1 year ago
image

ref https://github.dev/backstage/software-templates/blob/main/scaffolder-templates/springboot-grpc-template/template.yaml

result https://github.com/hemoi/bs_spring_boot_grpc_test

hellices commented 1 year ago

템플릿 수정 기능 - yaml 파일 동적으로 생성하는 기능 필요 템플릿 선택 인자 => yaml 파일에 넣기 선택 인자로 Nexus? 에서 소스 들고와서 하나의 프로젝트로 설정해주는 부분 필요 Nexus 플러그인 존재X 고로 이 부분에 대한 플러그인 개발 필요 혹은 우회 방법 필요

Spring 세팅시 프로젝트 구조, gradle, docker file 을 세팅하여 spring 최초 세팅을 쉽게 진행 이때 템플릿에서 선택한 인자들로 어떻게 이를 설정할 것인가? => action을 설정하면 될 것 같음

템플릿에서 spring boot로 구성을 시작할 때, 추가하는 라이브러리를 검색해서 추가할 수 있을까??? like start.spring.io

jobum97 commented 1 year ago

템플릿 수정 기능 - yaml 파일 동적으로 생성하는 기능 필요 템플릿 선택 인자 => yaml 파일에 넣기 선택 인자로 Nexus? 에서 소스 들고와서 하나의 프로젝트로 설정해주는 부분 필요 Nexus 플러그인 존재X 고로 이 부분에 대한 플러그인 개발 필요 혹은 우회 방법 필요 Spring 세팅시 프로젝트 구조, gradle, docker file 을 세팅하여 spring 최초 세팅을 쉽게 진행 이때 템플릿에서 선택한 인자들로 어떻게 이를 설정할 것인가? => action을 설정하면 될 것 같음

템플릿에서 spring boot로 구성을 시작할 때, 추가하는 라이브러리를 검색해서 추가할 수 있을까??? like start.spring.io

현재 스켈레톤 코드로 한번에 말아서 올리는 것은 되는 것을 확인했는데,... (= 템플릿을 정의해둔 것을 그대로 만들어 주는 것, 기존의 깃랩 등에서 정리되어 있는 누군가의 레포지토리 복사해오는 방식과 유사) start.spring.io 처럼 필요한 라이브러리를 하나하나 고르는 것에 대한 부분은 어떻게 해야할지 파악 못하고 있습니다

hellices commented 1 year ago

템플릿 수정 기능 - yaml 파일 동적으로 생성하는 기능 필요 템플릿 선택 인자 => yaml 파일에 넣기 선택 인자로 Nexus? 에서 소스 들고와서 하나의 프로젝트로 설정해주는 부분 필요 Nexus 플러그인 존재X 고로 이 부분에 대한 플러그인 개발 필요 혹은 우회 방법 필요 Spring 세팅시 프로젝트 구조, gradle, docker file 을 세팅하여 spring 최초 세팅을 쉽게 진행 이때 템플릿에서 선택한 인자들로 어떻게 이를 설정할 것인가? => action을 설정하면 될 것 같음

템플릿에서 spring boot로 구성을 시작할 때, 추가하는 라이브러리를 검색해서 추가할 수 있을까??? like start.spring.io

현재 스켈레톤 코드로 한번에 말아서 올리는 것은 되는 것을 확인했는데,... (= 템플릿을 정의해둔 것을 그대로 만들어 주는 것, 기존의 깃랩 등에서 정리되어 있는 누군가의 레포지토리 복사해오는 방식과 유사) start.spring.io 처럼 필요한 라이브러리를 하나하나 고르는 것에 대한 부분은 어떻게 해야할지 파악 못하고 있습니다

ref) https://engineering.premise.com/dynamic-data-on-backstage-templates-ad8a0ae316e1 additional - https://roadie.io/docs/scaffolder/writing-templates/

hellices commented 1 year ago

사내에서 시작하는 프로젝트는 기본 템플릿을 몇개 지정할 필요 있음. 너무 자유도를 주면 오히려 안쓰게 될지도?

hemoi commented 1 year ago
  1. ScaffolderFieldExtensions가 @backstage/plugin-scaffolder 에서 deprecated 되었기에 @backstage/plugin-scaffolder-react 에 있는 ScaffolderFieldExtension을 사용해야함
image
  1. 공식 docs를 성실하게 따라하지 않은 경우 ScaffolderFieldExtensions가 존재하지 않을텐데 해당 경우에는 App.tsx Route /create 부분을 다음과 같이 수정하면 된다
    <Route path="/create" element={<ScaffolderPage />}>
      <ScaffolderFieldExtensions>
        <DynamicPickFieldExtension />
      </ScaffolderFieldExtensions>
    </Route>

사용법은 ui:field를 그대로 사용하면 되는데 dummy json 을 사용하여 category를 선택할 수 있도록 template.yaml 파일 Properties에 추가하면

    - title: Choose a Category
      required:
        - category
      properties:
        category:
          title: Category
          type: string
          ui:field: DynamicPickExtension
          ui:options:
            external_data: https://dummyjson.com/products/categories

image

문제 없이 사용할 수 있다

jobum97 commented 1 year ago

각 관리자에서 라이브러리 관리 화면 => backstage DB에 템플릿 관련 정보 저장 => 이를 유저가 사용?

jobum97 commented 1 year ago
image

template 을 통해 어떤 input 값을 받을지 설정 backstage에서 input 값 입력하면 skeleton 소스들에 input 값을 넣어주어 패키지 생성하는 방식으로 작동

jobum97 commented 1 year ago

spring.io 프로젝트 에서는 어떻게 gradle이나 maven 파일을 만들어주는지 참고해보고자 함

jobum97 commented 1 year ago

spring.io 프로젝트 에서는 어떻게 gradle이나 maven 파일을 만들어주는지 참고해보고자 함

spring.io/start.spring.io 프론트에서 설정값 받고 spring.io/initializr 에서 넘겨받아 meta-data, dependency 등 각각 처리하며 file write를 해서 직접 하나씩 조립해서 만드는 방식으로 파악

dependency write 하는 부분 이러한 메소드를 입력받는 디펜던시 리스트를 반복문으로 돌면서 처리 image

GradleBuildWriter.java GradleBuildWriter.java의 구현체 중 하나 GroovyDslGradleBuildWriter.java

jobum97 commented 1 year ago

조사하면서 든 생각으로는 dependency를 spring.io 에서 하듯이 하나하나 설정해주는 기능이 들어가려면 spring.io 처럼 프로젝트의 유형 (spring의 경우 gradle, maven, java,kotlin 등...)에 따라 맞춰서 파일들을 write 하는 방식으로 가야하지 않을까 싶은데... 그러면 공수가 너무나 커지지 않을까 라는 우려가 듬

기본적인 dependency의 경우 템플릿을 관리할 때 어떤 dependency를 넣고 어떤 버전을 사용할지 같이 관리하여 진행하면 기존의 skeleton 코드에 input값을 넣어 프로젝트 세팅해줄 수 있을 것이라 생각함

hellices commented 1 year ago

프레임워크 및 공통 라이브러리 관리 프로세스를 생각해보면

  1. 초기 개발 -> SNAPSHOT 버전으로 backstage에 등록.
  2. 배포버전 1.0 -> RELEASE 버전으로 backstage에 업데이트 -> 앱 개발 시 주입하여 사용할 것
  3. 배포버전 1.1 -> RELEASE 버전으로 backstage에 업데이트 -> 현재 1.0 버전을 주입받아서 사용하고 있는 프로젝트에게 announce해줌

그러므로 프레임워크나 공통 라이브러리를 등록하는 템플릿에서 gradle / maven 등에 주입할 수있는 groupid/artifactid/version 등을 정확히 기입할 수 있도록 템플릿을 제공할 필요 있음

또한 등록할 때 해당 프레임워크/라이브러리에 대한 간략한 설명을 넣도록 하여 다른 템플릿에서 설명이 자동으로 보일 수 있도록 하면 좋을것

hemoi commented 1 year ago
빠른 메모 5 P1 빠른 메모 5 P1 2 빠른 메모 5 P1 3

현재 생각하고 있는 flow 입니다! 의견있으시면 달아주세요! @hellices @seowjin1060 @dev-shin @YOOMYE89 @wijihoon

hellices commented 1 year ago

프레임워크 관리자

Image

소프트웨어 관리자

Image

drawio link

hemoi commented 1 year ago

와이어프레임 https://www.figma.com/file/eWruaiCv1MSjrwujLjtwAD/backstage?type=design&node-id=0%3A1&mode=design&t=itY3pcFqTsdjrAf5-1

hemoi commented 1 year ago

신규 이슈 생성

컴포넌트 화면 개발

Manage

@hellices @jobum97 검토해주신 이후에 이 이슈는 닫도록 하겠습니다 : )

jobum97 commented 1 year ago

신규 이슈 생성

컴포넌트 화면 개발

Manage

@hellices @jobum97 검토해주신 이후에 이 이슈는 닫도록 하겠습니다 : )

좋다고 생각합니다