0
0

More than 3 years have passed since last update.

PythonのプロジェクトをTeamcityで自動テストする

Posted at

目的

Pythonの自動テスト環境を構築する。

環境

  • TeamCity Professional 2019.2.2 (build 71923)
    • dockerコンテナubuntuバージョン
  • Python 3.7.6
  • Poetry 1.0.5

概要

以下の条件であればTeamcityでなくても問題はない。
TeamcityのビルドエージェントはDockerコンテナで環境がわけられていい。

  • Pythonの実行環境がある
  • 単体テストの全実行ができる
  • フォーマッタを全ソースに自動適用できる
  • 静的コード解析を全ソースに自動適用できる

Pythonの実行環境

Python用ビルドエージェントコンテナ

MinimalのエージェントコンテナをベースにPythonの環境を構築していく。
pyenvを使うとコードが短くなるしanacondaなど実装系とも共通化できるので利用した。

Dockerfile
FROM jetbrains/teamcity-minimal-agent:latest

LABEL maintainer="YAMAGAMI Satoshi"

# python preparation start

ENV HOME /root
ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/bin:$PYENV_ROOT/shims:$HOME/.local/bin:$PATH
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update -y && \
    apt upgrade -y 

RUN apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git


# RUN curl https://pyenv.run | bash
RUN git clone https://github.com/yyuu/pyenv.git $HOME/.pyenv

#python $VERSIONをインストールしglobalでデフォルトのバージョンにセットする
ARG VERSION="3.7.6"
RUN pyenv install ${VERSION} && \
    pyenv global ${VERSION} && \
    pyenv rehash &&\
    eval "$(pyenv init -)" 

RUN pip install --upgrade pip 


# python preparation end
##################################
docker-compose.yml(抜粋)
version: '3'

services:
  ci-agent-python:
    build: ./ci/ci-agent/python
    environment: 
      - SERVER_URL=ci:8111
      - AGENT_NAME=python
    ports:
      - 9092:9090
    volumes:
      - ./ci/agent-python/conf:/data/teamcity_agent/conf

依存関係のインストール

poetryを使っているので以下のようになる。
こういうコマンドはちゃちくてもコードとしてGitで管理したほうがいい。

コンテナではpipまで入っているのでpoetryのインストールから。

scripts/install.sh
#!/usr/bin/env bash

pip install --user poetry
poetry --version
poetry config virtualenvs.in-project true --local
poetry install --no-root

単体テストの全実行

合わせてカバレッジも取得する。
poetry shellコマンドだとactivateしてスクリプトが終わってしまうため手動で$PATHに追加

scripts/test.sh
#!/usr/bin/env bash

export PATH=`poetry env info --path`/bin:$PATH
`which python` -m pytest --cov=sample_tdd --cov-report=html --html=reports/test/results.html --self-contained-html

フォーマッタを全ソースに自動適用

使用しているフォーマッタ(autopep8)がファイル単位なのでfindを使って対応。
.venvをプロジェクト配下にしているので除外。

scripts/format.sh
#!/usr/bin/env bash

export PATH=`poetry env info --path`/bin:$PATH
find . -type d -name .venv -prune -o -type f -name "*.py" -exec `which python` -m autopep8 --in-place {} \;

静的コード解析を全ソースに自動適用

特になんの変哲もない。

scripts/inspect_code.sh
#!/usr/bin/env bash

export PATH=`poetry env info --path`/bin:$PATH
`which python` -m flake8

自動化

プロジェクトを作成してソースのVCSを設定したらビルドステップを設定する。
シェルスクリプトがあると自動で候補にあげてくれるので、必要なものにチェックする。
順番を並び替えたら実行する。
テストレポートを見るために、成果物(Artifacts)を指定している。

image.png

image.png

パイプライン化するにはテスト結果やコード解析の結果を見てDockerコンテナのデプロイに繋いでいくのだけれど、今回はテスト自動化ということでここまで。

最初.venvをプロジェクト配下にしない構成でやっていたのでコードフォーマットと静的コード解析が16mくらい起きてました。
みんなも気をつけようね!

いじょ。

CI、python関連で以下を書いてますので興味があれば。
Python開発環境
DockerコンテナのTeamCityを使ってみた
TeamCityビルドエージェントコンテナにJDKを追加する

0
0
0

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
0
0