시작하기 전에 hipchat, jenkins 계정은 모두 있다고 가정하고 설명합니다.

Hipchat

먼저 방을 생성한 다음, ... 버튼을 눌러 Integrations를 누른 후 Install new integrations를 선택합니다.



다음 Build your own integration 버튼을 클릭합니다.



다음 적당한 별칭 (bot의 이름)을 정해줍니다. 여기선 Deployment Bot이라 생성했습니다. (아래 스크린샷과 다름..)



Create버튼을 누르면 아래와 같은 화면과 


Send messages to this room by posting to this URL의 값이 있는데 여기서 room/252352 와 같이 room 번호와 auth_token=Hcr8hO8Hihoph8P 와 같은 api tocken을 따로 저장해둡니다. (jenkins에 등록할 때 필요함)


Jenkins



Jenkins > Credentials > System > Add Credentials을 눌러 아래와 같은 화면에서 Secret text를 선택한 후, Scope에 아까 적어놓은 api tocken을 붙여 넣습니다. id와 description은 jenkins에서 확인하는 용도로 아무 이름이나 지으면 됩니다.



다음 젠킨스 잡을 생성한 다음 '빌드 후 조치' 탭에서 HipChat notifications를 선택해 활성화 시킵니다.



마지막으로 Credentials부분에 아까 설정한 Credentials을 선택하고 미리 저장해놓은 프로젝트 방번호를 입력합니다.  다음 아래와 같이 언제 HipChat notifications을 발생할 지를 선택해주면 끝입니다.

'저장소' 카테고리의 다른 글

Jenkins - Hipchat 연동  (0) 2017.10.16
SourceTree 설치방법 및 용어  (0) 2016.07.08

http://blog.appkr.kr/learn-n-think/comparing-workflows/

'저장소 > gitlab' 카테고리의 다른 글

(펌) Git을 이용한 협업 워크플로우 배우기  (0) 2017.03.08
README.md  (0) 2016.12.26
[docker] gitlab 설치하기  (0) 2016.09.24

README.md 파일은 git, github 등과 같이 저장소에서 많이 본 파일입니다. 해당 파일은 소스코드에 앞서 어떠한 목적으로 개발이 되었는지, 코드의 개요, 구조도 등을 처음 사람들에게 노출함으로써 해당 프로젝트에 대해 설명을 합니다.

여기서는 여러형태의 리드미 파일을 전부 다루는 것이 아닌 현재 사용중인 gitlab의 README.md파일을 위주로 필요성 및 문법을 설명하도록 하겠습니다.

리드미(readme)란?


리드미 (README, readme, read me) 파일은 디렉토리나 압축 파일에 포함된 기타 파일에 대한 정보를 가지고 있으며, 일반적으로 소트프웨어와 함께 배포됩니다. 또한 현재 git과 같은 저장소에서도 해당 파일을 default로 생성하여 해당 저장소에 대한 설명을 기입하도록 하고 있습니다.

리드미의 파일 형태는 README.TXT, README.md, README.1ST, README.DOC READ.ME 또는 간단히 README 등 많은 파일 명과 확장자 형태를 가지고 있습니다.


리드미 (README의 다양한 형태를 여기서는 '리드미'로 부르겠습니다.)는 다음 중 하나 이상의 정보를 포함합니다.

  • 컴퓨터 구성 안내
  • 설치 안내
  • 사용법
  • 파일 메니페스트 (파일 목록 포함)
  • 저작권 및 사용권 정보
  • 배포자 및 프로그래머의 연락처 정보
  • 알려진 버그
  • 트러블슈팅
  • 크레딧
  • 체인지로그


위에 나열한 목록 이외의 정보를 포함할 수 있습니다. 또한 오픈소스 배포판을 일반적으로 아래와 같은 표준 집합의 리드미 파일들을 포함합니다.


README일반 정보
AUTHORS제작 정보
THANKS도와주신 분들에 대한 정보
ChangeLog프로그래머들이 참고 할 수 있는 자세한 체인지로그
NEWS사용자들이 참고할 수 있는 기본적인 체인지로그
INSTALL설치 안내
COPYING/LICENSE저작권 및 사용권 정보
BUGS알려진 버그 및 새로운 버그 보고 방법 안내

리드미 파일로 해당 프로젝트의 버젼, 이전버젼과 변경된 사항들, 파일 목록, 시스템 구조도 등을 작성하여 사용자들이 특이 사항들을 바로 확인 할 수 있도록 합니다.

리드미(readme)작성법


readme작성은 사실 사용자 마음대로 작성해도 되지만 Markdown 문법에 맞게 작성하면 html과 같이 더 멋지게 꾸밀 수 있습니다.

마크다운 소개 

마크다운(Markdown)은 일종의 마크업 언어로 텍스트에 태그를 이용해서 글자를 굵게 하거나, 이미지를 삽입하거나 하는 일이 가능합니다. 엔하위키에 글을 쓸 때 위키 언어를 이용해서 글을 써야하는데, 마크다운 언어는 그 위키 언어와 상당히 유사하다고 할 수 있습니다. 하지만 마크다운은 위키문법보다 훨씬 더 간단하므로 익히는데 그리 긴 시간이 필요하지 않다는 장점을 가지고 있습니다.

