자동화 된 바이너리

마지막 업데이트: 2022년 5월 22일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
앱 베이어의 빌드 매트릭스를 활용하여 여러 파이썬 버전의 32비트 및 64비트 윈도 바이너리를 빌드하는 모습

오픈 소스 프로젝트를 더 잘 릴리스하는 요령들

안녕하세요. 스포카 프로그래머 홍민희입니다. 이 글에서는 스포카에서 여러 오픈 소스 프로젝트를 관리하면서 알게 된, 릴리스 프로세스를 정하고 자동화하는 데에 도움이 되는 여러 꿀팁들을 소개하고자 합니다. 오픈 소스를 가정하고 있기는 하지만, 버전 번호를 매겨서 릴리스하는 프로젝트라면 오픈 소스가 아니라도 대부분 적용할 수 있습니다.

스포카에서 관리하는 오픈 소스 프로젝트는 대부분 라이브러리 패키지이거나 CLI 프로그램, 또는 API를 제공하는 서버 소프트웨어로, 다시 말해 프로그램 가능한 인터페이스를 제공합니다. 도도 포인트 같은 서비스처럼 뚜렷한 버전 번호 없이 업데이트를 해서는 안되고, 프로그램 사이의 호환성에 대한 암시를 줄 수 있는 버전 번호를 제공해야 합니다. 따라서 릴리스에 의한 버전 구분이 메인테이너와 이용자 모두에게 뚜렷합니다. 유의적 버전(Semantic Versioning) 같은 규칙이 유용한 까닭도 그러한 배경에 있겠습니다.

새 버전 릴리스는 생각보다 신경 쓸 데가 많습니다. 호환성을 고려해서 적절한 버전 번호를 정해야 하고, 이용자들이 어떤 변화가 있었는지 알 수 있어야 합니다. 라이브러리 패키지라면 패키지 저장소에도 새 버전을 등록한 뒤 타볼을 업로드해야 하고, 애플리케이션이라면 빌드된 실행 바이너리 파일도 함께 올려야 합니다. 릴리스 프로세스는 생각보다 해야 할 부분 과업이 많고, 부분 과업이 많다는 것은 사람이 실수할 기회도 많다는 뜻입니다. 실수를 줄이려면 많은 부분을 자동화하고, 실수하기 어려운 순서로 프로세스를 개선해야 합니다.

다행히, 상당히 많은 실수는 여러 요령을 통해 예방 가능합니다.

체인지로그는 제 때 써두기

이 글에서 제시하는 여러 팁을 잘 활용하기 위해서라도, 체인지로그(changelog)를 잘 남기는 것을 권합니다. (아래에서 제시하는 몇 가지 팁은 체인지로그를 적지 않으면 활용하기 어렵습니다.)

체인지로그는 이용자들이 문제를 겪을 때 특히 활용도가 높습니다. 제품에서 가져다 쓰는 라이브러리의 버전이 올라가면서 자동화된 테스트가 실패하기 시작하거나, 심지어는 배포 직후에 예상치 못하게 오류가 나는 일은 대부분의 현업 프로그래머들이 겪어보는 어려움입니다. 이럴 때 많은 프로그래머들이 사용중인 라이브러리에 최근 어떤 변경이 있었는지 보고 이를 통해 미루어 짐작합니다. 특히 빠르게 문제를 해결해야 하는 상황에서는 그러한 짐작을 할 때 체인지로그가 큰 도움이 됩니다. 하다못해 일단 이전에 쓰던 버전으로 되돌리거나 최신 버전을 쓰지 않도록 버전을 고정하는 결정이라도 하려면 체인지로그가 제공되어야 합니다.

물론 대부분의 오픈 소스 프로젝트 메인테이너는 이를 몰라서 안 하는 것이 아닙니다. 릴리스를 할 때 그 동안의 커밋들을 뒤져보며 체인지로그를 적는 일이 하도 귀찮고 시간이 들기 때문에 포기하는 경우가 많습니다. 체인지로그는 방학 때 일기 쓰는 것과 비슷합니다. 제 때 조금씩 써두면 큰 일이 아닌데, 나중에 몰아서 하려고 하면 양도 많은데다 시간이 많이 지나 기억도 잘 나지 않으니 큰 일이 되는 것입니다.

따라서 체인지로그는 매 커밋, 또는 매 기능 추가(보통은 풀 리퀘스트 단위)마다 기록해두는 것이 좋은 프로세스입니다.

그러나 그러한 프로세스가 있어도 제 때 체인지로그를 남겨둬야 한다는 사실 자체를 기여자 뿐만 아니라 메인테이너까지도 잊어버리는 경우도 많습니다. 이런 실수를 크게 줄이는 팁이 있는데, 바로 CI 빌드 스크립트로 규칙을 지키지 않으면 빨간 불이 자동화 된 바이너리 뜨도록 코딩하는 것입니다.

예를 들어, 트래비스 CI 를 이용한다면 프로젝트의 .travis.yml 설정 파일에 다음과 같은 bash 코드를 포함시켜서, 풀 리퀘스트나 커밋에 체인지로그가 없을 경우 오류가 나게 할 수 있습니다.

TRAVIS_COMMIT_RANGE 는 Travis CI 에서 정의해주는 환경 변수로, 빌드마다 변경된 Git 커밋 범위로 정의됩니다. 예를 들어 풀 리퀘스트의 빌드라면 그 풀 리퀘스트에 들어있는 첫 커밋부터 마지막 커밋까지로 정의됩니다. git diff --name-only "$TRAVIS_COMMIT_RANGE" 명령은 변경된 파일의 목록을 출력합니다. 풀 리퀘스트 빌드라면, 풀 리퀘스트에서 손 댄 모든 파일 목록이 나옵니다. 이어지는 | grep CHANGELOG 는 그 파일 목록 중에 CHANGELOG 파일이 포함되었는지 확인합니다. 만약 풀 리퀘스트가 CHANGELOG를 남기지 않았다면 grep 이 0이 아닌 종료 코드와 함께 끝날 것이므로 빌드는 실패하게 됩니다.

버전 정책

버전 문자열도 코드

소프트웨어 버전 번호는 여러 곳에서 나타납니다. CLI 프로그램이라면 -v / --version 옵션으로 볼 수도 있고, 패키지 시스템의 메타데이터 파일에도 포함되며, man 페이지나 HTML로 빌드되는 문서에도 나타납니다. 따라서 버전 번호도 코드의 상수 데이터를 대하듯 해야 합니다. 중복을 줄여서 전체 코드에서 최소한으로 하드코딩되게 하지 않으면, 새 버전을 릴리스할 때 버전 번호를 올리지 않고 예전 버전 번호 그대로 릴리스해버리는 실수를 하기 쉽습니다.

하스켈의 카발 같은 몇몇 패키지 시스템은 해당 패키지 시스템이 패키지 메타데이터에 적힌 버전 번호를 런타임에 알 수 있게 API를 제공하기도 합니다. 그런 API가 있다면 최대한 활용하는 것이 좋습니다.

그런 장치가 없다면 버전 번호를 누구라도 쉽게 찾을 수 있는 곳에 위치시키는 것이 좋습니다. 파이썬이라면 pkg/__init__.py 파일에 __version__ 이라는 상수로 남겨두는 것이 관례입니다. 파이썬의 패키지 메타데이터는 setup.py라는 별도 파일에도 기술되어야 하는데, 다행히 setup.py 파일은 파이썬 스크립트이므로 프로그램 코드에 들어있는 버전 번호 데이터를 읽어서 활용할 수 있습니다.

릴리스한 버전마다 태그 달기

대부분의 버전 관리 시스템에는 태그 기능이 있습니다. 새 버전을 릴리스하고 나서는, 그 릴리스에 포함된 마지막 커밋에 태그를 추가해야 합니다. 이 원칙은 “많이 알려져 있다고” 알려져 있지만, 의외로 모르는 경우도 많습니다. 최근의 웹 기술 기반의 서비스는 버전 번호를 정하지 않고 연속적으로 배포하는 프랙티스를 채택하는 경우가 많기 때문입니다.

비슷하게, 아래는 러스트 패키지 시스템인 카고에서 패키지 메타데이터를 기술하는 Cargo.toml 파일에 적힌 버전 번호를 검사하는 스크립트입니다.

아래는 하스켈 패키지 시스템인 스택에서 패키지 메타데이터 파일에 적힌 버전 번호를 검사하는 스크립트입니다. ( PKG 는 해당 프로젝트의 패키지 이름으로 치환합니다.)

다음 버전 준비는 새 버전 릴리스의 일환

메인테이너가 둘 이상일 경우, 혹은 메인테이너가 혼자여도 새 버전 릴리스를 뜸하게 하는 경우, 생각보다 흔하게 하는 실수가 버전을 겹치게 하거나 한 버전을 빼먹고 다음 버전 번호를 고르는 것입니다. 예를 들어 마지막으로 릴리스한 버전이 1.2.3이라면, 1.2.3 버전을 한 번 더 릴리스하려고 시도하거나 (이는 다행히 릴리스 과정 중에 실수를 깨닫게 되긴 하지만 헛수고를 하게 됩니다), 1.2.4 버전을 빼먹고 1.2.5 버전을 릴리스하는 실수입니다.

그런 실수가 흔한 까닭은 마지막으로 릴리스한 최신 정식 버전이 무엇인지 확인하기 번거롭기 때문입니다. 물론, 항상 릴리스 전에는 마지막 정식 버전이 무엇이었는지 확인한다는 프로세스를 정해도 됩니다. 하지만 실수를 방지하는 더 좋은 방법은, 다음 버전 준비를 릴리스 과정의 일부로 포함하는 것입니다.

예를 들어, 마지막으로 릴리스한 버전이 1.2.3이라면, 이번에 1.2.4 버전을 릴리스하고 나서 소스 코드 내의 버전 문자열 등을 1.2.5로 올려두는 커밋을 하는 것까지 릴리스 과정의 마지막에 포함하면 됩니다. 버전 번호를 올리는 작업을 흔히 버전 범프(version bump)라고 합니다.

이 규칙의 장점은 특히 위에서 제안한 체인지로그(changelog)와 함께할 때 더 큽니다. 1.2.4 버전을 릴리스한 직후에, 소스 코드의 모든 버전 문자열을 1.2.5로 올리고, CHANGELOG 파일의 맨 위에도 아래와 같이 1.2.5 버전의 제목을 추가하면 됩니다.

이렇게 미리 다음 릴리스 버전을 위한 항목을 CHANGELOG 파일에 만들어두고, 그 안에 “to be released” 같은 아직 릴리스되지 않은 버전이라는 힌트까지 남겨두면, 메인테이너 자신과 컨트리뷰터에게 마지막 정식 릴리스 버전이 무엇이었는지 신경을 덜 써도 되게 해줍니다. 앞서 제안한 것처럼 체인지로그를 적었는지 검사하는 빌드 스크립트까지 함께할 경우, 풀 리퀘스트를 처음으로 올린 기여자의 작업 순서는 보통 아래처럼 바뀝니다.

  1. 체인지로그를 빼먹는다.
  2. 빌드가 깨지는 것을 확인한다.
  3. 그렇다면 체인지로그를 어느 항목에다 넣어야 할지 생각한다.
  4. CHANGELOG 파일을 열어보고 이미 “to be released”라 적힌 항목을 확인한다.
  5. 큰 고민 없이 해당 항목에 체인지로그를 남긴다.

물론 이 프로세스에 익숙해진 메인테이너는 풀 리퀘스트를 올릴 때부터 체인지로그를 기록하는 습관이 생기므로 점차 빌드가 실패하는 것을 보지 않게 됩니다.

단, 실제로 해당 버전을 릴리스할 때는 “to be released”라는 문구는 실제 릴리스된 날짜 등으로 대체되어야 합니다. 이 역시 까먹고 실수할 수 있으므로, CI 빌드 스크립트에 이를 검사하는 스크립트를 넣어두면 좋습니다.

TRAVIS_COMMIT_RANGE 와 마찬가지로 TRAVIS_TAG 역시 트래비스 CI 가 빌드마다 정의해주는 환경 변수입니다. Git 태그에 대한 빌드인 경우 태그 이름으로 정의되며, 그 외에는 정의되지 않습니다.

버그 패치를 위한 별도 브랜치 운영

1.0.0에 추가된 기능이 있는데, 1.0.1, 1.0.2 등의 버전을 지나 다음 마이너 버전인 1.1.0이 출시된 뒤에서야 그 기능의 버그를 발견했을 때는 어떻게 할까요? 메인테이너 입장에서 가장 속 편한 대응은 그 버그를 수정한 1.1.1 버전을 릴리스하는 것입니다.

하지만 1.1.0의 어떤 변경을 당장 도입하기 어려워서 1.0대의 최신 버전으로 유지하고 있는 이용자들은 어떨까요? 버그가 해당 이용자들에게도 심각하다면, 아래와 같이 어떤 쪽도 행복하지 않은 선택지 중에서 고민해야 합니다.

  • 위험을 부담하고 시간을 들여 자신의 코드가 1.1.0와 조화되도록 고칩니다. 이 선택은 자동화 된 바이너리 자동화 된 바이너리 암시적으로 일정 기간 버그를 감수하는 선택을 내포할 때가 많습니다. 작업 시간이 오래 걸리는데, 그 동안 버그를 감수하는 것이기 때문입니다.
  • 쓰고 있는 1.0대 버전의 라이브러리를 포크하여 버그를 직접 고치거나 1.1.1의 변경을 1.0대 코드에 이식합니다.

좀더 골치아픈 경우는 다음 메이저·마이너 버전을 준비하고 있는데 이전에 출시한 버전의 버그를 고쳐야 하는 상황입니다. 예를 들어 1.2.0 버전을 준비중인데 1.1.1의 버그를 고쳐야 하는 경우입니다. 이 때에도 메인테이너 입장에서만 속 편한 대응을 하자면, 그 버그의 패치를 작업중인 master 브랜치에 넣고, 1.2.0 버전과 함께 릴리스하기로 합니다. 이렇게 되면 이용자는 더 고된 선택을 해야 합니다. 앞선 두 선택지의 더욱 터프한 버전입니다.

  • 매우 큰 자동화 된 바이너리 위험을 부담하여 정식으로 릴리스도 되지 않은 1.2대 개발 버전을 직접 빌드해서 사용합니다. 이 선택은 또 다른 더 큰 버그들을 만나기 쉽습니다.
  • 쓰고 있는 1.1대 버전의 라이브러리를 포크하여 버그를 직접 고치거나, 1.2대 개발 버전에 들어있는 버그 패치를 1.1대 버전에 이식합니다. 버그 패치라고는 하지만 이용자들에게 노출된 적은 없기 때문에, 운이 나쁘면 그 버그 패치를 적용해도 문제는 해결되어 있지 않을 수도 있습니다.

이런 문제를 극복하기 위해, 릴리스마다 버전 번호를 정하는 전통적인 소프트웨어 프로젝트는 대부분 메이저 및 마이너 버전 별로 관리 브랜치를 두는 경우가 많습니다. 예를 들어 1.1.0을 릴리스하는 순간 master 는 1.2대 내지는 2.0대를 준비하기 위한 브랜치가 되고, 1.자동화 된 바이너리 1대의 버그를 고치기 위한 1.1-maintenance 브랜치도 만들게 됩니다.

즉, (마지막 번호가 *.*.0인) 새로운 메이저 및 마이너 버전을 릴리스할 때 아래 작업들을 하게 됩니다. 여기서는 1.1.0 버전을 릴리스한다고 가정합니다.

  • master 는 1.2.0 버전으로 범프합니다. CHANGELOG 파일에도 1.2.0 버전을 위한 빈 항목을 만듭니다. 이제 이 자동화 된 바이너리 브랜치에 추가되는 커밋은 모두 1.2.0 버전에서 처음으로 선보일 변경만 포함해야 합니다.
  • 1.1.1, 1.1.2 등의 1.1대 버전의 버그를 고치는 커밋을 모으기 위한 1.1-maintenance 브랜치를 새로 만들고, 마찬가지로 1.1.1 버전으로 범프합니다. CHANGELOG 파일에도 1.1.1 버전 항목을 만듭니다.

이후로는 1.1대 이후에 생긴 자동화 된 바이너리 자동화 된 바이너리 변경(주로 버그 패치)은 1.1-maintenance 브랜치에 넣으면 됩니다. 그리고 1.1.1 버전을 릴리스할 때 아래 작업들을 하게 됩니다.

  • 1.1.1 버전을 릴리스합니다.
  • 1.1-maintenance 브랜치의 버전을 1.1.2로 범프합니다. CHANGELOG에도 1.1.2 버전을 위한 항목을 만듭니다. 여기까지는 같습니다.
  • master 브랜치에 1.1.1 태그를 머지합니다. 이 때 CHANGELOG 파일이 맨 윗 부분에 충돌이 있을 수 있습니다. 1.1.1 버전 항목 위에 1.2.0 버전 항목이 놓이도록 손으로 해결해주면 됩니다.

이렇게 1.1-maintenance 브랜치와 master 브랜치를 함께 운영하면 1.2.0 버전이 출시하게 될 때는 그 동안에 알려져 있던 1.1대 버전의 모든 버그는 1.2.0 버전에서도 고쳐져 있게 됩니다.

패키지 저장소에 업로드 자동화

라이브러리 프로젝트라면 해당 프로그래밍 언어의 공식 패키지 저장소에 업로드하는 절차가 필요합니다. 예를 들어, 파이썬은 PyPI, 자바스크립트는 NPM이 되겠습니다. 라이브러리 릴리스에서 가장 중요한 작업이기 때문에 이 절차를 잊어버릴 일은 없지만, 사람이 손으로 할 일을 줄이면 아무래도 릴리스 프로세스 전반에서는 실수를 덜 하게 됩니다.

빌드 자동화

네이티브 바이너리

파이썬이나 자바스크립트 같은 스크립트 언어의 경우 소스 코드 형태로 라이브러리나 애플리케이션을 배포하는 것이 일반적이지만, 고(Go)나 하스켈, 러스트 같이 네이티브 바이너리로 컴파일되는 언어의 경우에는 경우 소스 코드 뿐만 아니라, 이용자가 직접 빌드하지 않고도 손쉽게 써볼 수 있도록 미리 빌드된 바이너리를 제공하는 것이 일반적입니다.

요즘에는 저장 공간의 비용이 저렴해진 덕에 애플리케이션이 의존하는 모든 라이브러리까지 통째로 정적 링크하여 배포하는 프로젝트도 늘고 있습니다. 최근에는 도커처럼 가상화된 환경에서 애플리케이션을 쓸 일이 많다보니, glibc 대신 musl 같은 가벼운 대안을 쓰는 환경도 많습니다. 이런 부분도 고려하다 보면 C 런타임까지 모두 정적 링크하여 이용자의 실행 환경과 최대한 독립적으로 쓸 수 있는 실행 바이너리를 만드는 게 도움이 됩니다.

모든 것을 정적 링크하게 되면 단 하나의 파일만 배포하면 된다는 장점도 누릴 수 있습니다. 다만 압축을 하지 않고 배포하면 다소 부담스러운 크기가 될 수도 있는데, 이러한 문제를 완화하기 위해서 컴파일러의 -Os 같은 파일 크기 최적화 옵션이나 UPX 같은 실행 파일 전문 압축 프로그램을 활용해볼 수 있습니다.

아래 스크립트는 .travis.yml 설정 파일에서 매 버전 릴리스(태그 빌드)마다 리눅스와 맥OS용 네이티브 바이너리를 정적 링크로 빌드하여 UPX 로 압축까지 하는 예시입니다 ( PROG 는 프로젝트에 맞게 치환).

다만, 모든 의존성을 정적 링크하여 배포하면 편리하기는 하지만, 중요한 보안 업데이트를 따라가기 힘들다는 단점도 있으니 유의해야 합니다. 여건이 된다면 정적 링크한 실행 바이너리는 차선책으로 제공하고, 널리 쓰이는 리눅스 배포판들을 위한 패키지를 제공하는 것이 좋습니다. 예를 들어 PPA나 .deb 패키지를 제공한다면 우분투나 데비안 이용자는 구태여 범용 바이너리를 다운로드하지 않을 것입니다.

파이썬 같은 스크립트 언어에서도 C 확장을 포함하는 라이브러리나 애플리케이션을 배포할 때는 네이티브 바이너리를 함께 제공하는 편이 좋습니다. 가령 파이썬이라면 컴파일된 C/C++ 바이너리를 포함한 라이브러리를 패키징하기 위한 .whl 포맷을 통해 네이티브 바이너리를 패키징할 수 있습니다.

윈도 이용자는 C/C++ 소스 코드를 빌드할 수 있는 개발 환경이 갖춰지지 않은 경우가 많으므로, 윈도용 바이너리를 함께 배포해야 이용자가 편하게 설치할 수 있습니다. 트래비스 CI 외에도 윈도 환경에서 CI 빌드를 할 수 있게 해주는 앱 베이어 같은 서비스를 함께 활용하면 매 버전 릴리스마다 윈도용 바이너리가 자동으로 빌드되도록 자동화할 수 있습니다.

다음은 매 빌드마다 파이썬 패키지의 .whl 바이너리를 빌드하여 아티팩트로 남기는 appvayor.yml 설정 예시입니다.

빌드 매트릭스

