継続的インテグレーション(CI)について調べてみた

はじめに

この記事では、「継続的インテグレーション(CI)の概要」について書いています。

DevOps勉強の中の一つとして継続的インテグレーションについて調べ記事に書いてみました。

自分に向けた備忘録でもありますが、「継続的インテグレーション(CI)とは何か知りたい」な人の一助になれば嬉しいです。

継続的インテグレーションとは何か

  • CI(Continuous Integration)を日本語にしたもの
    • 継続的 = 中断することなく、ずっと続く
      • 断続的( = 途切れ途切れでことが進む)の対義語
    • インテグレーション = 統一する(コードをマージする)
  • 開発者がコードの変更を頻繁にメインラインへマージする開発手法
    • メインライン = メインブランチ、トランク。ブランチの作成元のこと。
    • 頻度は一日数回が一般的
  • 継続的インテグレーションという言葉は2つの側面で使われる
    • オートメーションの側面(CI やビルドサービスなど)
    • 啓発の側面 (頻繁に統合する必要性を学習することなど)
  • 継続的インテグレーションの目的
    • バグを早期に発見して対処すること
    • ソフトウェアの品質を高めること
    • ソフトウェアの更新を検証してリリースするためにかかる時間を短縮すること
  • 継続的インテグレーションが必要な理由
    • 以前の開発方式の問題点を解消したい
      • 以前の開発方式
        • チームに所属する開発者が長期間にわたって独立して作業する。
        • 作業が完了した後初めて変更点をマスターブランチにマージする。
      • 以前の開発方式だとコードの変更をマージする作業が困難で時間がかかる
        • 長期間独立して作業 = 変更点が多く、その分競合や失敗の可能性が高い
      • バグが修正されないまま長期間にわたって累積する
        • 変更点が多い中でバグの原因特定は時間がかかる
      • これらが積もり積もって更新のリリースが遅れる原因になる
        • 開発のための作業時間が競合の解決などマージのための作業時間をはるかに超えることにもなる
  • 継続的インテグレーションの仕組み
  • 継続的インテグレーションのメリット
    • バグを短時間で発見、対処できるようになり、プロジェクトとして時間とコストの両方を節約できる。
    • 更新を迅速に配信できるようになり、リリース直前での土壇場の混乱を避けることができる。
    • 開発者が競合の解決などに時間を取られなくなるため生産性が向上する

おわりに

継続的インテグレーション(CI)の概要」について解説しました。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

https://aws.amazon.com/jp/devops/continuous-integration/

https://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

https://tracpath.com/works/devops/continuous-integration/

MKDocsでURLを書いたら自動でハイパーリンクさせてみる

はじめに

この記事では、「MKDocsでURLを書いたら自動でハイパーリンクさせる方法」について書いています。

MKDocsでドキュメントを書くことが最近多いのですが、その使い方を色々調べる中で「知ってたら便利そう」な小ネタを知ったのが記事を書いたきっかけでした。

自分に向けた備忘録でもありますが、「MKDocsでURLを書いたら自動でハイパーリンクさせたい」な人の一助になれば嬉しいです。

要点だけ

ymlファイルに以下を追加する

markdown_extensions:
 - pymdownx.magiclink

実際に試してみる

まずは、特に気にせず以下のようにymlファイルを書いた際、URLがどう表示されるかを見てみます。

site_name: My Docs

theme:
  name: 'mkdocs'

画像の「Test」の項を見てください。

URLの文字列が表示されただけでハイパーリンクはされてなく、そこをクリックしてもURL先にアクセスするようなことはありません。

では次はymlファイルに記述を追加してハイパーリンクされるようにしてみましょう

site_name: My Docs

theme:
  name: 'mkdocs'

markdown_extensions:
 - pymdownx.magiclink

追加したのは下の2行です。この記述をすることでURLの文字列を自動でハイパーリンクしてくれるようになります。

実際にビルドし表示させた結果は下の画像です。

先程はハイパーリンクされてませんでしたが、記述追加後はちゃんとハイパーリンクされていることが分かるかと思います。

おわりに

「MKDocsでURLを書いたら自動でハイパーリンクさせる方法」について解説しました。

ちょっとした小ネタですが、知っておくと便利かもしれません。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

kuttsun.blogspot.com

github.com

GitHub ActionsでPythonの3.10を使う方法

はじめに

この記事では、「GitHub ActionでPythonの3.10を使う方法」について書いています。

GitHub ActionでPythonを利用としたとき、3.10を使おうとして少しハマったのが記事を書いたきっかけでした。

自分に向けた備忘録でもありますが、「GitHub ActionでPythonの3.10を使いけどエラーが出て使えない」な人の一助になれば嬉しいです。

本文

簡単な内容のもので挙動を確認していきます。

name: try python 3.10

on:
  workflow_dispatch:

jobs:
  display_python_version:
  
    runs-on: ubuntu-latest

    steps:
      - name: Setup Python
        uses: actions/setup-python@v3
        with:
          python-version: 3.10

      - name: Display Python version
        run: python -c "import sys; print(sys.version)"