요즘 마크다운은 아주 여러 곳에서 사용되고 있습니다. 이제 워드프레스에서는 기본적으로 마크다운을 지원하기 시작했고, Tumblr나 Ghost와 같은 블로그 플랫폼에서도 마크다운 언어를 기본적으로 지원하고 있습니다. 그리고 심지어는 그누보드나 XE에도 마크다운을 쓸 수 있는 플러그인이 있어서 그 플러그인을 설치하면 그누보드나 XE에서 글을 쓸 때, 마크다운을 이용하는 것이 가능합니다.

마크다운의 장단점

장점

  • 읽기 쉽다.
    마크다운은 다른 마크업 언어에 비해 훨씬 알아보기 쉽습니다. 제목은 앞에 #을 붙여주면 되고, 글자를 강조하려면 글자 주위를 **으로 감싸주면 됩니다. HTML로 글을 쓸 때는, 그 글이 실제로 브라우저에 어떻게 보여질지 상상하는 것이 꽤 어려운 일이었다면 마크다운으로 쓴 텍스트는, 텍스트만으로 그 글이 브라우저에서 어떻게 보여질지 쉽게 상상할 수 있습니다.
  • 익히기 쉽다
    마크다운은 상당히 간단합니다. John Gruber가 처음에 마크다운을 만들었을 때, 사람들이 가장 많이 사용하는 기능만을 마크다운으로 쓰고, 복잡한 것은 HTML로 쓰도록 디자인했기 때문입니다. 그래서 비록 몇가지 제한이 있기는 하지만 마크다운으로 글을 쓸 때, 중간에 HTML을 그대로 써도 상관 없습니다.
  • 모바일 친화적이다
    요즘 모바일을 통해서 글을 쓰고 올리는 경우가 상당히 많아졌습니다. 그런데, 모바일로 서식이 들어간 글을 쓰는 것은 상당히 불편하다. 특히 모바일에서는 에디터가 제대로 작동하지 않는 경우도 있고, 작동하더라도 작은 화면때문에 에디터를 통해서 글을 작성하는 것이 상당히 불편한 경우가 많습니다. 하지만 마크다운을 이용해서 글을 쓰면 간단한 태그만으로 쉽게 서식을 넣을 수 있어서, 위지윅 에디터를 사용하는 것보다는 훨씬 편리합니다.

단점

  • 문법이 너무 단순하다
    문법이 너무 단순해서 그 기능을 벗어나려고 할 때는 결국 HTML을 써야하는 경우가 생깁니다. 예를 들어, 마크다운에는 이미지를 정렬하는 문법이 없습니다. 따라서 이미지를 정렬하려면 HTML의 img 태그를 써야합니다. 또한 태그에 클래스 지정등이 불가능하기 때문에, 클래스나 id를 지정하려면 역시 HTML을 써야합니다.
  • 확장 문법이 많다
    이것은 첫 번째 단점 때문에 발생한 문제라고 볼 수 있습니다. 문법이 너무 단순하기 때문에 그 불편함을 해소하기 위해서 여러가지 확장 문법들이 생기기 시작했고, 그런 파편화 때문에 한 곳에서 잘 작동하는 마크다운 문서가 다른 곳에서는 잘 작동하지 않는 현상이 생기기도 합니다.
  • 멀티미디어 삽입이 불편하다
    위지윅 에디터에서 이미지를 삽입할 때는, 보통 이미지 업로드 버튼을 이용해서 이미지를 삽입합니다. 하지만 마크다운은 그저 텍스트만 입력 가능하기 때문에, 이미지를 삽입하는 것과 이미지를 업로드하고, 그 주소를 따오는 과정들이 모두 분리되어 있습니다. 그래서 마크다운을 이용해서 블로그의 글을 작성할 때 가장 불편한 것이 바로 이미지를 삽입할 때입니다. 하지만 유튜브 등의 외부 동영상을 삽입할 때는 위지윅 에디터를 쓰는 것과 크게 다르지 않습니다.

마크다운 문법

제목

# 을 하나 쓰면 HTML의 <H1> 태그이고 #을 2개쓰면 <H2> 태그를 의미합니다. #은 총 6개까지 사용할 수 있고 #이 늘어날 때 마다 글씨가 작아집니다.

# 제목
## 부제목
### 소제목

번호가 없는 리스트

* 목록 
* 목록 1
- 다른 목록
- 다른 목록 1
+ 다른 목록 3

번호가 있는 리스트

1 첫 번쨰
2 두 번째
3 세 번째
5 다섯 번째
4 여섯 번째 

반드시 숫자를 맞춰 사용할 필요는 없습니다.

기울여진 글씨

*텍스트*
OR
_텍스트_

굵은 글씨

**텍스트**
OR
__텍스트__

인용

> 텍스트

인용문안에 인용문을 또 사용하려면 >을 추가하면 됩니다.

인라인 링크

[텍스트](링크주소)

참조링크

[텍스트][참조명]
 
[참조명]: 링크주소

이미지

![텍스트](이미지링크)

수평선

_, *, - 을 3개 이상씩 나열
 
---
***
___

코드