네이티브 바이너리를 제공한다면 이용자에게는 편하겠지만, 메인테이너에게는 큰 짐이 됩니다. 예를 들어 32비트 및 64비트 윈도, 맥OS, 리눅스를 지원해야 한다면 어떨까요? 그런데 파이썬 확장 모듈이어서 파이썬 2.7부터 최신의 파이썬 3.6까지 지원해야 한다면? (win32, win64, darwin, linux) ✕ (python2.7, python3.4, python3.5, python3.6) 조합에 해당하는 총 16개의 네이티브 바이너리를 만들어내야 합니다.

앱 베이어의 빌드 매트릭스를 활용하여 여러 파이썬 버전의 32비트 및 64비트 윈도 바이너리를 빌드하는 모습

참고로 빌드 매트릭스는 꼭 릴리스를 자동화하는 것 뿐만 아니라, 개발 과정에서도 꾸준히 지원하는 모든 플랫폼에서 자동화된 테스트를 돌려 볼 수 있다는 점에서도 매우 유용합니다.

깃허브 릴리스

바이너리를 열심히 빌드하더라도 이용자가 받을 수 있으려면 어딘가에 올려둬야 합니다. 깃허브 릴리스는 딱 그런 용도를 위해 만들어진 기능입니다. Git 태그 하나에 그 태그의 소스 코드로부터 빌드된 파일들을 올릴 수 있게 되어 있습니다. 예를 들어, 1.2.3 버전의 태그를 만들어서 푸시한 뒤에, 1.2.3 태그에 1.2.3 버전의 윈도용 실행 파일, 맥OS용 실행 파일, 리눅스용 실행 파일, 소스 코드 타볼을 올리는 식으로 쓸 수 있습니다.

깃허브의 다른 많은 기능처럼 깃허브 릴리스 역시 API로 모든 기능을 쓸 수 있기 때문에 자동화에 용이합니다. 워낙 많이 쓰이는 기능이기 때문에 많은 CI 소프트웨어·서비스가 깃허브 릴리스 연동 기능을 기본으로 갖추고 있기도 합니다.

다음은 트래비스 CI 의 깃허브 릴리스 연동 기능과 github-release 및 submark 유틸리티를 함께 사용하여, 매 태그 빌드마다 해당 버전의 바이너리를 올리고, 체인지로그의 해당 버전 섹션만 추출하여 깃허브 릴리스의 설명으로 채워넣는 .travis.yml 설정 예시입니다 ( PROG 는 프로젝트에 맞게 치환).

도커 허브 자동화 빌드

서버 소프트웨어의 경우 네이티브 바이너리 형태보다는 도커 이미지 형태로 배포하는 게 표준화 측면에서도 편리함 측면에서도 더 낫습니다. 애초에 네이티브 바이너리로 빌드할 수 없는 자동화 된 바이너리 자동화 된 바이너리 언어로 제작된 소프트웨어라면 도커 이미지를 대신할 만한 형태도 찾기 힘듭니다.

네이티브 바이너리의 빌드를 자동화하는 것과 마찬가지로, 도커 이미지도 CI 빌드 과정에 만들고 도커 허브에 푸시하면 됩니다. 이미 이 정도로도 간단하다고 할 수 있지만, 이보다도 더 단순한 방법이 있습니다. 바로 도커 허브의 자동화 빌드 기능을 활용하는 것입니다.

자동화 빌드는 이미지 저장소와 비슷한 개념이지만, 푸시는 못 하고 풀만 가능합니다. 이미지를 만들어서 저장소에 docker push 하는 대신, 자동화 빌드 저장소는 첫 설정 시에 원본 Git 저장소를 입력으로 받아, 해당 Git 저장소에 변경이 일어날 때마다 알아서 소스 트리를 받아 Dockerfile에 따라 이미지를 빌드하게 됩니다. 즉, 사람이 이미지를 빌드하고 푸시하는 작업을, 사람이 이미지로 빌드할 원본 소스 트리를 푸시하면 그걸 받아서 알아서 이미지로 빌드하는 작업으로 대체해줍니다.

자동화 빌드의 트리거 설정을 통해 특정 정규식에 부합하는 태그가 만들어졌을 때만 이미지를 빌드하게 하거나, master 브랜치에 푸시했을 때만 이미지를 빌드하게 하는 식의 활용이 가능합니다. 이용자 입장에서는 docker pull 만 하므로 해당 저장소가 일반적인 도커 이미지 저장소인지 자동화 빌드 저장소인지 신경 쓸 필요도 없습니다.

매 릴리스마다 준비해야 하는 것은 바이너리나 패키지 외에도 많습니다. 그 중 하나가 바로 문서입니다.

문서의 용도에 따라 정도의 차이는 있으나, 소프트웨어 제품의 문서는 소프트웨어 자체의 업데이트와 발을 맞추어야 합니다. 쓰고 있는 라이브러리의 오래 전 문서를 참고해서 기능을 만들고 나서 보니, 그 라이브러리의 최신 버전에서는 내가 방금 만든 기능을 탑재하고 있다는 사실을 깨닫고 허탈해진 경험, 문서가 쓰인 이후에 라이브러리 동작이 바뀐 줄 모르고 썼다가 운영 도중 예기치 못한 버그를 고쳐야 했던 경험 등. 소프트웨어 자체만 업데이트 되고 문서에는 반영되지 않아 낭패를 본 기억은 현업 프로그래머라면 다들 있을 것입니다.

문서와 소프트웨어의 변경을 발 맞추기 위해서 꼭 강조하고 싶은 원칙이 하나 있습니다. 문서를 소스 코드 저장소와 함께 보관하세요! 가령 소프트웨어 문서를 별도 위키에 자동화 된 바이너리 적는 것은 구성원의 남다른 의지력과 규범 의식 등을 자신하지 않는 한 문서 내용을 잘 갱신하지 않겠다는 것과 같습니다.

문서를 소스 코드 저장소에 함께 보관하면 이점이 많습니다. 우선, 과거 버전의 소스 코드를 살펴볼 때, 그 당시의 문서도 함께 볼 수 있습니다. 작업자가 작업하는 소스 코드 근처에 문서가 있으면 문서를 갱신해야 한다는 것을 덜 까먹기도 합니다. 또한 문서, 그리고 문서와 소스 코드의 관계에 대해서 린트(lint) 같은 검사를 수행할 수도 있습니다. 예를 들어 외부에 공개되는 API에 함수에는 항상 그에 대응하는 문서가 있는지를 매 빌드마다 검사할 수 있습니다. 무엇보다 프로젝트에 참여하는 사람들이 문서도 소프트웨어의 일부라는 인식을 주는 데에도 도움이 됩니다.

문서에도 체인지로그와 비슷한 원칙과 검사 장치를 적용할 수 있습니다. 기능 추가 단위(풀 리퀘스트 등)에 코드 뿐만 아니라 관련된 문서의 변경도 함께 하도록 원칙을 세우고, 문서를 갱신하지 않은 것이 분명하면 빌드가 실패하게 만들면 됩니다.

소프트웨어 코드가 저장소에 있다고 해서 이용자가 저장소에서 직접 소프트웨어를 받아야만 한다는 뜻은 아닌 것처럼, 문서를 저장소에 담는다고 해서 이용자가 문서를 저장소 안에서 뒤져야 한다는 뜻은 아닙니다. 소프트웨어를 빌드해서 바이너리나 패키지 형태로 가공해서 어딘가에 올려두는 것처럼, 문서 역시 자동화된 빌드 과정을 통해 가공하여 공식 홈페이지 등에 올리는 과정이 필요합니다. 이어지는 내용은 그러한 가공을 쉽게 자동화하는 팁입니다.