Pythonの3.10をインストールしてバージョンを出力するというものです。

しかし、このコードは期待したようには動作してくれません。下の画像のようなエラーになります。

Annotationsに書いてある内容を見てみましょう

Version 3.1 with arch x64 not found
The list of all available versions can be found here: https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json

なぜか3.1を使おうとしてることになってますね(ちゃんと3.10を指定しているのに)

これどうもYAML方で3.10を数値として認識してしまうため、勝手に最後の0が消されてしまうようです。

これを回避するためには3.10を" ' "で囲み

          python-version: '3.10'

と指定してください。この変更を加えることでエラーにならず所望の動作をしてくれるようになります。

おわりに

GitHub ActionでPythonの3.10を使う方法」について解説しました。

ここまで読んで下さりありがとうございます。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

github.com

Rustのrstestでパラメータテストをしてみる

はじめに

この記事では、「Rustのrstestを使ったパラメータテストの仕方」について書いています。\

自分に向けた備忘録でもありますが、「Rustでパラメータテストがしたい」「rstestを使ってみたい」な人の一助になれば嬉しいです。

rstestとは何か

rstestとは、フィクスチャベースのテストフレームワークで、フィクスチャとテーブルベースのテストが書けるようになるものです。

フィクスチャとは、テストを実行するのに必要な条件のことで、テーブルベースのテストの入力と期待値をテーブル形式で記述し、そのテーブルを走査しながら実行するようなテストのことです。

rstestでパラメータテストの行い方

Note

試した際の環境は以下の通りです。

Rustのプロジェクトをcarog new --lib rstest_sampleのコマンドを実行して作ります。

その後、まずはCargo.tomlに依存関係を加えます。[dependencies]の項目に以下を追加してください。 rstest = "0.15.0"

続いてlib.rsのコードにrstestでパラメータテストの簡単なサンプルを実行できるコードを書いていきます。

下のようにlib.rsの内容を書き換えてください

use rstest::rstest;

fn add_two(num: u32) -> u32 {
    num + 2
}

#[rstest(input, expected,
    case(0, 2),
    case(1, 3),
    case(2, 3),  # わざと失敗させている
    case(3, 5),
)]

fn test_add_two(input: u32, expected: u32) {
    assert_eq!(expected, add_two(input));
}

ポイントは以下の通りです。

  • #[rstestから続く部分でテストに使用するパラメータを記述します
  • テスト関数(ここではtest_add_two)の引数に、上で記述したパラメータを指定します。

ではlib.rsを書き換えたらcargo testを実行してみましょう

下のような出力が得られます。

running 4 tests
test test_add_two::case_1 ... ok
test test_add_two::case_2 ... ok
test test_add_two::case_4 ... ok
test test_add_two::case_3 ... FAILED

failures:

---- test_add_two::case_3 stdout ----
-------------- TEST START --------------
thread 'test_add_two::case_3' panicked at 'assertion failed: `(left == right)`
  left: `3`,
 right: `4`', src\lib.rs:14:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    test_add_two::case_3

test result: FAILED. 3 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

4つのcase(パラメータ)についてテストがされ、わざと失敗させるよう書いたcaseについてはちゃんと失敗されました。

おわりに

「Rustのrstestを使ったパラメータテストの仕方」について解説しました。

私個人の感覚としてはpytestのように書けて中々良さそうだなと感じました。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

https://caddi.tech/archives/1849

https://crates.io/crates/rstest

GitHub ActionsでPythonのpytestを自動実行&表示させてみた

はじめに

この記事では、「GitHub ActionsでPythonのpytestを自動実行&表示させる方法」について書いています。

GitHub Actionsでは様々なことが自動化でき、テストも自動化できますが、その結果も見やすい形で表示されてくれないかなと思ったのが記事を書いたきっかけでした。

自分に向けた備忘録でもありますが、「GitHub ActionsでPythonのpytestの結果をGitHub上で表示させたい」な人の一助になれば嬉しいです。

やり方

早速、pytestの実行と表示を行うコードです

name: Run and display pytest

on:
  workflow_dispatch:

jobs:
  pytest:
  
    runs-on: ubuntu-latest

    steps:
      # リポジトリをチェックアウト
      - name: Checkout code
        uses: actions/checkout@v3

      # Pythonの環境をセットアップ
      - name: Setup Python
        uses: actions/setup-python@v3
        with:
          python-version: 3.11

      # pytestをインストール
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install pytest

      # JUnit形式でpytestの結果を出力
      - name: Run pytest
        run: |
          python -m pytest --junit-xml results/pytest.xml
        continue-on-error: true

      # テスト結果をアップロードする
      - name: Upload results
        uses: actions/upload-artifact@v3
        with:
          name: test_results
          path: results/*.xml

      # テスト結果をダウンロードする
      - name: Download results
        uses: actions/download-artifact@v3
        with:
          name: test_results
          path: artifacts

      # テスト結果をGitHub上で表示する
      - name: display results
        uses: EnricoMi/publish-unit-test-result-action@v1
        with:
          files: artifacts/**/*.xml

