Chocolatey에 패키지 등록하기

앞선 포스팅에서 chocolatey 패키지 매니저에 대해 소개를 했습니다. 그러면 chocolatey의 리포지토리에 직접 개발한 execs.exe 실행 파일을 어떻게 등록할 수 있을까요? 저도 남들처럼 멋있게 제 패키지를 chocolatey나 homebrewapt 등의 패키지 매니저로 배포하고 실행할 수 있도록 해보고 싶습니다.

chocolatey의 커뮤니티 리포지토리에 방문해보면 위와 같이 수많은 소프트웨어들이 등록되어 있습니다. 이런 패키지 매니저 덕분에 컴퓨터를 포맷한 이후에도 손쉽게 원하는 소프트웨어를 설치할 수 있었는데요. execs를 chocolatey에 등록해서 사내 개발자들이 저처럼 손쉽게 AWS ECS의 Fargate에 접근할 수 있도록 하는 것이 이번 글의 최종 목적입니다.

제가 작성한 패키지 등록 소스는 본문 또는 다음 링크에서 확인하실 수 있습니다.

패키지 생성

먼저 chocolatey가 설치되어 있어야 합니다. 그리고 아래 명령어를 통해서 패키지 템플릿을 생성합니다.

choco new <package_name>
Code language: HTML, XML (xml)

execs를 패키지 이름으로 정하면 다음과 같이 신규 폴더가 생성되면서 패키지 배포에 필요한 파일들이 생성됩니다.

execs
|-- ReadMe.md
|-- _TODO.txt
|-- execs.nuspec
`-- tools
    |-- LICENSE.txt
    |-- VERIFICATION.txt
    |-- chocolateybeforemodify.ps1
    |-- chocolateyinstall.ps1
    `-- chocolateyuninstall.ps1

1 directory, 8 files
Code language: JavaScript (javascript)

각각의 파일에는 상세한 설명이 들어있습니다. 모든 내용을 읽어보고 하나하나 천천히 설정할 수 있지만, 빠르게 배포하기 위해서 반드시 편집해야 하는 파일은 execs.nuspec 파일과 chocolateyinstall.ps1 파일입니다. 물론 설치 스크립트만 작성하면 추후 패키지 삭제가 불가능하기 때문에 chocolateyuninstall.ps1 파일도 작성하는 것이 좋습니다.

각각의 파일 작성에 대한 자세한 내용은 매뉴얼을 참고하시는 것이 좋겠습니다.

.nuspec

chocolatey는 .Net Framework 패키지 매니저인 Nuget을 이용한다고 합니다. 그래서 패키지에 대한 스펙을 정의하는 파일의 확장자가 .nuspec으로 되어있습니다. 필수 태그들과 일부 선택 태그들을 입력하면 다음과 같이 작성할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>

<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">

  <metadata>
    <id>execs</id>
    <version>0.1.4</version>

    <title>execs</title>
    <authors>Daeho Ro</authors>

    <projectUrl>https://github.com/daeho-ro/execs</projectUrl>
    <projectSourceUrl>https://github.com/daeho-ro/execs</projectSourceUrl>
    <packageSourceUrl>https://github.com/daeho-ro/execs-chocolatey-package</packageSourceUrl>

    <tags>execs</tags>
    <summary>execs is a program that helps you to access the ECS task interactively by using the ssm session-manager-plugin.</summary>
    <description>It uses the ECS execute command API with the command /bin/sh. It also highly refer the similar and pre-existing program ecsgo but uses the AWS SDK for GO v2. Since the motivation for developing the program is personal purpose to study about Golang, the program could be unstable.</description>
  </metadata>

  <files>
    <file src="tools\**" target="tools" />
  </files>

</package>
Code language: HTML, XML (xml)

여기서 files의 위치는 패키지 인스톨 스크립트가 들어있는 곳을 말합니다. 기본적으로 입력되어 있으므로 폴더 이름을 변경할 경우에만 prefix를 바꿔주시면 됩니다.

chocolateyinstall.ps1

이제 패키지 설치를 위한 스크립트를 작성해야 합니다. 설치 스크립트는 패키지가 설치형인지, 단순 바이너리인지, zip 파일인지에 따라서 사용해야 하는 명령어가 다릅니다. 저는 .exe 바이너리를 배포하는 것이기 때문에 설치를 할 필요가 없습니다. 그래서 Get-ChocolateyWebFile 명령을 통해서 주어진 url에서 파일을 다운로드하여 execs.exe라는 파일로 이름을 변경, 윈도우의 PATH에 사전 등록된 chocolatey의 바이너리 저장소에 저장하도록 하였습니다.

