

Amazon CodeCatalyst는 더 이상 신규 고객에게 공개되지 않습니다. 기존 고객은 정상적으로 서비스를 계속 이용할 수 있습니다. 자세한 내용은 [CodeCatalyst에서 마이그레이션하는 방법](migration.md) 단원을 참조하십시오.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 워크플로에 패키지 리포지토리 연결
<a name="workflows-packages"></a>

*패키지*는 소프트웨어와 모든 종속성을 해결하고 소프트웨어를 설치하는 데 필요한 메타데이터를 포함한 번들입니다. CodeCatalyst는 npm 패키지 형식을 지원합니다.

패키지는 다음으로 구성됩니다.
+ 이름(예: `webpack`는 널리 사용되는 npm 패키지의 이름)
+ 선택적 [네임스페이스](packages-concepts.md#packages-concepts-package-namespaces)(예: `@types/node`의 `@types`)
+ [버전](packages-concepts.md#packages-concepts-package-versions) 세트(예: `1.0.0`, `1.0.1`, `1.0.2`)
+ 패키지 수준 메타데이터(예: npm dist 태그)

CodeCatalyst에서는 워크플로에서 CodeCatalyst 패키지 리포지토리에 패키지를 게시하고 패키지를 사용할 수 있습니다. CodeCatalyst 패키지 리포지토리로 빌드 또는 테스트 작업을 구성하여 지정된 리포지토리에서 패키지를 푸시 및 풀링하도록 작업의 npm 클라이언트를 자동으로 구성할 수 있습니다.

패키지에 대한 자세한 내용은 [CodeCatalyst에서 소프트웨어 패키지 게시 및 공유](packages.md) 섹션을 참조하세요.

**참고**  
현재 빌드 및 테스트 작업은 CodeCatalyst 패키지 리포지토리를 지원합니다.

**Topics**
+ [자습서: 패키지 리포지토리에서 가져오기](packages-tutorial.md)
+ [워크플로에서 CodeCatalyst 패키지 리포지토리 지정](workflows-package-specify-action.md)
+ [워크플로 작업에서 권한 부여 토큰 사용](workflows-package-export-token.md)
+ [예시: 워크플로의 패키지 리포지토리](workflows-working-packages-ex.md)

# 자습서: 패키지 리포지토리에서 가져오기
<a name="packages-tutorial"></a>

이 자습서에서는 [CodeCatalyst 패키지 리포지토리](packages-concepts.md#packages-concepts-repository)에서 종속성을 가져오는 애플리케이션을 실행하는 워크플로를 생성하는 방법을 알아봅니다. 이 애플리케이션은 CodeCatalyst 로그에 'Hello World' 메시지를 출력하는 간단한 Node.js 앱입니다. 이 애플리케이션에는 단일 종속성으로 [lodash](https://www.npmjs.com/package/lodash) npm 패키지가 있습니다. `lodash` 패키지는 `hello-world` 문자열을 `Hello World`로 변환하는 데 사용됩니다. 이 패키지의 버전 4.17.20을 사용합니다.

애플리케이션 및 워크플로를 설정한 후 CodeCatalyst가 퍼블릭 외부 레지스트리([npmjs.com](https://www.npmjs.com/))에서 CodeCatalyst 패키지 리포지토리로 `lodash`의 추가 버전을 가져오는 것을 차단하도록 구성합니다. 그런 다음 `lodash`의 추가 버전이 성공적으로 차단되었는지 테스트합니다.

이 자습서를 마치면 워크플로가 CodeCatalyst 내부 및 외부의 패키지 리포지토리와 상호 작용하는 방식을 잘 이해하여 패키지를 검색할 수 있습니다. 또한 npm, 패키지 리포지토리, 워크플로 및 애플리케이션의 `package.json` 파일 간에 발생하는 백그라운드 상호 작용도 이해해야 합니다.

**Topics**
+ [사전 조건](#packages-tutorial-prereqs)
+ [1단계: 소스 리포지토리 생성](#packages-tutorial-source-repo)
+ [2단계: CodeCatalyst 및 게이트웨이 패키지 리포지토리 생성](#packages-tutorial-package-repo)
+ [3단계: 'Hello World' 애플리케이션 생성](#packages-tutorial-create-app)
+ [4단계: 'Hello World'를 실행하는 워크플로 생성](#packages-tutorial-create-workflow)
+ [5단계: 워크플로 확인](#packages-tutorial-verify)
+ [6단계: npmjs.com 가져오기 차단](#packages-tutorial-block)
+ [7단계: 차단 기능 테스트](#packages-tutorial-test-block)
+ [정리](#packages-tutorial-cleanup)

## 사전 조건
<a name="packages-tutorial-prereqs"></a>

시작하기 전:
+ CodeCatalyst **스페이스**가 필요합니다. 자세한 내용은 [스페이스 생성](spaces-create.md) 섹션을 참조하세요.
+ CodeCatalyst 스페이스에는 다음과 같은 빈 프로젝트가 필요합니다.

  ```
  codecatalyst-package-project
  ```

  **처음부터 시작** 옵션을 사용하여 이 프로젝트를 생성합니다.

  자세한 내용은 [Amazon CodeCatalyst에서 빈 프로젝트 생성](projects-create.md#projects-create-empty) 단원을 참조하십시오.

## 1단계: 소스 리포지토리 생성
<a name="packages-tutorial-source-repo"></a>

이 단계에서는 CodeCatalyst에 소스 리포지토리를 생성합니다. 이 리포지토리에는 `index.js` 및 `package.json` 파일과 같은 자습서의 소스 파일이 저장됩니다.

소스 리포지토리에 대한 자세한 정보는 [소스 리포지토리 생성](source-repositories-create.md) 섹션을 참조하세요.

**소스 리포지토리를 생성하려면**

1. [https://codecatalyst.aws/](https://codecatalyst.aws/)에서 CodeCatalyst 콘솔을 엽니다.

1. `codecatalyst-package-project` 프로젝트로 이동합니다.

1. 탐색 창에서 **코드**를 선택한 다음 **소스 리포지토리**를 선택합니다.

1. **리포지토리 추가**를 선택하고 **리포지토리 생성**을 선택합니다.

1. **리포지토리 이름**에 다음과 같이 입력합니다.

   ```
   hello-world-app
   ```

1. **생성(Create)**을 선택합니다.

## 2단계: CodeCatalyst 및 게이트웨이 패키지 리포지토리 생성
<a name="packages-tutorial-package-repo"></a>

이 단계에서는 CodeCatalyst 프로젝트에서 패키지 리포지토리를 생성하고 이를 게이트웨이 리포지토리와 CodeCatalyst 프로젝트에 연결합니다. 나중에 자습서의 종속성인 `lodash`를 npmjs.com에서 두 리포지토리로 가져옵니다.

게이트웨이 리포지토리는 CodeCatalyst의 패키지 리포지토리를 퍼블릭 npmjs.com 연결하는 '접착제' 역할을 합니다.

패키지 리포지토리에 대한 자세한 내용은 [CodeCatalyst에서 소프트웨어 패키지 게시 및 공유](packages.md) 섹션을 참조하세요.

**참고**  
이 자습서에서는 *CodeCatalyst 패키지 리포지토리* 및 *게이트웨이 리포지토리*라는 용어를 사용하여 다음 절차에서 CodeCatalyst에서 생성한 두 리포지토리를 참조합니다.

**CodeCatalyst 패키지 및 게이트웨이 리포지토리를 생성하려면**

1. 탐색 창에서 **패키지**를 선택합니다.

1. **리포지토리 생성**을 선택합니다.

1. **리포지토리 이름**에 다음과 같이 입력합니다.

   ```
   codecatalyst-package-repository
   ```

1. **\$1 업스트림 리포지토리 선택**을 선택합니다.

1. **게이트웨이 리포지토리**를 선택합니다.

1. **npm-public-registry-gateway** 상자에서 **생성**을 선택합니다.

1. **선택**을 선택하세요.

1. **생성(Create)**을 선택합니다.

   CodeCatalyst는 게이트웨이 리포지토리에 연결된 `codecatalyst-package-repository`라는 패키지 리포지토리를 생성합니다. 게이트웨이 리포지토리는 npmjs.com 레지스트리에 연결됩니다.

## 3단계: 'Hello World' 애플리케이션 생성
<a name="packages-tutorial-create-app"></a>

이 단계에서는 'Hello World' Node.js 애플리케이션을 생성하고 해당 종속성(`lodash`)을 게이트웨이 및 CodeCatalyst 패키지 리포지토리로 가져옵니다.

애플리케이션을 생성하려면 Node.js와 연결된 `npm` 클라이언트가 설치된 개발 시스템이 필요합니다.

이 자습서에서는 CodeCatalyst 개발 환경을 개발 시스템으로 사용할 것이라고 가정합니다. CodeCatalyst 개발 환경을 사용할 필요는 없지만, 깨끗한 작업 환경을 제공하고 Node.js 및 `npm`가 사전 설치되어 있으며 자습서를 완료하고나서 쉽게 삭제할 수 있으므로 사용하는 것이 좋습니다. CodeCatalyst 개발 환경에 대한 자세한 내용은 [개발 환경 생성](devenvironment-create.md) 섹션을 참조하세요.

다음 지침을 사용하여 CodeCatalyst 개발 환경을 시작하고 이를 사용하여 'Hello World' 애플리케이션을 생성합니다.

**CodeCatalyst 개발 환경을 시작하려면**

1. 탐색 창에서 **코드**를 선택한 다음 **개발 환경**을 선택합니다.

1. 상단 근처에서 **개발 환경 생성**을 선택한 다음 **AWS Cloud9 (브라우저에서)**를 선택합니다.

1. **리포지토리**가 `hello-world-app`로 설정되어 있고 **기존 브랜치**가 `main`로 설정되어 있는지 확인합니다. **생성(Create)**을 선택합니다.

   개발 환경이 새 브라우저 탭에서 시작되고 리포지토리(`hello-world-app`)가 복제됩니다.

1. 두 CodeCatalyst 브라우저 탭을 모두 열어 두고 다음 절차로 이동합니다.

**'Hello World' Node.js 애플리케이션을 생성하려면**

1. 개발 환경으로 이동합니다.

1. 터미널 프롬프트에서 `hello-world-app` 소스 리포지토리 루트 디렉터리로 변경합니다.

   ```
   cd hello-world-app
   ```

1. Node.js 프로젝트 초기화:

   ```
   npm init -y
   ```

   초기화는 `hello-world-app`의 루트 디렉터리에 `package.json` 파일을 생성합니다.

1. 개발 환경의 npm 클라이언트를 CodeCatalyst 패키지 리포지토리에 연결합니다.

   1. CodeCatalyst 콘솔로 전환합니다.

   1. 탐색 창에서 **패키지**를 선택합니다.

   1. `codecatalyst-package-repository`을 선택합니다.

   1. **리포지토리에 연결**을 선택합니다.

   1. **토큰 생성**을 선택합니다. 개인 액세스 토큰(PAT)이 생성됩니다.

   1. **복사**를 선택하여 해당 명령을 복사합니다.

   1. 개발 환경으로 전환합니다.

   1. `hello-world-app` 디렉터리에 있는지 확인합니다.

   1. 해당 명령을 붙여넣습니다. 다음처럼 보일 것입니다.

      ```
      npm set registry=https://packages.us-west-2.codecatalyst.aws/npm/ExampleCompany/codecatalyst-package-project/codecatalyst-package-repository/ --location project
      npm set //packages.us-west-2.codecatalyst.aws/npm/ExampleCompany/codecatalyst-package-project/hello-world-app/:_authToken=username:token-secret
      ```

1. `lodash` 버전 4.17.20 가져오기:

   ```
   npm install lodash@v4.17.20 --save --save-exact
   ```

   npm은 다음 위치에서 `lodash` 버전 4.17.20을 다음 순서로 찾습니다.
   + 개발 환경. 여기에서는 찾을 수 없습니다.
   + CodeCatalyst 패키지 리포지토리. 여기에서는 찾을 수 없습니다.
   + 게이트웨이 리포지토리. 여기에서는 찾을 수 없습니다.
   + npmjs.com. 여기에서 발견합니다.

   npm은 `lodash`를 게이트웨이 리포지토리, CodeCatalyst 패키지 리포지토리 및 개발 환경으로 가져옵니다.
**참고**  
4단계에서 npm 클라이언트를 CodeCatalyst 패키지 리포지토리에 연결하지 않았다면, npm은 `lodash`를 npmjs.com에서 직접 가져오고 두 리포지토리로는 해당 패키지를 가져오지 않았을 것입니다.

   또한 npm은 `lodash` 종속성을 사용하여 `package.json` 파일을 업데이트하고 `lodash` 및 모든 종속성을 포함하는 `node_modules` 디렉터리를 생성합니다.

1. 개발 환경으로 `lodash`를 성공적으로 가져왔는지 테스트입니다. 입력:

   ```
   npm list
   ```

   가져오기가 성공했음을 나타내는 다음 메시지가 나타납니다.

   ```
   `-- lodash@4.17.20
   ```

1. (선택 사항) `hello-world-app/package.json` 를 열고 ***빨간색으로 굵게*** 표시된 선이 추가되었는지 확인합니다.

   ```
   {
     "name": "hello-world-app",
     "version": "1.0.0",
     "description": "",
     "main": "index.js",
     "scripts": {
       "test": "echo \"Error: no test specified\" && exit 1"
     },
     "keywords": [],
     "author": "",
     "license": "ISC",
     dependencies": {
       "lodash": "4.17.20"
     }
   }
   ```

1. `/hello-world-app`에서 다음 콘텐츠로 `index.js` 파일을 생성합니다.
**작은 정보**  
개발 환경에서 측면 탐색을 사용하여 이 파일을 생성할 수 있습니다.

   ```
   // Importing lodash library
   const _ = require('lodash');
   
   // Input string
   const inputString = 'hello-world';
   
   // Transforming the string using lodash
   const transformedString = _.startCase(inputString.replace('-', ' '));
   
   // Outputting the transformed string to the console
   console.log(transformedString);
   ```

**게이트웨이 및 CodeCatalyst 패키지 리포지토리로 'lodash'를 가져왔는지 테스트하려면**

1. CodeCatalyst 콘솔로 전환합니다.

1. 탐색 창에서 **패키지**를 선택합니다.

1. **npm-public-registry-gateway**를 선택합니다.

1. `lodash`가 표시되는지 확인합니다. **최신 버전** 열은 `4.17.20`을 나타냅니다.

1. `codecatalyst-package-repository`에 대해 이 절차를 반복합니다. 가져온 패키지를 보려면 브라우저 창을 새로 고쳐야 할 수 있습니다.

**개발 환경에서 'Hello World'를 테스트하려면**

1. 개발 환경으로 전환합니다.

1. `hello-world-app` 디렉터리에 아직 있는지 확인한 다음 애플리케이션을 실행합니다.

   ```
   node index.js
   ```

   `Hello World` 메시지가 나타납니다. Node.js가 이전 단계에서 개발 환경에 다운로드한 `lodash` 패키지를 사용하여 애플리케이션을 실행했습니다.

**'node\$1modules' 디렉터리를 무시하고 'Hello World'를 커밋하려면**

1. `node_modules` 디렉터리를 무시합니다. 입력:

   ```
   echo "node_modules/" >> .gitignore
   ```

   이 디렉터리를 커밋하지 않는 것이 가장 좋습니다. 또한 이 디렉터리를 커밋하면 이 자습서의 이후 단계에 방해가 됩니다.

1. 추가, 커밋 및 푸시:

   ```
   git add .
   git commit -m "add the Hello World application"
   git push
   ```

   'Hello World' 애플리케이션 및 프로젝트 파일이 소스 리포지토리에 추가됩니다.

## 4단계: 'Hello World'를 실행하는 워크플로 생성
<a name="packages-tutorial-create-workflow"></a>

이 단계에서는 `lodash` 종속성을 사용하여 'Hello World' 애플리케이션을 실행하는 워크플로를 생성합니다. 워크플로에는 단일 *작업* 또는 `RunHelloWorldApp`라는 작업이 포함됩니다. 이 `RunHelloWorldApp` 작업에는 다음과 같은 주목할 만한 명령 및 섹션이 포함됩니다.
+ **`Packages`**

  이 섹션에서는 `npm install`를 실행할 때 작업이 연결해야 하는 CodeCatalyst 패키지 리포지토리의 이름을 나타냅니다.
+ **`- Run: npm install`** 

  이 명령은 `package.json` 파일에 지정된 종속성을 설치하도록 npm에 지시합니다. `package.json` 파일에 지정된 유일한 종속성은 `lodash`입니다. npm은 다음 위치에서 `lodash`를 찾습니다.
  + 작업을 실행하는 Docker 이미지. 여기에서는 찾을 수 없습니다.
  + CodeCatalyst 패키지 리포지토리. 여기에서 발견합니다.

  npm이 `lodash`를 찾으면 작업을 실행하는 Docker 이미지로 가져옵니다.
+ **`- Run: npm list`**

  이 명령은 해당 작업을 실행하는 Docker 이미지에 다운로드된 `lodash` 버전을 출력합니다.
+ **`- Run: node index.js`**

  이 명령은 `package.json` 파일에 지정된 종속성을 사용하여 'Hello World' 애플리케이션을 실행합니다.

`RunHelloWorldApp` 작업은 워크플로 상단 근처의 `aws/build@v1` 식별자로 표시되는 빌드 작업입니다. 빌드 작업에 대한 자세한 내용은 [워크플로로 빌드하기](build-workflow-actions.md) 섹션을 참조하세요.

다음 지침을 사용하여 CodeCatalyst 패키지 리포지토리에서 `lodash` 종속성을 가져온 다음 'Hello World' 애플리케이션을 실행하는 워크플로를 생성합니다.

**워크플로 생성**

1. CodeCatalyst 콘솔로 전환합니다.

1. 탐색 창에서 **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

1. **워크플로 생성**을 선택합니다.

1. **소스 리포지토리**에서 `hello-world-app`을 선택합니다.

1. **브랜치**에서 `main`을 선택합니다.

   워크플로 정의 파일은 선택한 소스 리포지토리 및 브랜치에 생성됩니다.

1. **생성(Create)**을 선택합니다.

1. 상단 근처에서 **YAML**을 선택합니다.

1. YAML 샘플 코드를 삭제합니다.

1. 다음 YAML 코드를 추가합니다.

   ```
   Name: codecatalyst-package-workflow
   SchemaVersion: "1.0"
   
   # Required - Define action configurations.
   Actions:
     RunHelloWorldApp:
       # Identifies the action. Do not modify this value.
       Identifier: aws/build@v1
       Compute:
         Type: Lambda
       Inputs:
         Sources:
           - WorkflowSource # This specifies your source repository. 
       Configuration:
         Steps:
           - Run: npm install
           - Run: npm list
           - Run: node index.js
         Container: # This specifies the Docker image that runs the action.
           Registry: CODECATALYST
           Image: CodeCatalystLinuxLambda_x86_64:2024_03
       Packages:
         NpmConfiguration:
           PackageRegistries:
             - PackagesRepository: codecatalyst-package-repository
   ```

   앞의 코드에서 *codecatalyst-package-repository*를 [2단계: CodeCatalyst 및 게이트웨이 패키지 리포지토리 생성](#packages-tutorial-package-repo)에서 생성한 CodeCatalyst 패키지 리포지토리의 이름으로 바꿉니다.

   이러한 파일의 속성에 대한 자세한 내용은 [빌드 및 테스트 작업 YAML](build-action-ref.md) 섹션을 참조하세요.

1. (선택 사항) 커밋하기 전에 YAML 코드가 유효한지 확인하려면 **검증**을 선택합니다.

1. **커밋**을 선택합니다.

1. **워크플로 커밋** 대화 상자에서 다음을 입력합니다.

   1. **워크플로 파일 이름**의 경우 기본값인 `codecatalyst-package-workflow`를 유지합니다.

   1. **커밋 메시지**에 다음을 입력합니다.

      ```
      add initial workflow file
      ```

   1. **리포지토리**에서 **hello-world-app**를 선택합니다.

   1. **브랜치 이름**에서 **기본**을 선택합니다.

   1. **커밋**을 선택합니다.

   이제 워크플로를 생성했습니다.

**해당 워크플로를 실행하려면**

1. 방금 생성한 워크플로(`codecatalyst-package-workflow`) 옆에 **작업**을 선택한 다음 **실행**을 선택합니다.

   워크플로 실행이 시작됩니다.

1. 상단의 녹색 알림에서 오른쪽의 실행에 대한 링크를 선택합니다. 링크는 `View Run-1234`와 같습니다.

   실행을 시작한 사람과 **RunHelloWorldApp** 작업을 보여주는 워크플로 다이어그램이 나타납니다.

1. **RunHelloWorldApp** 작업 상자를 선택하여 작업의 진행 상황을 확인합니다.

1. 실행이 완료되면 [5단계: 워크플로 확인](#packages-tutorial-verify)로 이동합니다.

## 5단계: 워크플로 확인
<a name="packages-tutorial-verify"></a>

이 단계에서는 워크플로가 `lodash` 종속성으로 'Hello World' 애플리케이션을 성공적으로 실행했는지 확인합니다.

**'Hello World' 애플리케이션이 종속성을 사용하여 실행되었는지 확인하려면**

1. 워크플로 다이어그램에서 **RunHelloWorldApp** 상자를 선택합니다.

   로그 메시지 목록이 나타납니다.

1. `node index.js` 로그 메시지를 확장합니다.

   다음 메시지가 나타납니다.

   ```
   [Container] 2024/04/24 21:15:41.545650 Running command node index.js
   Hello World
   ```

   `Hello Word`(`hello-world` 대신)이 나타나면 `lodash` 종속성이 성공적으로 사용되었음을 나타냅니다.

1. `npm list` 로그를 확장합니다.

   다음과 비슷한 메시지가 나타납니다.

   ```
   └── lodash@4.17.20
   ```

   이 메시지는 `lodash` 버전 4.17.20이 워크플로 작업을 실행하는 Docker 이미지에 다운로드되었음을 나타냅니다.

## 6단계: npmjs.com 가져오기 차단
<a name="packages-tutorial-block"></a>

 이제 게이트웨이 및 CodeCatalyst 패키지 리포지토리에 `lodash` 버전 4.17.20이 존재하므로 다른 버전 가져오기를 차단할 수 있습니다. 차단하면 악성 코드가 포함될 수 있는 `lodash`의 이후(또는 이전) 버전을 실수로 가져오는 일을 방지합니다. 자세한 내용은 [패키지 원본 제어 편집](package-origin-controls.md) 및 [종속성 대체 공격](package-origin-controls.md#dependency-substitution-attacks) 섹션을 참조하세요.

다음 지침에 따라 게이트웨이 리포지토리로 `lodash` 가져오기를 차단합니다. 게이트웨이에서 패키지를 차단하면 다운스트림 위치에서도 차단됩니다.

**게이트웨이 리포지토리로의 가져오기를 차단하려면**

1. 탐색 창에서 **패키지**를 선택합니다.

1. **npm-publish-registry-gateway**를 선택합니다.

1. `lodash`을 선택합니다.

1. 상단 근처에서 **원본 제어**를 선택합니다.

1. **업스트림**에서 **차단**을 선택합니다.

1. **저장**을 선택합니다.

   이제 npmjs.com에서 게이트웨이 리포지토리(및 다운스트림 리포지토리 및 컴퓨터)로의 가져오기를 차단했습니다.

## 7단계: 차단 기능 테스트
<a name="packages-tutorial-test-block"></a>

이 섹션에서는 [6단계: npmjs.com 가져오기 차단](#packages-tutorial-block)에서 설정한 차단이 작동하는지 확인합니다. 게이트웨이 리포지토리에서 사용할 수 있는 버전인 4.17.2**0** `lodash` 대신 버전 4.17.2**1**을 요청하도록 'Hello World'를 구성하는 것으로 시작합니다. 그런 다음 애플리케이션이 nmpjs.com 버전 4.17.21을 가져올 수 없는지 확인하며, 이는 차단이 성공했음을 나타냅니다. 최종 테스트에서는 게이트웨이 리포지토리로의 가져오기 차단을 해제하고, 애플리케이션이 `lodash`의 버전 4.17.21을 성공적으로 가져올 수 있는지 확인합니다.

다음 절차 세트를 사용하여 차단 기능을 테스트합니다.

**시작하기 전 준비 사항**

1. 개발 환경으로 전환합니다.

1. CodeCatalyst 콘솔을 사용하여 이전에 생성한 `codecatalyst-package-workflow.yaml` 파일을 가져옵니다.

   ```
   git pull
   ```

**'lodash' 버전 4.17.21을 요청하도록 'Hello World'를 구성하려면**

1. `/hello-world-app/package.json`를 엽니다.

1. ***빨간색으로 굵게*** 표시된 내용과 같이 `lodash` 버전을 4.17.21로 변경합니다.

   ```
   {
     "name": "hello-world-app",
     "version": "1.0.0",
     "description": "",
     "main": "index.js",
     "scripts": {
       "test": "echo \"Error: no test specified\" && exit 1"
     },
     "keywords": [],
     "author": "",
     "license": "ISC",
     "dependencies": {
       "lodash": "4.17.21"
     }
   }
   ```

   이제 `package.json` 파일의 버전(4.17.21)과 게이트웨이 및 CodeCatalyst 패키지 리포지토리의 버전(4.17.20)이 일치하지 않습니다.

1. 추가, 커밋 및 푸시:

   ```
   git add .
   git commit -m "update package.json to use lodash 4.17.21"
   git push
   ```

**'Hello World'가 'lodash' 버전 4.17.21을 가져올 수 없는지 테스트하려면**

1. 버전이 불일치하는 워크플로를 실행합니다.

   1. CodeCatalyst 콘솔로 전환합니다.

   1. 탐색 창에서 **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

   1. `codecatalyst-package-workflow` 옆에 **작업**을 선택한 후 **실행**을 선택합니다.

      npm은 `package.json`에서 종속성을 찾고 'Hello World'에서 `lodash`의 버전 4.17.21이 필요함을 확인합니다. npm은 다음 위치에서 다음 순서로 종속성을 찾습니다.
      + 작업을 실행하는 Docker 이미지. 여기에서는 찾을 수 없습니다.
      + CodeCatalyst 패키지 리포지토리. 여기에서는 찾을 수 없습니다.
      + 게이트웨이 리포지토리. 여기에서는 찾을 수 없습니다.
      + npmjs.com. 여기에서 발견합니다.

      npm이 npmjs.com에서 버전 4.17.21을 찾은 후 게이트웨이 리포지토리로 가져오려고 시도하지만 `lodash`의 가져오기를 차단하도록 게이트웨이를 설정했으므로 가져오기가 발생하지 않습니다.

      가져오기가 발생하지 않으므로 워크플로가 실패합니다.

1. 워크플로가 실패했는지 확인합니다.

   1. 상단의 녹색 알림에서 오른쪽의 실행에 대한 링크를 선택합니다. 링크는 `View Run-2345`와 같습니다.

   1. 워크플로 다이어그램에서 **RunHelloWorldApp** 상자를 선택합니다.

   1. `npm install` 로그 메시지를 확장합니다.

      다음 메시지가 나타납니다.

      ```
      [Container] 2024/04/25 17:20:34.995591 Running command npm install
      npm ERR! code ETARGET
      npm ERR! notarget No matching version found for lodash@4.17.21.
      npm ERR! notarget In most cases you or one of your dependencies are requesting
      npm ERR! notarget a package version that doesn't exist.
      
      npm ERR! A complete log of this run can be found in: /tmp/.npm/_logs/2024-05-08T22_03_26_493Z-debug-0.log
      ```

      오류는 버전 4.17.21을 찾을 수 없음을 나타냅니다. 이는 차단했기 때문에 나타나는 것으로 봅니다.

**npmjs.com에서 가져오기 차단을 해제하려면**

1. 탐색 창에서 **패키지**를 선택합니다.

1. **npm-publish-registry-gateway**를 선택합니다.

1. `lodash`을 선택합니다.

1. 상단 근처에서 **원본 제어**를 선택합니다.

1. **업스트림**에서 **허용**을 선택합니다.

1. **저장**을 선택합니다.

   이제 `lodash`의 가져오기가 차단 해제됩니다.

   이제 워크플로에서 `lodash`의 버전 4.17.21을 가져올 수 있습니다.

**npmjs.com에서 가져오기가 차단 해제되었는지 테스트하려면**

1. 워크플로를 다시 실행합니다. 이제 4.17.21의 가져오기가 작동하므로 이번에는 워크플로가 성공해야 합니다. 해당 워크플로를 실행하려면:

   1. **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

   1. `codecatalyst-package-workflow` 옆의 **작업**을 선택하고 **실행**을 선택합니다.

   1. 상단의 녹색 알림에서 오른쪽의 실행에 대한 링크를 선택합니다. 링크는 `View Run-3456`와 같습니다.

      실행을 시작한 사람과 **RunHelloWorldApp** 작업을 보여주는 워크플로 다이어그램이 나타납니다.

   1. **RunHelloWorldApp** 작업 상자를 선택하여 작업의 진행 상황을 확인합니다.

   1. `npm list` 로그 메시지를 확장하고 다음과 유사한 메시지가 나타나는지 확인합니다.

      ```
      └── lodash@4.17.21
      ```

      이 메시지는 `lodash` 버전 4.17.21이 다운로드되었음을 나타냅니다.

1. 버전 4.17.21을 CodeCatalyst 및 게이트웨이 리포지토리로 가져왔는지 확인합니다.

   1. 탐색 창에서 **패키지**를 선택합니다.

   1. **npm-public-registry-gateway**를 선택합니다.

   1. `lodash`를 찾아 버전이 `4.17.21`인지 확인합니다.
**참고**  
버전 4.17.20은 이 페이지에 나열되어 있지 않지만 `lodash`를 선택한 다음 상단에서 **버전**을 선택하여 찾을 수 있습니다.

   1. 이 단계를 반복하여 버전 4.17.21을 `codecatalyst-package-repository`로 가져왔는지 확인합니다.

## 정리
<a name="packages-tutorial-cleanup"></a>

요금이 부과되지 않도록 이 자습서에서 사용하는 파일과 서비스를 정리합니다.

**패키지 자습서를 정리하려면**

1. `codecatalyst-package-project`를 삭제합니다.

   1. CodeCatalyst 콘솔에서 아직 프로젝트로 이동하지 않은 경우, `codecatalyst-package-project` 프로젝트로 이동합니다.

   1. 탐색 창에서 **프로젝트 설정**을 선택합니다.

   1. **프로젝트 삭제**를 선택하고 **delete**를 입력한 다음 **프로젝트 삭제**를 선택합니다.

      CodeCatalyst는 소스, 게이트웨이 및 CodeCatalyst 패키지 리포지토리를 포함한 모든 프로젝트 리소스를 삭제합니다. 개발 환경도 삭제됩니다.

1. PAT 토큰을 삭제합니다.

   1. 오른쪽에서 사용자 이름을 선택한 다음 **내 설정**을 선택합니다.

   1. **개인 액세스 토큰**에서 이 자습서에서 생성한 토큰을 선택하고 **삭제**를 선택합니다.

이 자습서에서는 CodeCatalyst 패키지 리포지토리에서 종속성을 가져오는 애플리케이션을 실행하는 워크플로를 생성하는 방법을 배웠습니다. 또한 패키지가 게이트웨이 및 CodeCatalyst 패키지 리포지토리로 들어오는 것을 차단 및 차단 해제하는 방법을 배웠습니다.

# 워크플로에서 CodeCatalyst 패키지 리포지토리 지정
<a name="workflows-package-specify-action"></a>

CodeCatalyst에서는 워크플로에서 빌드 및 테스트 작업에 CodeCatalyst 패키지 리포지토리를 추가할 수 있습니다. 패키지 리포지토리는 npm과 같은 패키지 형식으로 구성해야 합니다. 선택한 패키지 리포지토리에 대해 일련의 범위를 포함하도록 선택할 수도 있습니다.

다음 지침에 따라 워크플로 작업에 사용할 패키지 구성을 지정합니다.

------
#### [ Visual ]

**작업에서 사용할 패키지 구성 지정(시각적 편집기)**

1. [https://codecatalyst.aws/](https://codecatalyst.aws/)에서 CodeCatalyst 콘솔을 엽니다.

1. 프로젝트를 선택합니다.

1. 탐색 창에서 **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

1. 워크플로의 이름을 선택합니다. 소스 리포지토리 또는 워크플로가 정의된 브랜치 이름을 기준으로 필터링하거나, 워크플로 이름 또는 상태를 기준으로 필터링할 수 있습니다.

1. **편집**을 선택합니다.

1. **비주얼**을 선택합니다.

1. 워크플로 다이어그램에서 패키지 리포지토리로 구성할 **빌드** 또는 **테스트** 작업을 선택합니다.

1. **패키지**를 선택합니다.

1. **구성 추가** 드롭다운 메뉴에서 워크플로 작업에 사용할 패키지 구성을 선택합니다.

1. **패키지 리포지토리 추가**를 선택합니다.

1. **패키지 리포지토리** 드롭다운 메뉴에서 작업을 사용할 CodeCatalyst *패키지 리포지토리*의 이름을 지정합니다.

   패키지 리포지토리에 대한 자세한 내용은 [패키지 리포지토리](packages-concepts.md#packages-concepts-repository) 섹션을 참조하세요.

1. (선택 사항) **범위 - 선택 사항**에서 패키지 레지스트리에 정의할 *범위* 순서를 지정합니다.

   범위를 정의할 때 지정된 패키지 리포지토리는 나열된 모든 범위에 대한 레지스트리로 구성됩니다. 해당 범위의 패키지가 npm 클라이언트를 통해 요청되면 기본값 대신 해당 리포지토리를 사용합니다. 각 범위 이름 앞에는 ‘@’ 접두사를 붙여야 합니다.

   `Scopes` 생략 시 지정된 패키지 리포지토리가 작업에 사용되는 모든 패키지의 기본 레지스트리로 구성됩니다.

   범위에 대한 자세한 내용은 [패키지 네임스페이스](packages-concepts.md#packages-concepts-package-namespaces) 및 [범위 지정 패키지](https://docs.npmjs.com/cli/v10/using-npm/scope) 섹션을 참조하세요.

1. **추가**를 선택합니다.

1. (선택 사항) 커밋하기 전에 워크플로의 YAML 코드를 검증하려면 **검증**을 선택합니다.

1. **커밋**을 선택하고 커밋 메시지를 입력한 다음 **커밋**을 다시 선택합니다.

------
#### [ YAML ]

**작업이 사용할 패키지 구성 지정(YAML 편집기)**

1. [https://codecatalyst.aws/](https://codecatalyst.aws/)에서 CodeCatalyst 콘솔을 엽니다.

1. 프로젝트를 선택합니다.

1. 탐색 창에서 **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

1. 워크플로의 이름을 선택합니다. 소스 리포지토리 또는 워크플로가 정의된 브랜치 이름을 기준으로 필터링하거나, 워크플로 이름 또는 상태를 기준으로 필터링할 수 있습니다.

1. **편집**을 선택합니다.

1. **YAML**을 선택합니다.

1. **빌드** 또는 **테스트** 작업에서 다음과 유사한 코드를 추가합니다.

   ```
   action-name:
    Configuration:
       Packages:
           NpmConfiguration:
             PackageRegistries:
               - PackagesRepository: package-repository
                 Scopes:
                   - "@scope"
   ```

   자세한 내용은 작업에 대한 [빌드 및 테스트 작업 YAML](build-action-ref.md)의 `Packages` 속성 설명을 참조하세요.

1. (선택 사항) 커밋하기 전에 워크플로의 YAML 코드를 검증하려면 **검증**을 선택합니다.

1. **커밋**을 선택하고 커밋 메시지를 입력한 다음 **커밋**을 다시 선택합니다.

------

# 워크플로 작업에서 권한 부여 토큰 사용
<a name="workflows-package-export-token"></a>

워크플로 작업에서 제공하는 토큰을 사용하여 패키지 관리자가 CodeCatalyst 패키지 리포지토리로 인증하도록 수동으로 구성할 수 있습니다. CodeCatalyst는 이 토큰을 작업에서 참조할 수 있도록 환경 변수로 사용할 수 있도록 합니다.


| 환경 변수 | 값 | 
| --- | --- | 
|  CATALYST\$1MACHINE\$1RESOURCE\$1NAME  |  권한 부여 토큰의 사용자 ID입니다.  | 
|  CATALYST\$1PACKAGES\$1AUTHORIZATION\$1TOKEN  |  권한 부여 토큰의 값입니다.  | 

**참고**  
이러한 환경 변수는 권한 부여 토큰을 내보내도록 작업을 구성한 경우에만 채워집니다.

다음 지침에 따라 워크플로 작업과 함께 권한 부여 토큰을 사용합니다.

------
#### [ Visual ]

**작업에서 내보낸 권한 부여 토큰 사용(시각적 편집기)**

1. [https://codecatalyst.aws/](https://codecatalyst.aws/)에서 CodeCatalyst 콘솔을 엽니다.

1. 프로젝트를 선택합니다.

1. 탐색 창에서 **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

1. 워크플로의 이름을 선택합니다. 소스 리포지토리 또는 워크플로가 정의된 브랜치 이름을 기준으로 필터링하거나, 워크플로 이름 또는 상태를 기준으로 필터링할 수 있습니다.

1. **편집**을 선택합니다.

1. **비주얼**을 선택합니다.

1. 워크플로 다이어그램에서 패키지 리포지토리로 구성할 **빌드** 또는 **테스트** 작업을 선택합니다.

1. **패키지**를 선택합니다.

1. **권한 부여 토큰 내보내기**를 켭니다.

------
#### [ YAML ]

**작업에서 내보낸 권한 부여 토큰 사용(YAML 편집기)**

1. [https://codecatalyst.aws/](https://codecatalyst.aws/)에서 CodeCatalyst 콘솔을 엽니다.

1. 프로젝트를 선택합니다.

1. 탐색 창에서 **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

1. 워크플로의 이름을 선택합니다. 소스 리포지토리 또는 워크플로가 정의된 브랜치 이름을 기준으로 필터링하거나, 워크플로 이름 또는 상태를 기준으로 필터링할 수 있습니다.

1. **편집**을 선택합니다.

1. **YAML**을 선택합니다.

1. **빌드** 또는 **테스트** 작업에서 다음과 유사한 코드를 추가합니다.

   ```
   Actions:
     action-name:
       Packages:
         ExportAuthorizationToken: true
   ```

   YAML의 `Steps` 섹션에서 `$CATALYST_MACHINE_RESOURCE_NAME` 및 `$CATALYST_PACKAGES_AUTHORIZATION_TOKEN` 환경 변수를 참조할 수 있습니다. 자세한 정보는 [예시: CodeCatalyst로 인증하도록 수동으로 `pip` 구성](workflows-working-packages-ex.md#workflows-working-packages-pypi-token) 섹션을 참조하세요.

1. (선택 사항) 커밋하기 전에 워크플로의 YAML 코드를 검증하려면 **검증**을 선택합니다.

1. **커밋**을 선택하고 커밋 메시지를 입력한 다음 **커밋**을 다시 선택합니다.

------

# 예시: 워크플로의 패키지 리포지토리
<a name="workflows-working-packages-ex"></a>

다음 예시에서는 워크플로 정의 파일의 패키지를 참조하는 방법을 보여줍니다.

**Topics**
+ [예시: `NpmConfiguration`을 사용하여 패키지 정의](#workflows-working-packages-ex-basic)
+ [예시: 기본 레지스트리 재정의](#workflows-working-packages-ex-overriding-registry)
+ [예시: 패키지 레지스트리의 범위 재정의](#workflows-working-packages-ex-overriding-scopes)
+ [예시: CodeCatalyst로 인증하도록 수동으로 `pip` 구성](#workflows-working-packages-pypi-token)

## 예시: `NpmConfiguration`을 사용하여 패키지 정의
<a name="workflows-working-packages-ex-basic"></a>

다음 예시는 워크플로 정의 파일에서 `NpmConfiguration`를 사용하여 패키지를 정의하는 방법을 보여줍니다.

```
Actions:
  Build:
  Identifier: aws/build-beta@v1
  Configuration:
    Packages:
        NpmConfiguration:
          PackageRegistries:
            - PackagesRepository: main-repo
            - PackagesRepository: scoped-repo
              Scopes:
                - "@scope1"
```

이 예시에서는 npm 클라이언트를 다음과 같이 구성합니다.

```
default: main-repo
@scope1: scoped-repo
```

이 예시에서는 두 개의 리포지토리가 정의되어 있습니다. 기본 레지스트리는 범위 없이 정의되므로 기본 레지스트리는`main-repo`로 설정됩니다. 범위 `@scope1`은 `scoped-repo`에 대해 `PackageRegistries`에 구성됩니다.

## 예시: 기본 레지스트리 재정의
<a name="workflows-working-packages-ex-overriding-registry"></a>

다음 예시에서는 기본 레지스트리를 재정의하는 방법을 보여줍니다.

```
NpmConfiguration:
  PackageRegistries:
    - PackagesRepository: my-repo-1
    - PackagesRepository: my-repo-2
    - PackagesRepository: my-repo-3
```

이 예시에서는 npm 클라이언트를 다음과 같이 구성합니다.

```
default: my-repo-3
```

여러 기본 리포지토리를 지정하는 경우 마지막 리포지토리가 우선합니다. 이 예시에서 나열된 마지막 리포지토리는 `my-repo-3`이며, 이는 npm이 `my-repo-3`에 연결된다는 것을 의미합니다. 이렇게 하면 리포지토리 `my-repo-1` 및 `my-repo-2`를 재정의합니다.

## 예시: 패키지 레지스트리의 범위 재정의
<a name="workflows-working-packages-ex-overriding-scopes"></a>

다음 예시에서는 패키지 레지스트리의 범위를 재정의하는 방법을 보여줍니다.

```
NpmConfiguration:
  PackageRegistries:
    - PackagesRepository: my-default-repo
    - PackagesRepository: my-repo-1
      Scopes:
        - "@scope1"
        - "@scope2"
    - PackagesRepository: my-repo-2
      Scopes:
        - "@scope2"
```

이 예시에서는 npm 클라이언트를 다음과 같이 구성합니다.

```
default: my-default-repo
@scope1: my-repo-1
@scope2: my-repo-2
```

범위 재정의를 포함하면 마지막 리포지토리가 우선합니다. 이 예시에서 `@scope2` 범위가 `my-repo-2`에 대해 마지막으로 구성된 것은 `PackageRegistries`입니다. 이렇게 하면 `my-repo-1`에 대해 구성된 범위 `@scope2`가 재정의됩니다.

## 예시: CodeCatalyst로 인증하도록 수동으로 `pip` 구성
<a name="workflows-working-packages-pypi-token"></a>

다음 예시에서는 빌드 작업에서 CodeCatalyst 권한 부여 환경 변수를 참조하는 방법을 보여줍니다.

```
Actions:
  Build:
    Identifier: aws/build@v1.0.0
    Configuration:
      Steps:
        - Run: pip config set global.index-url https://$CATALYST_MACHINE_RESOURCE_NAME:$CATALYST_PACKAGES_AUTHORIZATION_TOKEN@codecatalyst.aws/pypi/my-space/my-project/my-repo/simple/
    Packages:
      ExportAuthorizationToken: true
```