継続的インテグレーション(CI)について調べてみた
はじめに
この記事では、「継続的インテグレーション(CI)の概要」について書いています。
DevOps勉強の中の一つとして継続的インテグレーションについて調べ記事に書いてみました。
自分に向けた備忘録でもありますが、「継続的インテグレーション(CI)とは何か知りたい」な人の一助になれば嬉しいです。
継続的インテグレーションとは何か
- CI(Continuous Integration)を日本語にしたもの
- 継続的 = 中断することなく、ずっと続く
- 断続的( = 途切れ途切れでことが進む)の対義語
- インテグレーション = 統一する(コードをマージする)
- 継続的 = 中断することなく、ずっと続く
- 開発者がコードの変更を頻繁にメインラインへマージする開発手法
- メインライン = メインブランチ、トランク。ブランチの作成元のこと。
- 頻度は一日数回が一般的
- 継続的インテグレーションという言葉は2つの側面で使われる
- オートメーションの側面(CI やビルドサービスなど)
- 啓発の側面 (頻繁に統合する必要性を学習することなど)
- 継続的インテグレーションの目的
- バグを早期に発見して対処すること
- ソフトウェアの品質を高めること
- ソフトウェアの更新を検証してリリースするためにかかる時間を短縮すること
- 継続的インテグレーションが必要な理由
- 以前の開発方式の問題点を解消したい
- 以前の開発方式
- チームに所属する開発者が長期間にわたって独立して作業する。
- 作業が完了した後初めて変更点をマスターブランチにマージする。
- 以前の開発方式だとコードの変更をマージする作業が困難で時間がかかる
- 長期間独立して作業 = 変更点が多く、その分競合や失敗の可能性が高い
- バグが修正されないまま長期間にわたって累積する
- 変更点が多い中でバグの原因特定は時間がかかる
- これらが積もり積もって更新のリリースが遅れる原因になる
- 開発のための作業時間が競合の解決などマージのための作業時間をはるかに超えることにもなる
- 以前の開発方式
- 以前の開発方式の問題点を解消したい
- 継続的インテグレーションの仕組み
- 開発者は、Gitなどのバージョン管理システムを使って共有リポジトリに頻繁にコミットする。
- コミットする前にローカルでテストを実行し、自分のコードが問題ないかを確かめる
- 継続的インテグレーションはユニットテストと組み合わせて使用することが想定されている。
- コミットされたら自動的にビルドを行い、変更された新しいコードについて品質管理を実施する
- 品質管理: ユニットテストや統合テストに加えて静的分析など
- 継続的インテグレーションのメリット
- バグを短時間で発見、対処できるようになり、プロジェクトとして時間とコストの両方を節約できる。
- 更新を迅速に配信できるようになり、リリース直前での土壇場の混乱を避けることができる。
- 開発者が競合の解決などに時間を取られなくなるため生産性が向上する
おわりに
「継続的インテグレーション(CI)の概要」について解説しました。
さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。
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を書いたら自動でハイパーリンクさせる方法」について解説しました。
ちょっとした小ネタですが、知っておくと便利かもしれません。
さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。
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を使う方法」について解説しました。
ここまで読んで下さりありがとうございます。
さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。
Rustのrstestでパラメータテストをしてみる
はじめに
この記事では、「Rustのrstestを使ったパラメータテストの仕方」について書いています。\
自分に向けた備忘録でもありますが、「Rustでパラメータテストがしたい」「rstestを使ってみたい」な人の一助になれば嬉しいです。
rstestとは何か
rstestとは、フィクスチャベースのテストフレームワークで、フィクスチャとテーブルベースのテストが書けるようになるものです。
フィクスチャとは、テストを実行するのに必要な条件のことで、テーブルベースのテストの入力と期待値をテーブル形式で記述し、そのテーブルを走査しながら実行するようなテストのことです。
rstestでパラメータテストの行い方
Note
試した際の環境は以下の通りです。
- OS: Windows 10
- Rust: 1.64.0
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のように書けて中々良さそうだなと感じました。
さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。
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を使いこなして、様々なことを自動化させて開発を効率化していきましょう。
ここまで読んで下さりありがとうございます。
さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。
Windowsでnode.jsとnpmをインストールしてみた
はじめに
この記事では、「Windowsでnode.jsとnpmをインストールする方法」について書いています。
自分に向けた備忘録でもありますが、「Windowsでnode.jsとnpmをインストールしたい」な人の一助になれば嬉しいです。
手順
Note
試した際の環境は以下の通りです。
- OS: Windows 10
まずは以下のサイトにアクセスします。
開くと、使っている人の環境に合わせたインストーラを下図のように示してくれますので、その中からお好きなモノ(特にこだわりがなければLTSの方)をダウンロードしましょう。(私は18.12.1 LTS
を選びました)
次に、ダウンロードしたインストーラをダブルクリックで起動します。
起動すると、インストーラに色々聞かれますが、基本全部「Next」を選べば問題ありません。どんどん「Next」押していってください。
するとInstallがスタートしてすぐに完了します。(すごく簡単にInstallが出来てびっくりしました)
ではちゃんとインストールができているか確認しましょう。コマンドプロンプトを起動して下記のコマンドを実行してみてください
node --version
そして以下のような感じでバージョンが表示されればインストールに成功しています。
v18.12.1
npmも同時にインストールされていますので、こちらもインストールされているか確認します。下記のコマンドを実行してください。
npm --version
以下のようにバージョンが表示されればインストール成功です。(こちらは表示に少し時間がかかりました)
8.19.2
おわりに
「Windowsでnode.jsとnpmをインストールする方法」について解説しました。
ここまで読んで下さりありがとうございます。
さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。
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でパラメータ化を行う方法」について解説しました。
さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。