この記事は?
最近、GitHub Actions をちょっと勉強し、その練習ついでにつくったものを紹介。
Linux コマンドの基礎が分かっている前提です。また、GitHub Actions の詳しい使い方などについては説明していません。
C/C++ のビルドチェック
さして難しいことはありません。全ての .c
ファイルを gcc にかける、ただそれだけです。
name: Build Check
on: push
jobs:
build_test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Building test in GCC
run: find * -type f -name '*.c' | xargs -r -t -L 1 gcc -c -o /dev/null
-
actions/checkout@v3
で、リポジトリのファイルをワークスペースに出力 -
find
コマンドで~~.c
ファイルを検索 - 見つかったファイルを GCC に入れてコンパイル
C++ に対応させるには、*.c
を *.cpp
に、gcc
を g++
に変えるだけで OK です。
このままだと、変更の有無を問わず、push される度に全てのファイルをコンパイル (チェック) することになってしまいます。ソース数が多い場合はまともに使えなくなることも考えられます。
最後の行 run: ...
がメインの箇所です。find
や xargs
の概要は割愛して、オプションの説明をします。
find
まずは、find
で .c
ファイルの検索をします。
オプション | 意味 |
---|---|
* |
カレント上のファイル (ディレクトリ内含む) 全てのファイルを選択 |
-type f |
ファイルのみ表示 (ディレクトリは除外される) |
-name '*.c' |
ファイル名が ~~.c である (* はワイルドカード) |
これで、~~.c
という名前のファイル一覧が出力されます。
xargs
次に、xargs
で各ファイル名を引数にコマンドを実行します。ここでは、ファイル名 1つ 1つに対して、gcc -c -o /dev/null {ファイル名}
というようなコマンドが実行されることになります。
オプション | 意味 |
---|---|
-r |
入力が無いとき、コマンドを実行しない (つまり、find でファイルが見つからなかったとき何もされない) |
-t |
実行されるコマンドを標準出力 |
-L 1 |
パイプなどから複数行の入力があっても、コマンドに 1引数ずつだけ入れる |
gcc
最後に、gcc
のオプションは次の通り。
オプション | 意味 |
---|---|
-c |
コンパイルとアセンブルは行うが、リンクを行わない (これにより、複数ファイルにまたがるコードでも、1ファイルずつテストを行える) |
-o /dev/null |
出力ファイルの指定 (/dev/null に書き込まれたデータは即時削除、これによりビルドはするがファイルを保存しないという動作を実現する) |
Python のビルドチェック
py_compile
を使う
やることは 9割同じです。オプションが少し異なるので、そこだけ紹介。run: ...
の部分だけ書くと、次のようになります。
- name: Building test in py_compile
run: |
find * -type f -name '*.py' | xargs -r -t -L 1 python3 -m py_compile
-m py_compile
により、Python コードのコンパイルを行います。これにより、構文解析をするが、実行はしないという動作を実現します。
参考元:
pylint
を使う
ちなみに、全く同じ要領で pylint
を用いて、より高度な構文チェックを行うことができます。(同様の linter は他にもあります。)
pip install pylint
- name: Building test in py_compile
run: |
find * -type f -name '*.py' | xargs -r -t -L 1 pylint
しかし、pylint は評価結果が 10点満点でないと、ステータスコードが 0以外で終了するようです。そのため、満点でないと GitHub 上で結果が Failure として扱われることになってしまいます。