깃허브 페이지

문서의 포맷과 무관하게 일반적으로 활용할 수 있는 기능으로 깃허브 페이지가 있습니다. 이미 널리 알려져 있지만 간단히 소개하자면, 깃허브 저장소에 gh-pages 라는 브랜치를 만들어서 그 안에 정적 웹 사이트 파일들을 업로드하면 이를 서빙해주는 기능입니다. 깃허브 저장소가 foo/bar라면 foo.github.io/bar/라는 URL로 웹 사이트를 출판하게 됩니다. 소유한 도메인 이름이 있다면 연결할 수도 있습니다.

웹 사이트를 업로드하는 방식이 특정한 브랜치에 푸시하는 것이기 때문에 스크립팅하기 매우 쉽습니다. 트래비스 CI 는 깃허브 페이지스 연동 기능도 제공합니다. 이를 활용하면 사람이 손으로 생각날 때마다 문서를 업데이트하는 것이 아니라, 매 릴리스마다, 혹은 아예 매 푸시마다 문서를 갱신하도록 자동화할 수 있습니다.

리드 더 독스

RtD의 문서 빌드 대기열

스포카에서는 “매장과 세상을 세련되게 연결하다” 라는 슬로건 아래, 매장에 도움되는 여러 솔루션들을 개발하고 있습니다.
더 나은 제품으로 세상을 바꾸는 성장의 과정에 동참 하실 분들은 채용 정보 페이지를 확인해주세요!

자동화 된 바이너리

某些 Creative Cloud 应用程序、服务和功能在中国不可用。

XML, IDML 및 스크립팅을 사용한 출판 자동화

Adobe® InDesign의 유연한 XML 옵션, InDesign® Markup Language(IDML) 및 풍부한 스크립팅이 지원되므로 자동화된 강력한 워크플로우를 제작하여 다양한 시스템과 출력 미디어에 컨텐츠를 퍼블리싱할 수 있습니다. InDesign에서 지원되는 XML, IDML 및 스크립팅에 대한 자세한 정보를 확인하면 사용자 고유의 퍼블리싱 요구 사항을 충족하는 맞춤형 솔루션을 제작할 수 있는 강력한 기반을 마련하는 데 도움이 됩니다.

InDesign의 자동화를 고려하고 있는 경우에는 InDesign의 강력하고 유연하며 확장 가능한 버전인 Adobe InDesign Server를 살펴보십시오. InDesign Server는 InDesign과 동일한 코드베이스를 공유하므로 데스크탑 버전의 모든 기능과 서버 기반의 다양한 기능을 제공합니다.

이동:

IDML 리소스

IDML은 XML 기반의 개방형 파일 포맷으로 타사 개발자와 시스템 통합업체는 이를 통해 InDesign 외부에서 InDesign 문서를 프로그래밍 방식으로 작성하여 수정 및 분석할 수 있습니다. IDML은 표준 XML 편집 툴과 함께 사용할 수 있으므로 자동화된 워크플로우에서 손쉽게 사용 가능합니다. 또한 InDesign의 멀티 스레드 기능도 지원되므로 IDML 파일 포맷을 사용하여 작업 속도를 높일 수도 있습니다.

IDML을 통해 개발자는 다음과 같은 작업을 수행할 수 있습니다.

  • 동적으로 문서 생성 또는 수정
  • 문서의 일부 분석 및 재사용
  • XSLT를 사용하여 문서 요소 변환
  • XPath 또는 XQuery를 사용하여 InDesign 문서에서 데이터 검색 및 수정
  • Adobe Flash® Builder® 소프트웨어 및 Adobe AIR® 런타임을 사용하여 IDML 워크플로우를 이용한 맞춤형 애플리케이션과 인터페이스 제작

설계되어 있는 문서 워크플로우의 재구성

IDML은 문서를 이전 버전으로 저장할 수 있도록 InDesign CS2에서 처음 소개된 InDesign Interchange(INX) 포맷에서 파생된 것입니다. INX는 InDesign에서만 사용하도록 설계되었기 때문에 읽고 수정하기가 어려웠습니다. INX를 수정하려고 시도하면 XML 툴과의 호환성, 가독성, 견고함, 확장 가능성 등의 문제가 발생했습니다.

IDML에서는 개발자가 직접 InDesign 문서의 XML 표현을 변경하거나 구성 또는 재구성할 수 있도록 하여 이러한 문제를 해결했습니다. 이제 InDesign 외부에서 InDesign 파일을 제작하거나 수정하는 것이 가능해졌습니다. 이러한 자동화 된 바이너리 파일은 다시 InDesign 제품으로 가져와서 최종 출력 포맷으로 렌더링할 수 있습니다.

IDML은 보다 쉽게 다양한 출판 솔루션을 구축하고 구현할 수 있는 유연한 방식을 제공합니다. 또한 다음과 같은 이점이 있습니다.

  • 완전성 — IDML을 사용하면 개체, 특성 및 환경 설정을 완벽한 양방향 편집 기능을 사용하여 표현할 수 있습니다.
  • 가독성 — IDML 포맷은 XML을 읽고 쓸 수 있는 거의 모든 프로그램 또는 툴로 읽고 쓸 수 있습니다.
  • 견고함 — IDML을 사용하면 개발자는 오류를 제대로 파악하여 보다 유연하게 처리할 수 있습니다.
  • 이전 버전과의 호환성 — 사용자는 한 버전에 맞게 생성된 IDML 파일을 가져다가 후속 버전에서 열 수 있습니다.

IDML은 XML 포맷을 채택했기 때문에 그 용도는 매우 다양합니다. 그러나 몇 가지 공통된 용도에는 다음과 같은 것이 있습니다.

IDML 파트너

Sabern은 네덜란드에 소재하며 데이터베이스 출판, 문서 출판, 컨텐츠 관리 및 Web-to-Print 솔루션용 소프트웨어와 애플리케이션 개발을 전문으로 하는 소프트웨어 기업입니다. Sabern은 맞춤형 애플리케이션 개발 서비스를 제공하며 인쇄, 정부, 항공, 금융, 도매, 운송 및 통신 산업에 종사하는 조직에 자동화된 출판 솔루션을 제공하면서 그 실력을 입증하고 있습니다.

웹 브라우저와 Sabern의 DesignDB를 사용하면 InDesign 에서 제작한 사전 설정된 템플릿을 기반으로 문서와 고해상도 PDF 파일을 제작할 수 있습니다. 전문 디자이너가 아니어도 DesignDB를 사용하면 빠르고 쉽게 전문가 수준의 마케팅 자료를 제작할 수 있으므로 기존 워크플로우와 비교하여 속도 및 효율성이 대폭 향상된 것을 경험할 수 있습니다.

"DesignDB는 Adobe의 새로운 IDML 포맷을 적극 활용하고 있습니다. IDML은 InDesign 서식 지정 기능에 액세스할 수 있는 특수한 요소가 포함된 XML이므로, XML 편집 소프트웨어와 유틸리티를 사용하여 InDesign 외부에서 IDML을 조작할 수 있습니다. 이러한 포맷을 통해 개발자는 탁월한 유연성을 확보할 수 있으므로 자동화된 최신 출판 솔루션을 신속하게 출시할 수 있습니다."
— Karen Lelieveld, Sabern