$ErrorActionPreference = 'Stop';
$toolsDir   = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
$fileFullPath = Join-Path $toolsDir "$packageName.exe"

$url64      = 'https://github.com/daeho-ro/execs/releases/download/v0.1.4/execs_0.1.4_windows_amd64.exe'
$checksum64 = '267d368963031de0ba262a7213ee336c003d4663d608ebe4bd1e9e683708d1f9'
$checksumType64 = 'sha256'

$packageArgs = @{
  packageName   = $env:ChocolateyPackageName
  fileFullPath  = $fileFullPath
  url64bit      = $url64
  checksum64    = $checksum64
  checksumType64= $checksumType64
}

Get-ChocolateyWebFile @packageArgs
Code language: PHP (php)

아키텍처가 x64이므로 x86은 제외하였습니다. url은 Github에서 release된 바이너리 url을 입력하였습니다. release에서 checksum도 확인이 가능하므로 보안을 위해서 함께 제공합니다.

chocolateyuninstall.ps1

앞서 설치 과정 자체가 단순히 바이너리를 특정 위치에 저장하는 것이므로 반대로 삭제 과정은 해당 바이너리만 찾아서 제거하면 됩니다. 별도의 Uninstaller가 없으므로 바이너리 삭제 명령을 통해서 패키지 바이너리만 지워줍니다.

Uninstall-BinFile -Name $env:ChocolateyPackageName
Code language: PHP (php)

테스트

이제 작성한 스크립트를 빌드하고 테스트를 진행해봐야 합니다. 정상 동작하지 않는다면 실제 배포를 진행한 이후에도 Test에서 실패를 맛보게 될 겁니다. .nuspec이 위치한 경로에서 다음 명령을 통해서 패키지를 생성합니다.

choco pack

패키지를 생성하면 .nupkg 파일이 생성되는데, 이 패키지가 생성된 이후에 설치와 삭제 테스트를 진행해볼 수 있습니다.

choco install <package_name> -dv -s .
choco uninstall <package_name> -dv -s .
Code language: HTML, XML (xml)

설치 후에는 바이너리가 정상적으로 실행되는지, 삭제 후에는 실행되지 않는지를 확인하면 됩니다. 디버그 모드를 사용했기 때문에 로그도 함께 확인하셔서 문제가 없으면 배포 준비가 완료된 것입니다.

API 키 발급

chocolatey에 패키지를 등록하기 위해서는 회원 가입 후에 api 키를 등록해야 합니다. 키는 회원 가입을 진행하면 하나가 이미 생성되어 있습니다. 다음 링크에서 회원 가입을 진행합니다.

회원 가입이 완료되면 로그인 화면에서 api 키를 등록할 수 있는 아래 커맨드를 확인할 수 있습니다.

choco apikey --key <api_key> --source https://push.chocolatey.org/
Code language: HTML, XML (xml)

등록

이제 모든 준비가 끝났습니다. .nupkg가 생성된 경로에서 아래 명령을 실행하면 패키지가 push 됩니다.

choco push --source https://push.chocolatey.org/
Code language: JavaScript (javascript)

등록 이후의 절차는 다음과 같습니다.

  • Validation Test
  • Verification Test
  • Virus Test
  • Moderator Review

특이한 점은, golang에서 exe를 빌드하면서 들어간 라이브러리 일부에서 malware 경고가 발생했습니다. Virus Test에서 발생하는 5개 이하의 경고에 대해서는 Moderator가 확인한 이후에 통과 여부가 결정될 것으로 보입니다. 대부분 False Positive라고 합니다만, 이 부분은 저도 어떻게 해야 그린으로 통과할 수 있는지는 의문입니다.

맺음말

자, 이렇게 chocolatey에 패키지 등록을 진행해보았습니다. 아직 모든 과정을 통과하지는 못해서 다음 명령어는 동작하지 않습니다.

choco list execs
choco install execs
Code language: PHP (php)

그대로 제출된 패키지에 대해서는 version을 명시함으로써 다운로드를 제공하여 다음 명령어는 동작합니다.

choco install execs --version=0.1.4

비록 개인 패키지이지만 이와 같은 패키지 등록 절차를 거쳐보는 경험도 매우 즐거웠습니다. 앞으로도 더 많은 패키지 매니저에 등록해서 범용성을 키워보도록 하겠습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *