4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PrivateなPythonパッケージがあるけどGitHub Actions上でpipenvインストールしてDocker Imageをビルドしたい

Posted at

はじめに

GitHub上のプライベートレポジトリにあるPythonパッケージを使っているPythonプロジェクトにて、GitHub Actions上でDocker Imageをビルドするまでの知見を共有。

バージョン・環境

  • Docker Image: python:3.8.2-slim

やり方

Pipfile.lockを確認

pipenvを利用します。

Pipfile.lockは下記のようにプライベートレポジトリをインストールする設定であることを確認します。

Pipfile.lockの一部
        "private-repository-package": {
            "editable": true,
            "git": "https://github.com/username/private-repository-package.git",
            "ref": "812u4dd76db6298ce50b5569a9a1d80759ba6e80"
        },

今回はnetrcを利用してインストールするので、httpsでインストールします。
ref=コミットハッシュとすることで、指定したいバージョンをインストールすることができます。

まだインストールしていない場合は、pipenv install private-repository-package のようにローカルでインストールし、refを修正して再度pipenv installすると更新されます。

詳細は公式ドキュメントを見ると良いでしょう。pipenv公式ドキュメント

Dockerfile

Dockerfileの内容です。

イメージには-slimなものを利用しています。-slimでないイメージと比較すると1/3ほどイメージの容量を小さくすることができます。

Dockerfile
FROM python:3.8.2-slim

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    ca-certificates \
    git \
    && apt-get clean && \
    rm -rf /var/lib/apt/lists/*

ENV WORKDIR /app/
WORKDIR ${WORKDIR}
COPY Pipfile Pipfile.lock ${WORKDIR}

# setup .netrc to install dependencies in private GitHub repository
ARG PRIVATE_REPO_ACCESS_KEY
RUN echo "machine github.com" > /root/.netrc && \
    echo "login $PRIVATE_REPO_ACCESS_KEY" >> /root/.netrc && \
    echo "passowrd x-oauth-basic" >> /root/.netrc && \
    chmod 600 /root/.netrc

# install Python dependencies
RUN pip install pipenv --no-cache-dir && \
    pipenv install --system --deploy && \
    pip uninstall -y pipenv virtualenv-clone virtualenv

# remove anythings security and uncessary
RUN rm /root/.netrc && \
    rm Pipfile Pipfile.lock

COPY src/ $WORKDIR

CMD python ./run.py

ポイントはnetrcを利用している点です。PRIVATE_REPO_ACCESS_KEYという引数を外(今回はGitHub Actions)から受け取り、それを/root/.netrcファイルへ渡して、GitHub上のプライベートレポジトリへhttpsアクセスできるようにしています。

そして、この.netrcファイルを利用し、pipenv installが完了したその後、

# remove anythings security and uncessary
RUN rm /root/.netrc && \
    rm Pipfile Pipfile.lock

この処理を入れることで、Docker ImageにはPRIVATE_REPO_ACCESS_KEYの値を消去し残さないようにします。

GitHub Actions

GitHubパーソナルトークンを取得しSecretに設定

GitHub上でプライベートレポジトリへアクセスするためのパーソナルトークンを取得します。
やり方はこちらの公式ドキュメントがわかりやすいです。

そして得られたパーソナルトークンを対象のGitHubレポジトリのSettingからSecretに登録します。
このやり方も他記事に図付きで乗ってあります。公式ドキュメントはこちらです。

GitHub Actions Yaml

上記で設定したパーソナルトークンをシークレットから取得しそれを先程のDockerfileでのPRIVATE_REPO_ACCESS_KEYとしてdockerコマンドに渡してImageビルド処理をします。

GitHubActionsワークフローYamlの一部
      env:
        PRIVATE_REPO_ACCESS_KEY: ${{ secrets.PRIVATE_REPO_ACCESS_KEY }}
      run: |
        docker build --build-arg PRIVATE_REPO_ACCESS_KEY=${PRIVATE_REPO_ACCESS_KEY} .

参考

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?