やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GitHubActionを試してみる1

 めちゃくちゃ。いつかまとめる。

成果物

コード

ローカルリポジトリ

  1. ソースコードを作成する
  2. GitHubにpushする

Program.cs

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("Hello world");
    }
}

リモートリポジトリ

 以下の手順で自動生成されたデフォルト設定ファイルをコミットする。

  1. GitHubサイトにてリポジトリページに行きActionをクリックする
    f:id:ytyaru:20191115224617p:plain
  2. Actionを設定する(set up this workflowボタンをクリックする)
    f:id:ytyaru:20191115224633p:plain

 以下のような設定ファイルが自動で生成されていた。

dotnetcore.yml

name: .NET Core

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 2.2.108
    - name: Build with dotnet
      run: dotnet build --configuration Release

f:id:ytyaru:20191117095701p:plain

  1. Start commitボタンをクリックする
  2. commit new fileボタンをクリックする

f:id:ytyaru:20191117095715p:plain

ローカルリポジトリ

設定ファイルのダウンロード

 リモートの状態をダウンロードする。

git pull origin master

 以下のパスに設定ファイルがダウンロードされる。

.github/workflows/dotnetcore.yml

ステータスバッジの追加

 ReadMe.mdに以下のコードを追記する。

https://github.com/<OWNER>/<REPOSITORY>/workflows/<WORKFLOW_NAME>/badge.svg
https://github.com/<OWNER>/<REPOSITORY>/workflows/<WORKFLOW_FILE_PATH>/badge.svg

 注意。dotnetcore.ymlファイルにname: .NET Coreと設定されている。nameが設定されているときは、<WORKFLOW_NAME>による方法でのみ作成可能らしい。同様に、nameが設定されていないときのみ、<WORKFLOW_FILE_PATH>による指定ができる。

 今回はデフォルト通りにnameが設定されている。よって名前指定による方法を用いる。

 半角スペースをURLエンコードすると%20になる。よってURLは以下。

![](https://github.com/ytyaru/CSharp.GitHubAction.20191117075439/workflows/.NET%20Core/badge.svg)

 というか、ヘルプにあるパス版のURLって以下のうちどっちなの? 名前指定するからどうでもいいのだが。

https://github.com/<OWNER>/<REPOSITORY>/workflows/<WORKFLOW_FILE_PATH>/badge.svg
![](https://github.com/actions/hello-world/workflows/.github/workflows/main.yml/badge.svg)

 ちなみに設定ファイルのパスは./.github/workflows/*.ymlとなっているため、上記のどちらでもない……。

 よし、pushして確認しよう。と思ったらエラーでした。何も表示されず。

実行時エラー

 pushしたあとリモートリポジトリを見てみると、ビルドエラーになっていた。アイコンをクリックすると詳細ポップアップが出た。

f:id:ytyaru:20191117100804p:plain

 さらにポップアップにあるDetailsリンクをクリックすると、ビルドログが閲覧できた。

f:id:ytyaru:20191117100953p:plain

MSBUILD : error MSB1003: Specify a project or solution file. The current working directory does not contain a project or solution file.

 あ、そうか。.csprojファイルがないからdotnetコマンドでビルドできないのか。

 ローカルでは以下のようにcscコマンドでビルド&実行できるのだが。

csc *.cs
chmod 755 *.exe
./*.exe

 これをGitHubActionサーバで実行するにはどうすればいいんだ?

cscビルド用ワークフロー作成

 おそらく以下の書式に従えばいい。だが、さっぱりわからん。

 dotnetcore.ymlを参考にしてそれっぽく書いてみる。

csc.yml

name: csc

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 2.2.108
    - name: Build with csc
      run: csc *.cs

 よく見るとdotnetのバージョンが古い。2.2.1083.0.100が欲しいのだが。一旦放置。

 修正後pushするも、またエラー。ソースコードが見つからないらしい。

error CS2001: Source file '*.cs' could not be found.
warning CS2008: No source files specified.
error CS1562: Outputs without source must have the /out option specified

working-directory

 ググったら以下のように作業ディレクトリを設定できるらしいことを発見。

      working-directory: src

 ソースコードがあるディレクトリパスを上記コードにて指定する。今回はsrc

csc.yml

name: csc

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 2.2.108
    - name: Build with csc
      working-directory: src
      run: csc *.cs

 nameの値をcscに変更した。ステータスバッジ表示URLも同様に修正する。後述のように。

ステータスバッジの確認ができた!

 最初はno statusと灰色のバッジだった。f:id:ytyaru:20191117105846p:plain

 数分後にページ更新するとpassingという緑色のバッジになった。カッコイイ!

![](https://github.com/ytyaru/CSharp.GitHubAction.20191117075439/workflows/csc/badge.svg)

所感

 バッジがSVG形式なのも嬉しい。できれば設定ファイルへのリンクも欲しいのだが、後回し。次はdotnet3.0.100バージョン環境を用意できるか確認したい。

CIって

CIって必要なの?

 ところで、このActionをローカルで実行できないの? 基本的にローカルで開発するのだからビルドもローカルで行うはず。それをわざわざサーバ側で再ビルドする必要などあるのか?

 もちろんpushするたびに自動確認してくれるのは嬉しい。でも、それはpushする前にローカルで手動でやってるんですが……。そこを自動化したいんですが……。自分でコマンド簡略化スクリプトとか作っちゃってるんですが……。pushする前にビルド結果を知りたいのですが……。

 今の所、私の中でGitHubActionは「なんかカッコイイバッジ作れるヤツ」ってレベル。そのために面倒な設定ファイル作成せねばならないのが辛い。

CIって何なの?

 きっと私がCIとやらの概念を理解できていないせいなのだろう。そしてそれが欲しくなるほどの規模や価値あるコードが書けていない私にとっては、豚に真珠、猫に小判なのだろう。

 でもバッジのため、設定ファイルを自動作成するスクリプトをローカルで作りたい。こうして無駄な仕事と二酸化炭素排出量が増えていくのであった。CIはカーボン・インクリメントの略に違いない。

 というか、CIの説明にあるエクストリーム・プログラミングってなんだよ。エクストリーム・アイロニング的なやつ? 会長から人生の神髄が学べるらしい。悟り開く感じかな。CIは覚醒まで一直線の略だろう。ソフトウェア工学の真髄は人生哲学にありってことね。間違いない。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux