Dev Tools 메뉴에서는 개발 과정에 필요한 Open Source 툴 들을 제공합니다. 제공되는 도구로는 형상 관리 도구인 Gitea, 소프트웨어 Binary 관리 및 Proxy 를 위한 Sonatype Nexus, Image 저장을 위한 Harbor 가 있습니다. 이 페이지에서는 각 툴의 간단한 사용 방법에 대해 알아보겠습니다.
Source Repository - Gitea
Git 솔루션은 크게 구축형 솔루션과 클라우드 솔루션으로 나뉩니다. 대표적인 클라우드 솔루션으로 Github 이 있습니다. 클라우드 솔루션을 사용하는 경우 퍼블릭 망이기 때문에 보안 문제나 비용 문제가 발생할 수 있습니다. Modernization Platform 에서는 구축형 솔루션인 Gitea 를 기본으로 제공합니다. Gitea 의 계정과 권한은 Modernization Platform 의 계정, 권한과 연동이 됩니다.
Gitea 에 접속하기
콘솔 화면의 프로젝트 메뉴 Dev Tools > Source 를 통해 접근 가능합니다.
Gitea 의 계정은 콘솔에 로그인한 계정과 연동됩니다. 최초 접속 시 비밀번호를 입력하게 되며, 이때 입력하는 비밀번호를 통해 Git 에 pull, push 등의 명령어를 수행할 수 있습니다.
사용자에게 사용 권한 부여하기
프로젝트 멤버에게 Gitea 의 사용 권한을 부여하는 것은 프로젝트 어드민 또는 user-administrator 역할을 가진 사용자만 가능합니다.
콘솔 화면의 프로젝트 메뉴 Administrator > Members 로 이동합니다. 권한을 부여 할 사용자 ID 또는 edit 버튼을 클릭하여 상세 화면으로 이동합니다.
사용자에게 Role 을 직접 부여하거나 Role 을 가지고 있는 Group 에 사용자를 추가하여 권한을 부여할 수 있습니다. 사용자에게 여러가지 권한이 동시에 부여된 경우 가장 높은 권한이 적용되게 됩니다.
Repository(저장소) 생성하기
Git Repository 란 파일이나 폴더를 저장하여 관리하는 저장소입니다. 보통 어플리케이션 별로 Repository를 하나씩 생성하여 사용합니다.
Gitea 에서 Repository 는 자신의 계정 또는 조직(Organization) 하위에 생성할 수 있습니다. 자신의 계정 하위에는 누구나 Repository 생성이 가능합니다. 조직의 하위에 Repository 를 생성하려면 해당 조직에 Repository 를 생성할 수 있는 권한이 필요합니다. 콘솔에서 git-administrator 또는 git-writer 역할을 부여받은 사용자만 조직 하위에 Repository 생성이 가능합니다. Modernization platform v2.0 에서 Gitea 의 조직은 콘솔의 Project 와 1:1 로 맵핑되어 관리됩니다. 조직 명은 {realm}-{project} 로 생성됩니다.
조직 우측 상단의 + 버튼을 클릭하여 새 저장소를 선택하거나 조직명 아래에 있는 새 저장소 버튼을 클릭합니다.
필수값인 소유자와 저장소 이름을 입력하고 저장소 만들기 버튼을 클릭합니다.
소유자 : 저장소를 개인 계정 하위에 생성할지 조직 하위에 설정할지 결정합니다.
저장소 이름 : 저장소 (Repository) 의 이름을 입력합니다.
가시성 : Repository 를 public 으로 만들지 여부를 선택합니다. public 으로 만들 경우 Gitea 에 로그인하지 않은 anonymous 사용자도 Repository 의 소스를 볼 수 있습니다.
설명 : Repository 에 대한 설명을 입력합니다.
Issue Labels : Repository 에 Issue 를 등록할 때 사용 할 수 있는 Label set 을 지정 할 수 있습니다.
.gitignore : Gitea 에서는 Language 별로 .gitignore 파일 샘플을 제공합니다. 원하는 .gitignore 를 선택합니다.
라이센스 : 해당 Repository 의 라이센스를 선택할 수 있습니다.
README : Repository 의 Readme 파일 생성 여부를 선택할 수 있습니다.
저장소 초기화 : 체크하고 저장소 만들기를 할 경우 6, 7, 8 에서 선택한 파일들이 자동으로 추가됩니다.
저장소 만들기 : 저장소가 생성됩니다.
소스 내려 받기
레파지토리의 소스 코드는 git cli 를 통해 내려받을 수 있습니다. 레파지토리의 메인 화면에서 체크아웃 URL 을 확인할 수 있습니다.
$ git clone https://GITEA-URL/realm-myproject/my-application.git Cloning into 'my-application'... Username for 'https://GITEA_URL': testuser Password for 'https://testuser@GITEA_URL': remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done.
소스 코드를 최초에 내려받는 경우 git clone 커맨드를 사용해 내려받을 수 있습니다. 한번 소스를 내려받은 후 변경 사항을 내려받을 때는 git pull 을 사용합니다.
소스 올리기
로컬에 추가, 변경한 소스 코드를 git cli 를 통해 업로드 할 수 있습니다.
변경 된 소스 코드 목록 확인 - git status
$ git status On branch master Your branch is up to date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed) Application.java nothing added to commit but untracked files present (use "git add" to track)
Application.java 라는 파일이 추가되었지만 Untracked 상태인 것을 확인할 수 있습니다. Git 은 Untracked 상태인 파일들을 Commit 대상에 넣지 않습니다.
변경 한 소스 코드 추적(tracking)하기 - git add
$ git add Application.java $ git status On branch master Your branch is up to date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: Application.java
git add 실행 후 다시 status 를 확인하면 파일이 추적 목록에 포함된 것을 확인할 수 있습니다.
소스 코드 commit 하기 - git commit
$ git commit -m "Add Application.java" [master 76f4940] Add Application.java 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Application.java
git commit 명령어를 사용하면 변경 된 파일을 commit 할 수 있습니다. 이때 commit 은 Local Repository 에 commit 한 것을 의미하며, remote (Gitea 서버) 에 업로드 하기 위해서는 git push 까지 실해야 합니다.
git commit 전에 commit 할 사용자 정보가 설정되어 있어야 합니다.
$ git config --global user.email "testuser@sk.com" $ git config --global user.name "user name"
소스 코드 업로드 하기 - git push
$ git push origin BRANCH_NAME Username for 'https://GITEA_URL': testuser Password for 'https://testuser@GITEA_URL': Counting objects: 3, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 289 bytes | 289.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: . Processing 1 references remote: Processed 1 references in total To https://GITEA_URL/realm-myproject/my-application.git 40cddcc..76f4940 master -> master
git push 명령어 뒤의 origin 은 remote 레파지토리 (gitea 서버) 를 의미합니다. BRANCH_NAME 은 소스를 업로드 할 git 의 branch 명을 입력합니다.
참고 문서
Gitea 공식 가이드
Git 사용법
Nexus
Nexus 는 Sonatype 에서 만든 저장소 관리 툴입니다. Java Library, Node module, Container Image 등 다양한 Format 의 저장소를 만들 수 있습니다. 직접 개발한 Library 를 업로드 하거나, 메인 저장소 (Maven Repository, NPM Repository 등) Mirror 로 사용할 수 있습니다.
일반 사용자는 Nexus 에 로그인할 수 있는 계정을 발급하지 않으므로, Repository 생성 등 사용이 필요한 경우 관리자에게 요청하셔야 합니다.
콘솔 화면의 프로젝트 메뉴 Dev Tools > Nexus 를 통해 접근 가능합니다.
Nexus 의 Browse 메뉴에 접속하면 Repository 목록을 확인할 수 있습니다. Repository 의 maven, npm 등의 Format 이 존재합니다. 각 Format 별로 proxy, hosted, group 3가지 타입을 설정할 수 있습니다. proxy 는 말 그대로 외부의(M2 repository 등) Repository 를 proxy 하는 Repository 입니다. 이 proxy 타입의 Repository 를 통해 외부 Repository 의 데이터를 캐시하고 폐쇄된 환경에서도 라이브러리를 받을 수 있게 됩니다. hosted 는 직접 만든 라이브러리를 업로드 할 수 있는 Repository 입니다. group 은 proxy 와 hosted Repository 들을 묶을 수 있는 Repository 입니다. Group 으로 묶어놓은 순서에 따라 차례대로 라이브러리가 존재하는지 검색합니다.
Maven Mirror 로 사용하기
로컬 개발 환경이나 CI 빌드 환경이 private(폐쇄망)인 경우 public (internet) 에 있는 메인 저장소에서 라이브러리를 받지 못하는 경우가 있습니다. 이런 경우 Nexus 를 Mirror 로 사용하여 라이브러리를 받을 수 있습니다.
settings.xml 파일을 이용하면 pom.xml 파일을 수정하지 않고 maven 의 동작 방식을 변경할 수 있습니다.
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <mirrors> <mirror> <id>modernizationplatform</id> <name>Modernization Platform Nexus</name> <url>NEXUS_REPOSITORY_URL</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> ... </settings>
Nexus 의 Repository 는 각각 URL 을 가지고 있습니다. Repository 목록에서 URL copy 버튼을 클릭하면 해당 Repository 의 URL 을 얻을 수 있습니다. settings.xml 파일의 NEXUS_REPOSTIROY_URL 은 Repository 의 URL 을 입력합니다. 일반적으로 proxy와 hosted 를 묶은 group type 의 Repository 를 사용합니다.
mirrorOf 는 pom.xml 파일에 지정해둔 repository 의 id 를 입력합니다. Maven 에서는 pom.xml 파일에 repository 를 따로 지정하지 않은 경우 default 로 central (https://repo.maven.apache.org/maven2) 을 사용합니다. 모든 라이브러리를 Nexus 를 통해 받으려면 mirrorOf 를 * 로 지정합니다.
예시처럼 settings.xml 파일을 작성하고 사용중인 IDE (eclipse, vscode, intelliJ 등) 환경에 맞춰 settings.xml 파일을 바라보도록 설정합니다.
Gradle Proxy 로 사용하기
Gradle 을 사용할 경우에도 Nexus 를 라이브러리 저장소로 활용하여 빌드를 수행할 수 있습니다.
프로젝트의 build.gradle 파일의 내용을 아래처럼 수정합니다.
repositories { // mavenCentral() maven { url "NEXUS_REPOSITORY_URL" } }
일반적으로 mavenCentral() 을 통해 maven central (https://repo.maven.apache.org/maven2) 을 사용합니다. 이 부분을 제거하고 Nexus 를 바라보도록 설정을 변경하면 됩니다.
Harbor
어플리케이션을 Container 로 실행하려면 Container Image 를 빌드해야 하고, 해당 Image 를 저장 할 Image 저장소가 필요합니다. 가장 널리 알려진 서비스 형태의 저장소로 Docker Hub 이 있습니다. Docker Hub 을 사용 할 경우 비용이나 보안 문제가 있을 수 있기 때문에, Modernization Platform 에서는 설치형 저장소인 Harbor 를 제공합니다.
Harbor 는 설치형 오픈 소스 Image 저장소입니다. Container Image, Helm chart 의 저장소로 사용되며, 역할에 따른 접근 제어, 이미지 취약점 검사 등의 기능을 제공합니다.
Harbor 접속하기
콘솔의 프로젝트 메뉴에서 Dev Tools > Images 를 통해 접속 가능합니다.
Harbor 의 계정은 콘솔의 계정과 연동됩니다. Modernization platform v2.0 에서 최초 사용자 생성 시에는 아직 Harbor 에 계정이 없는 상태가 됩니다. 해당 계정으로 Modernization platform 콘솔에 로그인 후 Harbor 에 접속하면 자동으로 Harbor 계정이 생성됩니다.
사용자에게 Harbor 사용 권한 부여하기
프로젝트 멤버에게 Harbor 의 사용 권한을 부여하는 것은 프로젝트 어드민 또는 user-administrator 역할을 가진 사용자만 가능합니다.
Harbor 의 권한 관리는 프로젝트 별로 설정이 가능합니다. Modernization platform v2.0 에 프로젝트를 생성하면 Harbor 에 프로젝트가 자동으로 생성이 되고, 콘솔에서 사용자에게 권한을 부여하면 Harbor 의 프로젝트에 자동으로 권한이 추가됩니다.
콘솔 화면의 프로젝트 메뉴 Administrator > Members 로 이동합니다. 권한을 부여 할 사용자 ID 또는 edit 버튼을 클릭하여 상세 화면으로 이동합니다.
사용자에게 Role 을 직접 부여하거나 Role 을 가지고 있는 Group 에 사용자를 추가하여 권한을 부여할 수 있습니다. 사용자에게 여러가지 권한이 동시에 부여된 경우 가장 높은 권한이 적용되게 됩니다.
Image 업로드 하기
업로드 할 Image 에 tag 추가하기
Harbor 에 Image 를 업로드 하려면 해당 Image 에 Harbor 의 URL 과 tag 를 부여해야 합니다.
$ docker tag {IMAGE_NAME}:{TAG} {HARBOR_URL}/{PROJECT}/{IMAGE_NAME}:{TAG}
IMAGE_NAME : 업로드 할 원본 이미지의 이미지 명입니다.
TAG : 업로드 할 원본 이미지의 이미지 태그입니다.
HARBOR_URL : Harbor 의 접속 URL 입니다. 프로토콜을 제거한 Harbor 의 도메인명만 사용합니다. ex) harbor.cloudzcp.net
PROJECT : Harbor 에 생성되어 있는 프로젝트 명을 입력합니다.
Docker login
로컬 환경의 Image 를 Harbor 에 업로드 하려면 Harbor 의 계정과 CLI Secret 으로 인증 (docker login)을 해야 합니다. 이때 사용하는 로그인 계정 명은 콘솔의 사용자 계정명과 동일합니다. CLI Secret 은 아래처럼 조회할 수 있습니다.
Harbor 화면에서 우측 상단의 사용자 명 > User Profile 메뉴를 클릭합니다.
팝업 창의 CLI secret copy 버튼을 클릭하면 secret 이 클립보드에 복사됩니다.
$ docker login tworld-registry.skt.cloudzcp.com Username: {USERNAME} Password: {CLI_SECRET} Login Succeeded
USERNAME : 사용자의 로그인 계정을 입력합니다.
Password : 위에서 복사한 CLI secret 값을 입력합니다.
Image 업로드
docker push 커맨드를 이용해 Harbor 에 Image 업로드를 수행합니다.
$ docker push {HARBOR_URL}/{PROJECT}/{IMAGE_NAME}:{TAG} The push refers to repository [{HARBOR_URL}/{PROJECT}/{IMAGE_NAME}] cfd97936a580: Pushed latest: digest: sha256:febcf61cd6e1ac9628f6ac14fa40836d16f3c6ddef3b303ff0321606e55ddd0b size: 527
{HARBOR_URL}/{PROJECT}/{IMAGE_NAME}:{TAG}
값은 위에서 tag 를 추가한 값을 사용합니다.
Image 다운받기
docker pull 커맨드를 이용해 Harbor 에서 Image 를 다운받습니다.
Harbor 의 프로젝트가 Private 인 경우 (대부분 Private 입니다.) Image 업로드할때처럼 docker login 을 먼저 수행해야 합니다.
$ docker pull {HARBOR_URL}/{PROJECT}/{IMAGE_NAME}:{TAG} latest: Pulling from {PROJECT}/{IMAGE_NAME} 24fb2886d6f6: Pull complete Digest: sha256:febcf61cd6e1ac9628f6ac14fa40836d16f3c6ddef3b303ff0321606e55ddd0b Status: Downloaded newer image for {HARBOR_URL}/{PROJECT}/{IMAGE_NAME}:{TAG}
{HARBOR_URL}/{PROJECT}/{IMAGE_NAME}:{TAG}
값은 위에서 tag 를 추가한 값을 사용합니다.