みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

GitLab private repositoryにある自作Pythonパッケージをpipでインストールする

自分で作成したPythonパッケージをGitLab上のプロジェクトで管理していて,これを別のプロジェクトで使用する方法を紹介します.

環境

  • MacOS 10.14.6
  • Python 3.8
  • GitLab

前提条件

  • trieという名前のプロジェクトが,private repositoryとしてGitLabに存在する.
  • 別のプロジェクトでtrieをpipでインストールできるようにしたい.

なお,trieはトライ木に関する架空のプロジェクトです.

trieをPythonパッケージにする

Pythonパッケージを作成するには,Setuptoolsを使用するのが便利です.

ディレクトリ構成は以下のようにします.

  • trie/
    • trie.py (メインとなる部分)
  • tests/
    • test_trie.py (trie.pyのunittest)
  • setup.cfg
  • setup.py

Setuptoolsのためのファイルを作成します.

setup.cfg

[metadata]
name = trie
version = 1.0.0
url = https://gitlab.com/[user]/trie.git
author = [user]
author_email = [user address]
license = UNLICENSED
description = MyTrie

[options]
packages = 
  trie

setup.cfgの詳細については,Building and Distributing Packages with Setuptools — setuptools 45.2.0 documentationを参照してください.

packagesに指定したディレクトリのみがpipで使用されます.testsフォルダは別のプロジェクトには不要なので,trieディレクトリのみ指定しています.

setup.py

from setuptools import setup
setup()

これで自動的にsetup.cfgが読み込まれます.

より一般的なディレクトリ構成については,requestsなど有名なプロジェクトを参考にするのがよいと思います.

GitLabにpushする

上記の如くPythonパッケージを仕上げたら,GitLabにpushし,masterブランチにmergeします.

pipでインストールする

pipはrequirements.txtに記載したパッケージをインストールしてくれます.通常ぱパッケージ名とバージョンを記載しますが,gitのurlを直接指定することも可能です.例えば以下のようにrequirements.txtファイルを作成します.

requirements.txt

requests==2.22.0
git+ssh://git@gitlab.com/[user]/trie.git

あとは,下記のコマンドでpipを使用します.

sudo pip3 install -r requirements.txt

これで,公開されているrequestsパッケージと非公開のtrieパッケージがインストールされます.もし,すでにインストールしているパッケージをアップデートしたい場合は, --upgrade オプションを付けます.

sudo pip3 install -r requirements.txt --upgrade

もし,gitのurlが間違っていると,下記のようなエラーが出ます.

ssh: Could not resolve hostname gitlab.com:[user]: nodename nor servname provided, or not known
fatal: Could not read from remote repository.

GitLabからurlをコピーすると,gitlab.comの直後の"/"が":"になっているので注意が必要です.

trieを試してみる

from trie.trie import Trie
print(Trie())
from requests import Session
print(Session())
<trie.trie.Trie object at 0x10b52d810>
<requests.sessions.Session object at 0x102b97650>

公開されているrequestsパッケージと非公開のtrieパッケージが正常にインポートできました.

site-packagesを確認する

pipを利用してインストールしたファイルは,pythonのsite-packagesディレクトリに保存されます.MacOSならば,

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages

などとなります.

なお,上記のtrieパッケージをインストールすると,パッケージルート直下のtrie/が上記ディレクトリに保存されますので,当たり前ですが,パッケージを使用する際に必要なファイルはtrie/に保存するべきで,setup.pyなどと同じレベルに保存するのは意味がありません.

GitLab CIで使用する

開発環境ではssh keyが設定されているおかげで,自分のprivate repositoryにpipが自動でログインしてくれるため,追加の認証でパッケージをダウンロードすることができます.しかしながら,GitLab CIにはssh keyが事前に設定されているわけではないので,工夫が必要です.

GitLab CI artifactを利用する

Personal access tokens | GitLabを参考に設定しますが,ユーザー毎にpersonal access tokenというキーを発行することができ,これを利用することによって,privateなプロジェクトのartifactを別のプロジェクトで利用することができます.これはGitLab Job APIを利用するので,これに対する権限を有効にしておく必要があります.

また,projectのidとして,url encodedな文字列を指定する必要があることに注意します.詳細はAPI Docs | GitLabに記載されています./%2Fに置き換える必要があるので,注意が必要です.