上のコードは、手動トリガでpytestを実行、その結果をGitHub上で表示してくれます。

表示のされ方は以下の画像のような感じで、下の部分に「pytest summary」とあり、この部分にpytestの結果が表示されます。

Note

画像の中央付近(この間省略、の部分)は、今回の話とは関係ない余計な部分があったため、画像処理で切り取って見やすくしています。

おわりに

GitHub ActionsでPythonのpytestを自動実行&表示させる方法」について解説しました。

GitHub Actionsを使いこなして、様々なことを自動化させて開発を効率化していきましょう。

ここまで読んで下さりありがとうございます。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

qiita.com

Windowsでnode.jsとnpmをインストールしてみた

はじめに

この記事では、「Windowsでnode.jsとnpmをインストールする方法」について書いています。

自分に向けた備忘録でもありますが、「Windowsでnode.jsとnpmをインストールしたい」な人の一助になれば嬉しいです。

手順

Note

試した際の環境は以下の通りです。

まずは以下のサイトにアクセスします。

http://nodejs.org/

開くと、使っている人の環境に合わせたインストーラを下図のように示してくれますので、その中からお好きなモノ(特にこだわりがなければLTSの方)をダウンロードしましょう。(私は18.12.1 LTSを選びました)

次に、ダウンロードしたインストーラをダブルクリックで起動します。

起動すると、インストーラに色々聞かれますが、基本全部「Next」を選べば問題ありません。どんどん「Next」押していってください。

するとInstallがスタートしてすぐに完了します。(すごく簡単にInstallが出来てびっくりしました)

ではちゃんとインストールができているか確認しましょう。コマンドプロンプトを起動して下記のコマンドを実行してみてください

node --version

そして以下のような感じでバージョンが表示されればインストールに成功しています。

v18.12.1

npmも同時にインストールされていますので、こちらもインストールされているか確認します。下記のコマンドを実行してください。

npm --version

以下のようにバージョンが表示されればインストール成功です。(こちらは表示に少し時間がかかりました)

8.19.2

おわりに

Windowsでnode.jsとnpmをインストールする方法」について解説しました。

ここまで読んで下さりありがとうございます。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

qiita.com

Pythonのpytestでパラメータ化を試してみる

はじめに

この記事では、「Pythonのpytestでパラメータ化を行う方法」について書いています。

パラメータ化とは何か

テストを書いている時、一つの条件だけでなく複数の値で確認したい場合もあるかと思います。(数値処理の関数ならマイナスの値やプラスの値、ゼロや大きい値など)

しかし、一つの関数のためだけにたくさんのテスト関数を作るのも面倒ですし可読性も悪くなってしまいます。

そういったテストを簡単に行えるようにした仕組がパラメータ化と呼ばれているものです。

引数と期待する結果を組にしたものを用意し、それをテスト関数に渡すことで複数の条件で結果をテストすることができるようになります。

実際に試してみる

では簡単なテストでpytestでパラメータ化を試してみましょう

Note

試した際の環境は以下の通りです。

まず、パラメータ化を試すためのコードは以下の通りです。

import pytest

def add_two(num):
    return num + 2

@pytest.mark.parametrize(
    "x, expected",
    [
        (1, 3),
        (2, 3),
        (3, 5)
    ],
)

def test_add_two(x, expected):
    assert expected == add_two(x)

ポイントとしては

  • @pytest.mark.parametrizeでテストに使用するパラメータを記述します
  • テスト関数(ここではtest_add_two)の引数に、@pytest.mark.parametrizeで記述したパラメータを指定します。

このコードに対してpytestを実行してみると以下のような出力が得られます。

plugins: anyio-3.6.1
collected 3 items

test_add.py .F.                                                                                                  [100%]

====================================================== FAILURES =======================================================
_________________________________________________ test_addition[2-3] __________________________________________________

x = 2, expected = 3

    @pytest.mark.parametrize(
        "x, expected",
        [
            (1, 3),
            (2, 3),
            (3, 5)
        ],
    )

    def test_add_two(x, expected):
>       assert expected == add_two(x)
E       assert 3 == 4
E        +  where 4 = add_two(2)

test_add.py:16: AssertionError
=============================================== short test summary info ===============================================
FAILED test_add.py::test_add_two[2-3] - assert 3 == 4
============================================= 1 failed, 2 passed in 0.20s =============================================

パラメータで記述した3組全てでテストが実行されたようです。

ちなみに、実は1組のパラメータをわざと失敗するようにしていましたが、それが正しく失敗と検知されています。

おわりに

Pythonのpytestでパラメータ化を行う方法」について解説しました。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

https://rinatz.github.io/python-book/ch08-02-pytest/

https://qiita.com/gyu-don/items/33ac89b85b6df86962d9