\`코드 내용\`

코드블럭

앞에 공백 4개 이상 삽입


'저장소 > gitlab' 카테고리의 다른 글

(펌) Git을 이용한 협업 워크플로우 배우기  (0) 2017.03.08
README.md  (0) 2016.12.26
[docker] gitlab 설치하기  (0) 2016.09.24

gitlab 이미지 설치

$ docker pull gitlab/gitlab-ce

gitlab 이미지 실행

sudo docker run --detach \
    --hostname gitlab.example.com \
    --publish 443:443 --publish 80:80 --publish 22:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest


'저장소 > gitlab' 카테고리의 다른 글

(펌) Git을 이용한 협업 워크플로우 배우기  (0) 2017.03.08
README.md  (0) 2016.12.26
[docker] gitlab 설치하기  (0) 2016.09.24

공통

1. https://www.sourcetreeapp.com/ 에서 SourceTree 다운로드 후 실행

2. 실행 도중 Atlassian의 계정이 없을 경우, Atlassian 생성

3. 가입한 계정 또는 기존 존재하는 계정으로 이메일 인증

4. Remotes 부분 건너뛰기

5. SSH 키 불러오기 아니요 선택

Windows

6. 컴퓨터에 git이 설치되어 있지 않을 경우 ( SourceTree가 git을 찾지 못할 경우) git 설치에 대한 4개의 선택지 존재

  • 단일 내장 Source Tree용 Git 설치

7. Mercurial이 설치되어 있지 않을 경우 Mercurial설치에 대한 4개의 선택지 존재

  • 첫 번째 선택

8. 설치 완료



10. 복제 / 생성 아이콘 클릭 후, 소스 경로에 clone받을 git 주소 입력

11. 유효한 경로일 경우, 로그인 창 팝업

12. 클론 선택 이후 본인에 맞는 브랜치를 따온 후 작업 시작.

Mac

6. 윈도우와 설치방법이 크게 다르진 않으나 git이나 mercurial의 추가 설치가 없습니다.

용어


복제 / 생성 : git 저장소를 새로 생성 및 복제를 할 수 있음

커밋 : 본인이 작업한 내용을 로컬 저장소에 반영

  • 커밋을 진행하지 않고선 풀, 푸시 및 다른 브랜치로 이동할 수 없음

스태시 : 간단하게 말해 임시 저장소. 본인이 작업하던 내용을 커밋하지 않고 스태시에 저장할 수 있음

  • 스태시에 저장하면 커밋해야 되는 (업데이트된 내용들)이 전부 임시 저장되어 사라짐

푸시 : 본인이 로컬저장소에 커밋한 내용들을 원격 저장소 (서버)에 반영

페치 : 원격 저장소에 있는 내용을 로컬 저장소로 가져오는 작업 ( 가져오기만 하고 병합은 진행 x)

병합 : 로컬 저장소에서 두 개의 코드들을 병합

브랜치 : 새로운 브랜치를 생성 및 삭제

 : 원격 저장소에 업데이트 데이터들을 내려받음

  • 만약 가져오기 위한 원격 브랜치를 본인의 브랜치가 아닌 다른 브랜치를 선택할 경우, fetch + merge가 한번에 이뤄짐

설정 : 원격저장소의 경로를 추가, 편집, 제거할 수 있음

'저장소' 카테고리의 다른 글

Jenkins - Hipchat 연동  (0) 2017.10.16
SourceTree 설치방법 및 용어  (0) 2016.07.08

bower는 트위터에서 만든 프론트앤드용 패키지 매니저 입니다. bower는 node.js로 만들어진 도구이므로 npm을 이용해서 설치하고 커맨드라인 명령어로 사용합니다. npm과 pypi와 마찬가지로 지금부터 private하게 구축하는 방법을 설명하겠습니다.

private-bower 설치


아래 명령어로 bower 이미지를 다운받습니다.

 $ docker pull tandrup/private-bower

빠른 시작

$  docker run -e ADDRESS=ip주소 -i -t -d -v /home/bower:/data -p 5678:5678 -p 6789:6789 -p 7891:7891 --name bower tandrup/private-bower


모든 데이터는 /home/bower에 저장되며 컨테이너 내의 /data 공유합니다.

5678 포트는 bower registry를 나타내고 6789는 git cache, 7891은 svn cache 포트를 나타냅니다.

private-bower에 패키지 업로드


url에 http://위에서 지정한 주소:5678로 들어가면 다음과 같은 화면을 볼 수 있습니다.


+를 눌러 url에서 패키지를 업로드할 수 있습니다.


private bower는 pypi와 다르게 서버에 직접 패키지를 관리하는 것이 아닌 저장소는 git에서 따로 관리하고 git 주소를 관리하는 툴입니다. (public bower도 동일)


여기서 private-bower 자체 문제가 있어 불안정 합니다.


package url은 http://나 git:// 또는 https://로 입력해야 다음과 같은 화면을 볼 수 있습니다.



POST를 사용해 등록을 할 수 있다고 나와 있지만 (https://github.com/Hacklone/private-bower/blob/master/README.md) POST로 url을 입력해도 url이 들어가지 않아 에러가 나며, 명령어로 실행하는 방법이 존재하지 않습니다.

'저장소 > BOWER' 카테고리의 다른 글

BOWER  (0) 2016.05.21

PYPI에 업로드할 때, 파일 또는 패키지를 어떻게 올릴지 정할 수 있습니다. 아래에서는 PYPI에 어떠한 옵션으로 올릴 수 있는지 확인하겠습니다.

SETUP의 Attribute


setup의 attribute는 다음과 같이 정의합니다.

from distutils.core import setup

setup(
    name='untitled8',
    version='0.3',
    package_dir={'':'untitled8'},
    author='lee',
    author_email='lee@lee.com',
    description='test_django_project method',
)

name

pypi 서버에 올릴 모듈 또는 패키지의 이름입니다.

version

pypi 서버에 올릴 버전입니다. 만약 이름과 버전이 이미 pypi 서버에 올라와 있는 경우, 403 (404?)에러를 뱉어줍니다.

패키지? 모듈?

사용자가 pypi 서버에 올릴 때, 모듈로 업로드할 지, 패키지로 업로드할 지 선택을 할 수 있습니다.

모듈 또는 파이썬 파일

모듈 또는 파이썬 파일만 올릴 땐 다음 attribute를 사용합니다.

from distutils.core import setup
setup(name='foo',
      version='1.0',
      py_modules=['foo']
      )

py_modules 안에 들어가는 내용은 사용자가 올릴 파이썬 파일명과 동일해야 합니다.( 여러 개 선택 가능)  

패키지

패키지는 다음과 같은 구조로 되어 있다고 가정하겠습니다.

  • untitled8
    • chartcheck
      • migrations
    • library
    • templates
    • untitled8
    • manage.py
    • test.py

패키지 추가 attribute에는 packages 와 package_dir 이 있습니다.

packages attribute는 리스트로 추가하고자 하는 앱의 이름을 적습니다. 또한 리스트에 적힌 이름의 폴더 안에 __init__.py가 있다는 가정하에 pypi 서버에 업로드 하는 것입니다.

package_dir은 딕셔너리로 좌변은 사용자가 쓰고자 하는 이름, 우변은 추가하고자 하는 앱의 이름을 적습니다. package_dir로 사용자가 쓰고자 하는 이름을 정의한 다음, packages로 앱을 추가해야 합니다.

프로젝트 내 파이썬 파일 업로드

프로젝트 아래의 파이썬 파일만 업로드하고 싶을 때 아래와 같이 사용합니다.

from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=['']
      )

위와 같이 packages 어레이 중 '' 이 있을 경우 앱이 아닌 프로젝트 안에 존재하는 파이썬 파일 전체를 pypi서버에 전송합니다. 따라서 pypi 서버에서 해당 패키지를 내려받으면 manage.py와 test.py가 있는 것을 확인할 수 있습니다.

프로젝트 내 앱 업로드

프로젝트 아래의 앱을 업로드하고 싶을 때 아래와 같이 사용합니다.

from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=['chartcheck','library']
      )

위와 같이 사용할 경우, chartcheck와 library 앱과 그 안의 파이썬 파일이 pypi 서버에 업로드됩니다. (migrations 제외)

프로젝트 내 앱 안의 서브 앱 업로드

프로젝트 내 앱 안의 서브 앱 업로드는 아래와 같이 사용합니다.

from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=['chartcheck','chartcheck.migrations']
      )

pypi에서 확인하면 chartcheck 폴더 안에 파이썬 파일과 migrations 폴더가 존재합니다.

프로젝트 내 모든 파일 한번에 업로드

프로젝트 내 모든 형식의 파일 및 폴더 업로드는 아래와 같이 사용합니다.

 from distutils.core import setup
setup(
    name='untitled8',
    version='1.993',
    packages=[''],
    package_data={'':['*']},
    author='lee',
    author_email='lee@lee.com',
    description='test_django_project method',
)

package_data는 dictonary 타입이며 좌변에는 파일 경로를, 우변에는 리스트 내에 업로드 하고자 하는 파일을 작성하면 됩니다. 위 예제의 경우, 좌변은 ''으로 root 디렉토리를 선택했으며 우변은 ' * '으로 전체 파일을 선택했습니다.

기타

여러 attribute가 존재하고 아래와 같이 사용합니다.

from distutils.core import setup

setup(name='Distutils',
      version='1.0',
      description='Python Distribution Utilities',
      author='Greg Ward',
      author_email='gward@python.net',
      url='https://www.python.org/sigs/distutils-sig/',
      packages=['distutils', 'distutils.command'],
     )

packages_data 설명



위에서 설명한 것과 같이 package_data={'':['*']}를 사용하여 프로젝트 내 전체 파일을 업로드할 수 있습니다. 

packages=['']
package_data={'':[*.py]}
#를 할 경우 프로젝트 내 전체 파일이 아닌 루트폴더에 있는 파이썬 파일만 업로드 됩니다.
 
packages=['','templates']
package_data={'':[*.py,], 'templates':[*.html]}
#일 경우, 루트 쪾에 있는 파이썬 파일과 templates폴더 안의 모든 html 파일이 업로드 됩니다.


'저장소 > PYPI' 카테고리의 다른 글

PYPI 업로드시, 옵션 선택하기  (0) 2016.05.21
PYPI  (0) 2016.05.21

PYPI는Python Packagy Index의 줄임말입니다. PYPI는 간단하게 파이썬 관련 패키지들이 모여있는 저장소라고 할 수 있습니다. 파이썬 개발자들은 자신이 개발한 파이썬 모듈들을 PYPI에 업로드할 수 있습니다. 또한 PYPI에 저장된 이 모듈들은 누구에게나 공개되어 있습니다. 여기서는 PYPI를 private하게 구축하는 방법을 설명하겠습니다.


PYPI 설치


아래명령어로 pypi 이미지를 다운받습니다.

$ docker pull codekoala/pypi

Usage

sudo mkdir -p /srv/pypi             # 패키지를 담는 디렉토리를 로컬에 생성합니다.
sudo touch /srv/pypi/.htaccess      # 패키지를 추가하기 위한 credential 파일
docker run -t -i -d \               
    -h pypi.local \                 # hostname
    -v /srv/pypi:/srv/pypi:rw \     # 볼륨을 설정해 호스트 디렉토리를 pypi 컨테이너와 공유합니다. :rw로 읽기와쓰기 설정을 해줍니다.
    -p 8080:80 \                    # expose port 80 as port 8080
    --name pypi \                   # 컨테이너 이름
    codekoala/pypi                  # 

먼저 mkdir의 옵션인 -p는 상위 디렉토리를 포함한 디렉토리를 생성할 수 있습니다. 위의 명령어처럼 -p /srv/pypi를 실행하면 /srv 디렉토리를 생성한 후, /srv 디렉토리내에 pypi 디렉토리를 생성합니다.

다음 touch는 파일의 날짜시간정보를 변경하는 명령어입니다. 아무런 옵션이 없으므로, 파일의 최근 사용시간과 최근 변경된 시간을 서버의 현재시간으로 변경하고 파일의 크기가 0인 빈 파일을 생성합니다.


위 처럼 세팅을 한 이유는 아래의 Dockerfile 내용으로 확인할 수 있습니다.

FROM codekoala/saltyarch
MAINTAINER Josh VanderLinden <codekoala@gmail.com>

RUN pacman -Sy --noconfirm --needed python-pip python-passlib && pip install -U pypiserver && mkdir -p /srv/pypi && rm -rf /var/cache/pacman/*

EXPOSE 80
VOLUME ["/srv/pypi"]

CMD ["pypi-server", "-p", "80", "-P", "/srv/pypi/.htaccess", "/srv/pypi"]


실행되었을 시, http://localhost:8080으로 접속해 pypi 서버를 확인할 수 있습니다.  .tar, .zip, .egg 등 단순하게 추가할 수 있고 /srv/pypi디렉토리에 저장이 됩니다

public pypi 패키지 및 모듈 private pypi에 업로드


pypi는 흔히 사용하는 pip에 존재하는 패키지 및 모듈들을 저장하고 있습니다. 현재까지 조사한 바로는 pypi끼리 패키지 전체를 전송하는 방법은 찾지 못했습니다. 약간의 수작업을 통해 전체 파일을 다운로드받을 수 있는 방법을 찾았습니다.

먼저 pypi에 올라와 있는 패키지는 74594개 입니다.  먼저 위와 같이 세팅이 잘 되어 있다면, /srv/pypi의 폴더는 컨테이너와 공유가 되어 있는 상태입니다.

아래의 명령어로 pypi의 패키지 목록을 받습니다.

$ wget https://pypi.python.org/simple/

그럼 index.html파일이 생성이 되고 아래와 같이 열어 확인을 하면 다음과 같은 형식으로 구성되어 있습니다.

$ vi index.html
 
<html><head><title>Simple Index</title><meta name="api-version" value="2" /></head><body>
<a href='0-.-.-.-.-.-.-.-.-.-.-.-.-0'>0-._.-._.-._.-._.-._.-._.-0</a><br/>
<a href='00smalinux'>00SMALINUX</a><br/>
<a href='02exercicio'>02exercicio</a><br/>
<a href='0805nexter'>0805nexter</a><br/>
<a href='0x10c-asm'>0x10c-asm</a><br/>
<a href='1020-nester'>1020-nester</a><br/>
<a href='115wangpan'>115wangpan</a><br/>
<a href='131228-pytest-1'>131228_pytest_1</a><br/>
<a href='1337'>1337</a><br/>
<a href='17monip'>17MonIP</a><br/>
<a href='18-e'>18-e</a><br/>
<a href='199fix'>199Fix</a><br/>
...

이러한 형식으로 75000여개의 라인을 형성하고 있습니다. 여기서 필요한 것은 href= 안에 있는 패키지 이름입니다. 이 패키지 이름으로 아래와 같이 실행하면 다음과 같은 json 파일을 볼 수 있습니다.

$ sudo wget https://pypi.python.org/pypi/roundup/json
$ vi json
{
    "info": {
        "maintainer": null,
        "docs_url": null,
        "requires_python": null,
        "maintainer_email": null,
        "cheesecake_code_kwalitee_id": null,
        "keywords": null,
        "package_url": "http://pypi.python.org/pypi/roundup",
        "author": "Ralf Schlatterbeck",
        "author_email": "rsc@runtux.com",
        "download_url": "http://pypi.python.org/pypi/roundup",


...
 "urls": [
        {
            "has_sig": true,
            "upload_time": "2016-01-11T21:38:39",
            "comment_text": "",
            "python_version": "source",
            "url": "https://pypi.python.org/packages/source/r/roundup/roundup-1.5.1.tar.gz",
            "md5_digest": "54b21d185dd490ef8697f5a046607a44",
            "downloads": 384,
            "filename": "roundup-1.5.1.tar.gz",
            "packagetype": "sdist",
            "path": "source/r/roundup/roundup-1.5.1.tar.gz",
            "size": 2618886
        }
}

이와 같은 패턴을 사용하여 php나 파이썬 등을 작성해 만들 수 있습니다.


받은 압축파일 및 whl 파일들은 해당 서버에 직접 접근하여 /srv/pypi에 올리면 pypi서버에 반영이 됩니다.

개인 프로젝트 private pypi서버에 업로드


관리자

관리자는 다음과 같이 사용자의 비밀번호와 아이디를 정의합니다.

$ htpasswd -s htaccess yourusername
 
만약 htpasswd 명령어가 설치가 안되어 있을 경우,
 
http://www.htaccesstools.com/htpasswd-generator/ 해당 url로 들어가 사용자의 아이디와 비밀번호를 입력하고 나온 결과를 복사합니다.

복사한 결과를 아래 파일을 열어 붙여 넣고 저장합니다.


$ cd /srv/pypi
$ sudo vi .htaccess
 
 
복사내용 붙여넣기

사용자

아래에서는 test_sum이라는 파이썬 파일을 private 저장소 pypi에 업로드하는 방법을 설명합니다.


배포(업로드)하고자 하는 파일이 아래와 같이 있다고 가정합니다.

def sum(a, b):
    return a + b


다음 같은 폴더 안에 setup.py 파일을 만들고 메타데이터를 작성합니다.

setup (
        name               = 'factorial', 
        version             = '1.0.0',
        py_modules      = ['factorial'], //name과 py_modules 는 동일한 이름이여야 합니다.
        author              = 'ksw',
        author_email     = 'ksw@ksw.com',
        description        = 'factorial method',
    )


윈도우와 리눅스는 파일 설정 및 지정이 다르기 때문에 나눠서 설명하겠습니다.

윈도우

메모장을 열어 아래의 코드를 붙여넣습니다.

[distutils]
index-servers =
    pypi
    internal

[pypi]
username:pypiusername
password:pypipassword

[internal]
repository: http://10.101.30.124:8080 // private 저장소 url을 적습니다.
username:duzon // 관리자가 할당해준 아이디를 적습니다.
password:duzon // 관리자가 할당해준 비밀번호를 적습니다.

.pypirc로 저장하고 C:\Users\(로그인된 사용자 아이디) 에 저장합니다. 

예) C:\Users\ljh 에 저장

리눅스

아래와 같이 이동한 다음 .pypirc 파일을 작성 후 저장합니다.

$ cd ~/
# sudo vi .pypirc
 
 [distutils]
index-servers =
    pypi
    internal

[pypi]
username:pypiusername
password:pypipassword

[internal]
repository: http://10.101.30.124:8080 // private 저장소 url을 적습니다.
username:duzon // 관리자가 할당해준 아이디를 적습니다.
password:duzon // 관리자가 할당해준 비밀번호를 적습니다.



위와 같이 저장한 다음 아래의 명령어로 pypi 서버에 파일을 배포(업로드)합니다.

업로드할 시, 위에서 만들었던 setup.py 파일이 있는 경로에서 실행해야 합니다.

$ python setup.py sdist register -r internal upload -r internal

위의 방식은 .tar로 생성하여 올리기 때문에 python3에서만 사용이 가능합니다. python 2나 3 두 버전에서 사용가능한 wheel 타입으로 같이 올리는 방법이 가장 좋습니다.

PIP Config 설정

Mac

터미널에 접근해주세요.


$ mkdir $HOME/.pip
$ vi $HOME/.pip/pip.conf


[install]
index-url=http://172.16.114.36/simple
trusted-host=172.16.114.36 


Window

%HOME%\pip\pip.ini

위의 경로에 파일을 생성해주세요. 그리고 아래의 내용을 채워주시기 바랍니다.


[install]
index-url=http://172.16.114.36/simple
trusted-host=172.16.114.36 

wheel 타입 압축 후 업로드

wheel 타입으로 압축을 하기 위해선 먼저 wheel 모듈이 필요합니다. 

$ pip3 install wheel

또한 pip와 setuptools의 버전이 최신이어야 합니다. 


해당 프로젝트 내에 setup.cfg 파일을 생성합니다.( setup.py 파일의 동일한 위치에 생성하면 됩니다.)

[bdist_wheel]
universal = 1

setup.cfg 파일을 생성한 다음, 위의 코드를 넣어줍니다.


마지막으로 PYPI 업로드시, 옵션 선택하기 에서 사용하는 라이브러리는 from distutils.core import setup 입니다. 해당 라이브러리를 사용하면 에러가 나므로 from setuptools import setup 를 대신 사용해 줍니다.

위의 과정을 거친 후 명령어를 입력하여 .tar 와 .whl 압축파일을 업로드합니다.

$ python setup.py sdist bdist_wheel register -r internal upload -r internal


업로드 시 setup의 attribute는 PYPI 업로드시, 옵션 선택하기 에서 확인할 수 있습니다. ( wheel로 압축해야될 경우,  from distutils.core import setup 이부분을 from setuptools import setup 같이 변경하여 줍니다.)

private pypi에 올라온 패키지 다른 서버에서 설치 받기


아래와 같이 명령어를 사용하여 쉽게 install 및 download를 받을 수 있습니다. (이를 사용하기 위해 pip 및 easy_install 설치가 필요합니다.)


pip 사용하여 다운로드 받을 때

$  pip download --trusted-host ip주소 --index-url pypi 주소/simple/ 패키지명
 
-- 예시
$  pip install --trusted-host 10.101.30.124 --index-url http://10.101.30.124:8080/simple/ imi


easy_install 사용하여 다운로드 받을 때

 $ easy_install -i pypi 주소/simple 패키지명
 
--예시
$ easy_install -i http://10.101.30.124:8080/simple imi

Adding Third Party Packages


아래의 명령어를 사용하여 해당 패키지를 미러링할 수 있습니다.

$ pip install -d /srv/pypi 패키지명

미러링된 패키지 업데이트하기


아래 명령어를 실행시켜 미러링된 패키지에 대해 업데이트를 할 수 있습니다.

$ pypi-server -U /srv/pypi

레파지토리에 있는 각 패키지들은 업데이트를 확인하고 업데이트 합니다. 

'저장소 > PYPI' 카테고리의 다른 글

PYPI 업로드시, 옵션 선택하기  (0) 2016.05.21
PYPI  (0) 2016.05.21

NPM은 Node Packaged Modules의 줄임말입니다. 단어 그대로 Node.js에서 사용하는 모듈을 패키지로 모아 놓은 곳입니다. 사용자가 사용하고자 하는 패키지들을 다운받을 수 있습니다. 여기서는 공통으로 사용하는 npm이 아닌 private하게 npm을 구축하는 것을 설명하겠습니다.

NPM 설치


docker에 NPM 이미지를 아래의 명령어를 실행시켜 다운 받습니다.

$ docker pull rnbwd/sinopia

빠른 시작

아래의 명령어로 이미지를 실행시킵니다.

$ docker run --name sinopia -d -p 4873:4873 rnbwd/sinopia

sinopia는 기본적으로 4873 포트를 사용하고 docker를 실행 시, http://vm주소:4873으로 실행화면을 확인 할 수 있습니다.

스토리지 및 캐시 마운트

$ docker run --name sinopia -d -p 4873:4873 -v <local-path-to-storage>:/sinopia/storage rnbwd/sinopia

컨테이너가 정상적으로 실행되었을 시, cache 폴더와 storage 폴더가 생성된 것을 볼 수 있습니다.

cache폴더에는 public npm으로 받은 패키지의 모든 버전 정보 json 파일과 가장 최신 버전 패키지 압축 파일이 존재합니다. ( 만약 public npm에서 패키지를 install 한 후, 해당 패키지를 publish하려 하면 에러가 나면서 cache 폴더에 해당 패키지가 추가됩니다.)

storage폴더는 private 실행 시 npm debug 로그들이 쌓이게 됩니다.

config.yaml 파일 마운트

$ docker run -v <local-path-to-config>:/sinopia/config.yaml -d -p 4873:4873 rnbwd/sinopia

private npm을 사용하기 위해서는 config.yaml을 수정할 필요가 있습니다. docker container에서는 편집기가 실행되지 않으므로 config.yaml 파일을 마운트해 호스트 os에서 편집을 하던지, 스토리지를 마운트해 config 파일을 스토리지로 복사 -> 편집 -> 원 위치로 덮어쓰기 와 같은 형식으로 수정해야합니다.

현재 virtual box - coreos (835.13.0) - docker (1.8.3) 에서 위와 같이 config.yaml을 마운트 하려하면 [8] System error: not a directory 같이 에러가 나옵니다. (원인 파악중)

config.yaml

config.yaml은 sinopia를 처음 실행하는데 참조하는 파일입니다. 

 # path to a directory with all packages storage: ./storage/cache web: # enable: true title: Private NPM # logo: logo.png # template: custom.hbs auth: htpasswd: file: ./storage/htpasswd # Maximum amount of users allowed to register, defaults to "+inf". # You can set this to -1 to disable registration. #max_users: 1000 # a list of other known repositories we can talk to uplinks: npmjs: url: https://registry.npmjs.org/ # amount of time to wait for repository to respond # before giving up and use the local cached copy #timeout: 30s # maximum time in which data is considered up to date # # default is 2 minutes, so server won't request the same data from # uplink if a similar request was made less than 2 minutes ago #maxage: 2m # if two subsequent requests fail, no further requests will be sent to # this uplink for five minutes #max_fails: 2 #fail_timeout: 5m # timeouts are defined in the same way as nginx, see: # http://wiki.nginx.org/ConfigNotation packages: # uncomment this for packages with "local-" prefix to be available # for admin only, it's a recommended way of handling private packages 'local-*': allow_access: admin allow_publish: admin # # you can override storage directory for a group of packages this way: storage: 'local_storage' '@*/*': # scoped packages allow_access: $all allow_publish: $all '*': # allow all users (including non-authenticated users) to read and # publish all packages # # you can specify usernames/groupnames (depending on your auth plugin) # and three keywords: "$all", "$anonymous", "$authenticated" allow_access: $all # allow all known users to publish packages # (anyone can register by default, remember?) allow_publish: $all # if package is not available locally, proxy requests to 'npmjs' registry proxy: npmjs ##################################################################### # Advanced settings ##################################################################### # if you use nginx with custom path, use this to override links #url_prefix: https://foo.com # you can specify listen address (or simply a port) listen: 0.0.0.0:4873 # type: file | stdout | stderr # level: trace | debug | info | http (default) | warn | error | fatal # # parameters for file: name is filename # {type: 'file', path: 'sinopia.log', level: 'debug'}, # # parameters for stdout and stderr: format: json | pretty # {type: 'stdout', format: 'pretty', level: 'debug'}, logs: - {type: stdout, format: pretty, level: http} #- {type: file, path: sinopia.log, level: info} # you can specify proxy used with all requests in wget-like manner here # (or set up ENV variables with the same name) #http_proxy: http://something.local/ #no_proxy: localhost,127.0.0.1 # maximum size of uploaded json document # increase it if you have "request entity too large" errors # max_body_size: 500mb # Workaround for countless npm bugs. Must have for npm <1.14.x, but expect # it to be turned off in future versions. If `true`, latest tag is ignored, # and the highest semver is placed instead. #ignore_latest_tag: false

여기서 가장 중요한 것은 packages 부분입니다.

'local-*' 은 sinopia에 배포할 패키지의 이름 맨 처음에 local- 이 들어간 것을 뜻합니다.

storage : loca_storage는 local-* 패키지명이 들어오면 local_storage폴더에 패키지압축 파일 및 정보를 담고 있는 json 파일을 저장하게 됩니다.


패키지 내의 proxy: npmjs는 만일 private npm 서버에 원하는 패키지가 없을 시, npmjs에 지정한 주소로 다이렉팅 됩니다. 위에서 npmjs를 public npm 주소로 등록이 되어있습니다.


패키지 업로드(배포)


배포에 앞서 다음과 같이 설정을 해줍니다.

$ docker exec -it sinopia /bin/bash   $ npm set registry http://설정주소:4873 ### 예 http://IP주소:4873

다음 유저를 추가해 줍니다.

$ npm adduser --registry http://IP주소:4873 User: admin Password: admin Email: (this IS public): 이메일.com


등록한 계정으로 npm 로그인을 해줍니다.

$ npm login
User: admin
Password: admin
Email: (this IS public): 이메일.com

현재 확인해 본 결과, 가입을 하지 않고 바로 로그인으로 아이디를 생성할 수 있습니다.


여기서는 public npm에서 foo라는 패키지를 받고, 해당 패키지명을 변경한 후 private npm에 올리는 것으로 가정하겠습니다.

다음 업로드(배포)할 패키지의 package.json 파일을 수정합니다. (컨테이너 내의 sinopia/node_modules/foo)

 { "author": { "name": "AJ ONeal", "email": "coolaj86@gmail.com", "url": "http://coolaj86.info" }, "name": "local-foo", "description": "A test module with no `main`, `lib`, or `dependencies` specified", "version": "1.0.0", "repository": { "type": "git", "url": "git://github.com/coolaj86/node-pakman.git" }, "engines": { "node": ">= v0.2" }, "_npmUser": { "name": "coolaj86", "email": "coolaj86@gmail.com" }, "_id": "foo@1.0.0", "dependencies": {}, "devDependencies": {}, "_engineSupported": true, "_npmVersion": "1.0.101", "_nodeVersion": "v0.4.8", "_defaultsLoaded": true, "dist": { "shasum": "943e0ec03df00ebeb6273a5b94b916ba54b47581", "tarball": "http://registry.npmjs.org/foo/-/foo-1.0.0.tgz" }, ## 해당부분추가 "publishConfig": { "registry": "http://IP주소:4873/" },  ##해당 부분 추가 "maintainers": [ { "name": "coolaj86", "email": "coolaj86@gmail.com" } ], "directories": {}, "_shasum": "943e0ec03df00ebeb6273a5b94b916ba54b47581", "_resolved": "https://registry.npmjs.org/foo/-/foo-1.0.0.tgz", "_from": "foo@*" }

public npm에서 받았기 때문에 foo라는 패키지 이름 그대로 publish 할 시, 에러가 나면서 cache에 저장이 됩니다. (이미 public 으로 받았기 때문)

따라서 local-foo라고 이름을 변경을 합니다. 또한 publish에 필요한 설정을 

"publishConfig": {
"registry": "http://private npm 설정주소:4873/"
},

를 추가해 줍니다.


컨테이너에서 파일 경로를 아래와 같이 이동한 다음, publish를 실행합니다.

$ cd /sinopia/node_modules/foo
$npm publish

publish는 해당 패키지의 package.json을 읽고 실행하기 때문에 package.json 파일이 있는 폴더로 이동해서 진행합니다.

만약 똑같은 이름으로 이미 private npm 서버에 올라가 있거나, public npm으로 받은 패키지의 이름을 변경하지 않고 바로 올렸을 경우 다음과 같은 에러가 나옵니다.

npm ERR! Linux 4.2.2-coreos-r2
npm ERR! argv "node" "/usr/local/bin/npm" "publish"
npm ERR! node v0.10.40
npm ERR! npm  v2.14.5
npm ERR! code EPUBLISHCONFLICT
npm ERR! publish fail Cannot publish over existing version.
npm ERR! publish fail Update the 'version' field in package.json and try again.
npm ERR! publish fail
npm ERR! publish fail To automatically increment version numbers, see:
npm ERR! publish fail     npm help version
npm ERR! Please include the following file with any support request:
npm ERR!     /sinopia/node_modules/foo/npm-debug.log

해당 에러가 나지 않았을 시, http:// private npm 주소:4873 서버에서 확인할 수 있습니다.

외부에서 private NPM 패키지 다운로드


다음과 같은 방식으로 다운로드를 받을 수 있습니다.

$ npm install 패키지명 --registry private npm 주소 예시 $ npm install local-foo --registry http://ip주소:4873   또는 $ npm set registry private npm 주소 $ npm install 패키지명 예시 $ npm set registry http://ip주소:4873 $ npm get registry http://ip주소:4873/ # npm 패키지 다운로드 받고자 하는 주소 변경 $ npm install local-foo

다른 사용자가 받고자 하는 패키지가 private npm 서버에 있을 경우, private npm 서버에서 내려받습니다.

만약 없을 시에는 private npm 서버의 config.yaml에 정해 놓은 것 처럼 public npm서버에 연결이 되어 내려받게 됩니다.

  • 사용자가 원하는 패키지 -> private npm 서버에 없음 -> public npm 서버에서 내려받음 -> private npm 서버 캐시에 저장 -> 사용자 서버에서 다운로드

sinopia github 저장소


sinopia에 대한 더 많은 정보는 아래 주소에서 확인할 수 있습니다.

docker 이미지 설명: https://hub.docker.com/r/rnbwd/sinopia/

sinopia 패키지 설명: https://github.com/RnbWd/sinopia

'저장소 > NPM' 카테고리의 다른 글

NPM  (0) 2016.05.21

+ Recent posts