censhare AG는 미디어 에셋 관리 자동화 된 바이너리 솔루션을 기반으로 여러 미디어 채널에서 사용할 수 있는 컨텐츠의 제작, 관리 및 출판을 위한 censhare 출판 시스템 개발 회사입니다. 이 시스템에는 웹 컨텐츠 관리 및 공동 작업 툴이 포함되어 있습니다.

컨텐츠를 여러 언어로 출판하고자 하는 고객은 censhare 번역 메모리 시스템을 사용하여 특정한 번역 요소를 추출하여 재사용할 수 있습니다. 번역 메모리 시스템에서는 IDML을 사용하여 컨텐츠를 보다 효율적인 방식으로 추출 및 수정합니다. 이를 통해 모든 스타일을 그대로 유지한 상태에서 문장을 토대로 텍스트와 단락을 세그먼트로 세분화하는 것이 가능해졌습니다. 또한 IDML은 censhare 솔루션을 Microsoft Office와 제대로 통합할 수 있는 방법도 제공합니다. Excel 표와 Word 문서에는 censhare에서 자동으로 서식을 지정할 수 있으므로 InDesign 레이아웃에 직접 삽입한 다음 편집할 수 있습니다.

"IDML은 전문적인 출판을 위해 개방된 완벽한 표준 레이아웃 포맷입니다. 이제 표준 XML 툴을 사용하여 레이아웃을 구성하거나 디코딩할 수 있습니다. censhare는 XML을 기반으로 하므로 매우 유연한 통합이 가능합니다."
— Mathias Wurth, censhare AG

UGS 사전 컴파일링된 바이너리

언리얼 게임 싱크 를 사용한 빌드 동기화 및 컴파일링은 언리얼 엔진을 컴파일링할 수 있고 일련의 스크립트를 사용하여 빌드 프로세스를 자동화하는 IDE가 로컬 장치에 있는지에 따라 달라집니다. 그러나 프로젝트의 많은 참여자는 코드 기반으로 작업하지 않거나 IDE에 액세스 권한이 없습니다. 이런 사용자들도 프로젝트의 최신 빌드를 사용할 수 있도록, 언리얼 게임 싱크는 빌드에 대한 사전 컴파일링된 바이너리(Precompiled Binary, PCB) 추가를 지원합니다. PCB는 .zip 파일로 퍼포스에 제출하여 체인지리스트와 연결할 수 있습니다. 그런 후에 언리얼 게임 싱크는 로컬로 컴파일링하는 대신 .zip 파일의 콘텐츠를 동기화 및 추출할 수 있습니다.

이때 로컬로 컴파일링할 때와 같은 유저 인터페이스를 사용하지만, 일치하는 바이너리가 없는 변경 사항은 회색으로 표시됩니다. 환경설정이 완료되면 사용자는 옵션(Options) 메뉴 아래 있는 사전 컴파일링된 바이너리 동기화(Sync Precompiled Binaries) 에 체크하여 사전 컴파일링된 바이너리 사용을 허용받을 수 있습니다.

기본 퍼포스 설정

다음 단계는 언리얼 엔진 4 프로젝트에서 사전 컴파일링된 바이너리를 사용하기 위해 사용자에게 필요한 것을 설명합니다. 이 절차는 사용자가 소스 컨트롤로 사용하기 위한 퍼포스 설정 을 이미 완료했다고 가정합니다. 퍼포스 서버의 콘텐츠를 UGS와 함께 사용하도록 설정하려면 여기에 설명된 대로 진행합니다.

사용자는 엔진 소스 코드, 언리얼의 빌드 프로세스로 생성되지 않은 종속성 및 프로젝트가 포함된 하나의 스트림이 필요합니다.

필요한 언리얼 엔진 파일이 모두 존재하는지 확인하려면 사용자는 에픽의 기존 퍼포스 릴리스 스트림 중 하나에서 복사해야 합니다.

//UE4/Release-4.xx 명명 규칙에 따른 다른 릴리스 스트림에서 복사해도 됩니다. 개발자가 로컬로 빌드를 시작한 후 스트림 사본에 다른 파일이 추가되지 않도록, .p4ignore.txt 파일이 복사되었는지 반드시 확인합니다.

사용자는 GitHub 소스 빌드 를 사용하여 GitDependencies.exe 를 실행하고 수집한 종속성뿐 아니라 전체 소스를 업로드할 수 있습니다. 에픽의 퍼포스 스트림 중 하나를 복사하는 것은 여전히 권장된 경로이며, 파일의 수집, 생성, 업로드 방법과 상관없이 .p4ignore.txt 파일은 반드시 스트림에서 복사해야 합니다.

퍼포스 내에서 파일을 어떻게 설정하기로 결정하든, 파일 유형과 권한이 설정하는 릴리스의 릴리스 스트림과 일치하도록 합니다. 우리의 스트림에서 쓰기 가능하다고 표시된 파일은 여러분의 스트림에서도 쓰기 가능해야 합니다.

쓰기 가능 항목과 불가능 항목의 불일치로 인해 빌드 또는 런타임 오류가 발생할 수 있습니다. 이러한 권한을 확인하려면 퍼포스 에서 스트림을 열고 파일명 오른쪽을 확인합니다.

퍼포스에서 권한 확인

여러분의 스트림에서 파일 유형이나 권한을 변경해야 하는 경우, 편집을 위해 파일을 연 후 우클릭하고 파일 타입 변경(Change Filetype) 을 클릭합니다.

퍼포스에서 파일 타입 변경

이렇게 하면 우리의 릴리스 스트림과 일치하도록 파일 타입과 권한을 편집할 수 있는 메뉴가 열립니다.

빌드 또는 런타임 동안 특정 파일에 액세스 불가(Access Denied) 오류가 발생한다면, 이러한 권한이 제대로 설정되지 않았을 가능성이 큽니다.

UGS와 사용하는 모든 프로젝트는 네이티브 프로젝트여야 하고 언리얼 엔진용 파일과 같은 스트림에 있어야 합니다. 네이티브 프로젝트는 언리얼 디렉터리 구조의 최상위 디렉터리에서 발견되거나 .uprojectidrs 파일에 목록화된 경로의 한 레벨 깊이에서(언리얼 디렉터리 구조의 최상위 부분에서도) 발견할 수 있는 프로젝트입니다.

스트림 설정하기

사용자는 사전 컴파일링된 바이너리 .zip 파일을 보관하기 위해 별도의 스트림을 사용해야 합니다.

하나의 스트림을 사용할 수도 있지만, 첫 번째 스트림에 액세스할 수 있는 사용자라면 모두 액세스할 수 있는 두 번째 개별 스트림을 사용할 것을 강력히 권장합니다. 이렇게 하면 PCB를 사용하지 않는 팀 구성원의 이탈을 피할 수 있습니다.

이를 위해 별도의 워크스페이스를 유지할 필요는 없습니다. 언리얼 게임 싱크는 파일을 동기화하는 데 사용하는 것과 동일한 로그인 크리덴셜을 사용하여 비저장 방식으로 PCB를 가져옵니다.

PCB가 업로드될 스트림은 다음과 같이 구성합니다.

프로젝트의 루트 디렉터리 아래에 Build/UnrealGameSync.ini 를 추가하고 바이너리가 업로드될 퍼포스 위치를 참조합니다. UGS가 퍼포스에서 PCB를 가져올 때 파일을 검색하게 됩니다.

Build\UnrealGameSync.ini 의 예시 항목입니다.

UnrealGameSync.ini가 [Project Root]/Build/* 위치에 있어야 합니다.

ZippedBinariesPath 를 지정할 때 기억해야 할 세부 사항이 있습니다.

//UE4/Dev-Binaries/++UE4+Main-Editor.zip이라는 이름은 아래 업로드 부분에서 언급한 ArchiveStream 실행인자와 일치해야 하며, 여기서 ++UE4+Main은 슬래시가 ‘+' 문자로 이스케이프 처리된 현재 분기의 이름입니다. 실행인자를 사용할 때는 ‘+' 문자 대신 슬래시가 있어야 합니다.

PCB 스트림에 액세스할 수 있는 모든 사용자 계정은 새로운 PCB 세트를 업로드할 수 있지만 이 작업을 수행하는 방법은 사용자에게 달려 있습니다. 이는 스튜디오에서 디플로이하려는 방법에 따라 달라지기 때문입니다. 사용자가 수동으로 업로드를 수행할 수도 있고, 자동화된 빌드 노드가 수행할 수도 있습니다.

사전 컴파일링된 바이너리 생성 및 업로드하기

두 스트림을 설정하고 사용자가 액세스 권한을 받았다면, 이제 PCB를 생성하고 지정된 PCB 스트림에 업로드할 차례입니다.

PCB를 생성하고 업로드하려면 다음에 따릅니다.

메인 스트림 의 콘텐츠를 퍼포스에서 동기화합니다.

[UE Root]/Engine/Build/Graph/Examples/BuildEditorAndTools.xml 에 있는 예제에 기초한 BuildGraph 스크립트를 실행하여, PCB를 생성하고 올바른 퍼포스 위치에 업로드합니다( -ArchiveStream 실행인자로 위치 지정).

다음은 BuildEditorAndTools 를 사용한 명령의 예시입니다.

``` Engine\Build\BatchFiles\RunUAT.bat BuildGraph -Script=Engine/Build/Graph/Examples/BuildEditorAndTools.xml -Target="Submit To Perforce for UGS" -set:EditorTarget=ShooterGameEditor -set:ArchiveStream=//UE4/Dev-Binaries -p4 -submit ``` 이 예제에서 ShooterGame 은 네이티브 프로젝트이고 사용자가 PCB로 업로드하려는 프로젝트는 모두 네이티브여야 합니다.

BuildEditorAndTools.xml 사용에 관한 추가 정보는 파일 시작 시의 코멘트에서 찾을 수 있습니다.

ArchiveStream은 앞에서 지정한 ZippedBinariesPath와 일치해야 하지만, 슬래시를 이스케이프 처리한 ‘+' 문자 대신 슬래시를 사용합니다.

이 예제에서는 //UE4/Dev-Binaries/++UE4+Main-Editor.zip에 zip 파일을 제출합니다. 여기서 ++UE4+Main은 슬래시가 ‘+' 문자로 이스케이프 처리된 현재 분기의 이름입니다. UnrealGameSync.ini 에서 ZippedBinariesPath 값도 동일한 경로로 설정해야 합니다.

CL 설명이 올바른 형식인지 확인하세요. UGS는 각각의 CL 설명이 'CL'로 시작하고 그 뒤에 8자리 숫자가 있을 것으로 예상하므로(CL ########) 바이너리와 연결된 체인지리스트를 알 수 있습니다.

이 .zip 파일에는 PDB가 포함되어 있지만 빌드 크기를 줄이기 위해 제거됩니다. 이렇게 하면 충돌로부터 콜스택을 수집할 수는 있지만 온전한 디버깅은 허용되지 않습니다. 팀에 더 좋은 심볼 스토리지가 필요하다면 심볼 서버를 사용하는 것이 좋은데, 이는 IT 및 디플로이 팀이 시행할 일입니다.

UGS에서 사전 컴파일링된 바이너리 사용하기

사전 컴파일링된 바이너리가 성공적으로 생성되어 보조 스트림에 업로드된 후, UGS는 주 스트림에 있는 파일을 사용하여 메인 스트림으로 PCB를 감지하고 사용할 수 있습니다.

사전 컴파일링된 바이너리 동기화(Sync Precompiled Binaries) 옵션을 활성화하고 최신 상태로 동기화합니다. 그림의 예제는 사전 컴파일링된 바이너리가 없는 스트림이지만 이전 단계에서 바이너리를 제대로 구성했다면 자동화 된 바이너리 해당 옵션을 선택할 수 있을 것입니다.

자동화 된 바이너리

페이스북(으)로 기사보내기 트위터(으)로 기사보내기 카카오스토리(으)로 기사보내기 카카오톡(으)로 기사보내기 네이버밴드(으)로 기사보내기 네이버블로그(으)로 기사보내기 URL복사(으)로 기사보내기 이메일(으)로 기사보내기 다른 공유 찾기 기사스크랩하기

페이스북(으)로 기사보내기 트위터(으)로 기사보내기 카카오스토리(으)로 기사보내기 카카오톡(으)로 기사보내기 네이버밴드(으)로 기사보내기 네이버블로그(으)로 기사보내기 URL복사(으)로 기사보내기

카본블랙서 탐지된 파일 조샌드박스로 전송해 심층 분석
악성으로 판명된 바이너리에 대한 자동 알람 생성

네트워크 보안 전문업체인 인섹시큐리티는 9일 멀웨어 분석 솔루션 기업인 조시큐리티(JoeSecurity)가 제로데이 공격 및 타깃 공격을 탐지하고 차단할 수 있도록 지원하는 ‘카본블랙 커넥터(Carbon Black Connector)’를 출시했다고 밝혔다.

커넥터는 조시큐리티 깃허브에서 다운로드 받을 수 있다

카본블랙 사용자들은 이 커넥터를 사용해 조샌드박스로 자동화된 멀웨어 심층 분석을 실시할 수 있다.

카본블랙에서 탐지된 의심스러운 파일이 커넥터를 통해 조샌드박스로 전송돼 심층 분석 후 생성된 위협 인텔리전스 데이터를 카본블랙으로 다시 내보내기 할 수 있다.

커넥터 설치 후 바이너리 서치 메뉴를 통해 악성 파일을 탐색할 수 있으며 분류 기준을 추가하거나 조샌드박스 스코어를 확인할 수 있다. 조샌드박스 스코어는 각 파일 행동 양식에 대한 지표로서 가장 낮은 0에서부터 가장 위험한 100까지의 범위 내에서 정해진다. 특정 수치 이상의 바이너리를 검색 후 해시 링크를 통해 바이너리에 대한 세부 정보를 확인할 수 있다.

이와 함께 일람표(watchlist)를 생성해 카본블랙에서 새로운 바이너리를 탐지 후 조샌드박스에서 악성으로 판명되면 자동 알람을 받을 수 있다.

김종광 인섹시큐리티 대표는 “조샌드박스와 카본블랙의 연동을 통해 강력한 시너지 효과가 발생한다. 제로데이 공격 및 타깃형 공격이 점점 늘어나는 환경에서 샌드박스 기술과 EDR 보안을 통합함으로써 유연하고 민첩한 분석 대응이 가능해질 것으로 기대한다”고 말했다.

Researcher, Research S/W Engineer

회사 대표 이미지

# 바이너리브릿지 회사 소개 바이너리브릿지는 "0101 이진법으로 전달되는 정보/기술로 물류를 이어주는 다리"라는 의미로, 기술을 이용하여 편리하고, 투명하고, 효율적이며, 자동화된 실시간 배송환경을 만들어가는 스타트업입니다. # 핑퐁 퀵서비스 바이너리브릿지는 "Ping 보내고 Pong 받는, 운영이 자동화된 퀵서비스" 핑퐁을 21년 1월에 런칭하여 서비스하고 있습니다. 기존의 퀵서비스를 사용해보셨다면, 주문이 제대로 접수 된 것인지, 기사님이 배정은 되었는지, 픽업/배송은 언제 오는지 등 정보를 제대로 전달 받을 수 없어서 불편했던 경험을 해보셨을 거에요. 핑퐁 퀵서비스는 주문 접수, 주문 배정, 배송 경로 안내, 배송 상태 추적을 알고리즘이 자동으로 관리합니다. 기존의 퀵서비스는 라이더가 배송하고자 하는 주문을 직접 선택하는 경쟁식 전투배차 방식인 반면, 핑퐁은 알고리즘이 최적의 동선을 고려하여 주문 묶음을 배정해주는 방식입니다. 따라서 핑퐁 배송파트너는 임의성을 제거한 쉽고 안전한 환경에서 근무합니다. 핑퐁 고객은 요청한 주문의 배송상태를 실시간으로 확인할 수 있습니다. 언제 배차될 것인지, 언제 픽업/배송될 것인지 정확한 예상시간과 알림도 제공받습니다. 각각의 라이더가 주문을 경쟁적으로 선택할 때보다 플랫폼이 전체의 효율을 고려하여 주문을 배정할 때 더 높은 물류효율이 얻어지는 것은 자명합니다. 핑퐁 알고리즘의 최적 자동배차는 전체의 배송효율을 극대화합니다. 배송품질과 주문분배가 균질해지고, 예측가능해지는 효과는 덤입니다. 기존의 서비스보다 효율적으로 운영되기 때문에 핑퐁의 고객은 더 낮은 가격에 더 좋은 배송 서비스를 이용하고, 배송파트너는 안전하고 쉬운 업무 환경에서 더 높은 수익을 얻습니다. # 핑퐁 당일배송 핑퐁 당일배송 서비스는 낮 3시까지 주문하면 당일 밤 10시 이전에 도착하는 배송서비스로, 21년 7월에 서비스를 시작하였습니다. 서울 전 지역의 주문을 택배 수준의 균일가로 당일에 배송합니다. 핑퐁 자동화 된 바이너리 당일배송 파트너사의 고객은 며칠을 기다릴 필요 없이 주문 당일에 바로 상품을 받아볼 수 있습니다. 퀵서비스가 픽업지에서 배송지로 바로 배송하는 Point-to-point 모델로 배송되는 반면, 당일배송의 경우 배송까지 소요되는 시간이 비교적 길고 배송 단가는 낮기 때문에 한꺼번에 많은 주문을 묶어갈 수 있는 Hub-and-spoke 모델을 중심으로 운영됩니다. 서울 인근 쇼핑몰 고객의 주문을 취합하여 핑퐁 허브로 입고하고, 배송지역별로 다시 묶어 바로 출고합니다. 일반적인 택배의 Last mile 배송은 구획별로 담당자가 배정되어 짧게는 하루, 길게는 며칠에 걸쳐 임의적으로 배송하는 방식으로 운영됩니다. 반면 핑퐁 당일배송은 주문 접수부터 배송까지 반나절이라는 짧은 시간 안에 가능하도록 입/출고 주문묶음의 생성 및 배송파트너 배정을 알고리즘으로 자동화하였습니다. 주요 거점에 Micro-fulfillment center 또는 Micro-hub를 설치하거나, Point-to-point 모델을 적절히 혼용하여 배송효율을 더 높이는 것을 목표하고 있습니다. # 팀 구성 창업팀은 온라인 음식배달 서비스 ‘푸드플라이’를 창업하고 함께 운영했던 이전 경영진으로 구성되어 있습니다. ‘푸드플라이’를 통해 Last-mile Logistics 최전선에서 산업에 대한 이해와 경험을 쌓으며 창업(‘11) ~ Delivery Hero M&A(‘17) 및 인수 후 통합 과정을 통해 스타트업 라이프사이클 전반에 걸친 다양한 배움과 노하우를 습득해 왔습니다. 창업팀에 더해 Uber, Amazon, Delivery Hero 등 e-Commerce 및 Logistics 유관 영역에서 다양한 경험을 갖춘 인재들이 새롭게 합류하여, 젊음과 경험이 조화를 이룬 건강한 초기팀을 구성하고 있습니다. # 현황 2020년 3월 법인 설립 2020년 6월 Seed 투자 유치 2020년 9월 TIPS 선정 2021년 1월 핑퐁 퀵서비스 런칭 2021년 4월 핑퐁 비즈니스 서비스 런칭 2021년 7월 핑퐁 당일배송 서비스 런칭

Researcher, Research S/W Engineer , 어떤 일을 하나요?

라스트마일 물류모델의 큰 그림을 이해하고, 개선점 도출 - 해결책 기획 - 상용 수준의 구현까지 가능한 연구원/기술기획자/개발자를 찾습니다.

• DS (Dispatch System): 배차 관리 시스템 개발 • 배차 알고리즘 (Dispatch Algorithm) 및 시뮬레이터 개발 - Vehicle Routing Algorithm (Point-to-point 물류모델의 배차 자동화) - Bin Packing Algorithm (Hub-and-spoke 물류모델의 배차 자동화) • TMS (Transportation Management System): 배송 관리 시스템, 교통/배송 예측 시스템 개발 • SDMS (Supply & Demand Management System) 배송 수요 및 공급 분석/예측/계획/관리 시스템 개발 • Data warehouse 구축 및 서비스 지표 분석 • 머신러닝 기반 주문/공급/배송 예측/평가/결정 모델 개발

(preferred†) • 자기주도적으로 복잡한 문제를 정의/분석/해결하는 것을 즐기며, 최신기술을 이해하고 적정기술을 구현할 줄 아는 엔지니어 • 개발언어 및 협업 경험 (Python†, Git†) • 공학/이학 배경지식 또는 경험 (컴퓨터공학†, 계산과학†, 수학†, 계통설계/해석†, 산업공학†)

(preferred†) • 알고리즘 설계에 대한 이해/경험 • 택배/라스트마일 배송관리 시스템에 대한 이해/경험 • DB (MySQL†) • Cloud computing service & infrastructure (AWS†) • RESTful API / Event-driven API • Serverless / Microservice architecture • Data science / Machine learning

혜택 및 복지

• "최고의 복지는 함께 일하는 동료들"이라는 말에 부합하는 젊지만 똑똑하고 경험있고 이타적인 구성원들 • 치열하지만 자발적인 업무 분위기. 직급조직이 아닌 역할조직을 지향하는 수평적 문화 • 유연한 휴가 사용 • 팀 활동비, 회식비, 커피비, 교통비 • 맥북프로, 모니터 제공


0 개 댓글

답장을 남겨주세요