GitHub ActionsでGo言語のテストを動かしてみた

はじめに

GitHub Actionsのβテストに選ばれたので、正月休みを利用して試してみました。何をさせようかちょっと考えたのですが、ちょうど『Go言語でつくるインタプリタ』を読みすすめているので、そのテストコードを実行するようにしてみました。

Go言語でつくるインタプリタ

Go言語でつくるインタプリタ

はじめてのGitHub Actions

ドキュメントが公開されているので、それをもとに実行してみます。

developer.github.com

今回はGoコマンドのバージョンを出力するようにしてみます。

.github/main.workflowに以下の内容を記してGitHubリポジトリにpushします。

workflow "Test" {
  on = "push"
  resolves = ["test"]
}

action "test" {
  uses = "docker://golang:latest"
  runs = "go version"
}

すると、GitHubリポジトリにあるActionsタブに以下のような画面が表示されます。

f:id:miyohide:20190101193353p:plain

「Log」をクリックすると以下のようなログが出力されます。

### STARTED test 07:11:08Z

Pulling image: gcr.io/github-actions-images/action-runner:latest
latest: Pulling from github-actions-images/action-runner
4fe2ade4980c: Already exists
86eb2eb12b87: Pulling fs layer
3c0e0e9cbe16: Pulling fs layer
0dff81d7fe33: Pulling fs layer
3c0e0e9cbe16: Verifying Checksum
3c0e0e9cbe16: Download complete
0dff81d7fe33: Verifying Checksum
0dff81d7fe33: Download complete
86eb2eb12b87: Verifying Checksum
86eb2eb12b87: Download complete
86eb2eb12b87: Pull complete
3c0e0e9cbe16: Pull complete
0dff81d7fe33: Pull complete
Digest: sha256:2b563779b8eb5c34114dce5f547ef0e8506a5701123819159a3ae1b319f4f80e
Status: Downloaded newer image for gcr.io/github-actions-images/action-runner:latest
Unable to find image 'golang:latest' locally
latest: Pulling from library/golang
Digest: sha256:7866a3428b229f9bb8aeaa437ed5cc3a4e5bf0b7c2ac534598fb6e40b6c6088d
Status: Downloaded newer image for golang:latest
go version go1.11.4 linux/amd64

### COMPLETED test 07:11:13Z (5.365s)

見にくいですが、

go version go1.11.4 linux/amd64

が表示され、Goコマンドのバージョンが出力されていることがわかります。

テストを実行する

さて、当初の目的であるテストの実行をしてみます。DevelopersIOの以下の記事を参考にDockerfileなどを作って実行してみました。

dev.classmethod.jp

最終的な設定は以下の通り。

まずは.github/main.workflowusesの部分を自分が作成したDockerfileなどをおいているパスに変更しています。

workflow "Test" {
  on = "push"
  resolves = ["test"]
}

action "test" {
  uses = "./.github/actions/golang"
}

.github/actions/golang/Dockerfileは以下の通り。

FROM golang:latest
 
COPY entrypoint.sh /entrypoint.sh
 
ENTRYPOINT ["/entrypoint.sh"]

最後に.github/actions/golang/entrypoint.shリポジトリ名をmiyohide-monkeyにしていたのにソースの中のpackage名はmonkeyにしていたので当初うまく動かずに悩みましたが、APP_DIRを直接指定することで動かすことができました。

#!/bin/bash
 
APP_DIR="/go/src/github.com/miyohide/monkey/"
 
mkdir -p ${APP_DIR} && cp -r ./ ${APP_DIR} && cd ${APP_DIR}
 
echo "#######################"
echo "# Running Test"
go test ./...

実行ログは以下の通り。

### STARTED test 13:13:05Z

Already have image (with digest): gcr.io/cloud-builders/docker
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855: Pulling from gct-12-whr4wtzjyryvx9olfja8cwy/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/8cf18bd4dc69e0f0e1f4b7a018b1b229495786905f46383be02cfeda9cc0c33b
cd8eada9c7bb: Already exists
c2677faec825: Already exists
fcce419a96b1: Already exists
045b51e26e75: Already exists
70a7003e9fe9: Already exists
751b6f060321: Already exists
462a907acb44: Already exists
6592a1601888: Pulling fs layer
6592a1601888: Verifying Checksum
6592a1601888: Download complete
6592a1601888: Pull complete
Digest: sha256:ab4db72476723a12a47a5c13c618ed8284b1444840b54e74a156ab01ab2da208
Status: Downloaded newer image for gcr.io/gct-12-whr4wtzjyryvx9olfja8cwy/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/8cf18bd4dc69e0f0e1f4b7a018b1b229495786905f46383be02cfeda9cc0c33b:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Already have image (with digest): gcr.io/cloud-builders/docker
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM golang:latest
latest: Pulling from library/golang
Digest: sha256:7866a3428b229f9bb8aeaa437ed5cc3a4e5bf0b7c2ac534598fb6e40b6c6088d
Status: Downloaded newer image for golang:latest
 ---> 343df9d12b7b
Step 2/3 : COPY entrypoint.sh /entrypoint.sh
 ---> e8e67d9de9a7
Step 3/3 : ENTRYPOINT ["/entrypoint.sh"]
 ---> Running in f3333c74336c
Removing intermediate container f3333c74336c
 ---> e38fd33cb0bf
Successfully built e38fd33cb0bf
Successfully tagged gcr.io/gct-12-whr4wtzjyryvx9olfja8cwy/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/8cf18bd4dc69e0f0e1f4b7a018b1b229495786905f46383be02cfeda9cc0c33b:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Pulling image: gcr.io/github-actions-images/action-runner:latest
latest: Pulling from github-actions-images/action-runner
4fe2ade4980c: Already exists
86eb2eb12b87: Pulling fs layer
3c0e0e9cbe16: Pulling fs layer
0dff81d7fe33: Pulling fs layer
86eb2eb12b87: Verifying Checksum
86eb2eb12b87: Download complete
0dff81d7fe33: Verifying Checksum
0dff81d7fe33: Download complete
3c0e0e9cbe16: Verifying Checksum
3c0e0e9cbe16: Download complete
86eb2eb12b87: Pull complete
3c0e0e9cbe16: Pull complete
0dff81d7fe33: Pull complete
Digest: sha256:2b563779b8eb5c34114dce5f547ef0e8506a5701123819159a3ae1b319f4f80e
Status: Downloaded newer image for gcr.io/github-actions-images/action-runner:latest
#######################
# Running Test
?       github.com/miyohide/monkey  [no test files]
ok      github.com/miyohide/monkey/ast  0.002s
ok      github.com/miyohide/monkey/evaluator    0.003s
ok      github.com/miyohide/monkey/lexer    0.002s
ok      github.com/miyohide/monkey/object   0.002s
ok      github.com/miyohide/monkey/parser   0.002s
?       github.com/miyohide/monkey/repl [no test files]
?       github.com/miyohide/monkey/token    [no test files]

### COMPLETED test 13:13:26Z (21.068s)

Running Test以下にGo言語のテストが実行されていることがわかります。

まとめ

取り急ぎ動かしてみたっていう感じでブログエントリを書いてみました。

ここまではTravisやCircleCIとやっていることは一緒なので、もっとGitHub Actionsならではのことをやってみたいです。

iPhoneの機種変更をした

2年に一回の恒例行事、iPhoneを機種変更しました。

環境は

というもの。

第一印象はでかいなぁって感じ。その後、ケースまでつけると分厚さも感じるようになりました。

こういう機種変更のログを残しておくとまた2年後に役に立つかなと思い、ログとして残してみることにしました。

事前準備

事前にやっておくのは、

  • Suica情報を削除
  • LINEの移行手続き
  • Apple Watchとのペアリング解除

ぐらい。各社案内を出しているので事前に目を通しておくとよいかと思います。

www.jreast.co.jp

official-blog.line.me

移行

あとは、iPhone XRに電源を入れてiPhone 7の近くに置くとすぐ「新しいiPhoneを設定」というメッセージが出てくるのであとは画面の指示に従うだけ。

support.apple.com

iTunesに繋げなくてもさくっと移行できたのでめっちゃ楽でした。大体1時間ぐらい。

ハマりポイント

最後にSIMをiPhone XRに入れて、IIJ mioのプロファイルを入れたらおしまい。IIJ mioのプロファイルを入れないと、無線LANがない場所ではデータ通信ができません。アンテナは普通に捕まえるので、めっちゃハマりポイント。実際ハマりました。

www.iijmio.jp

RubyWorld Conference 2018に行ってきた&Ruby Prize最終ノミネート者として表彰された

毎年恒例のRubyWorld Conference 2018に行ってきた。

今年も発表者募集に応募したのですが、採択されず。そのことについて若干いじられたりもして正直悔しい。来年はなにか発表できるように頑張りたい。

発表について

今年も多岐にわたる発表。Ruby = Railsっていう考えが多い中、本当に色々な所で使われているんだなあと。mrubyについては昨年までいろいろと取り組んでいたんだけれども、今年になって中断しているのでなんとかしたいなぁ。特にngx_mrubyについてはどこかで実戦投入したい。

ショートプレゼン

協賛企業の特典であるショートプレゼンも実施した。自社のRubyに対するこれまでの取り組みとこれからの取組みについて。発表後、NaClの井上社長から「迫力があってよかった」というお言葉をいただき、ちょっと嬉しかった。

Ruby Prize

Ruby Prizeの最終ノミネート者としてRubyWorld Conference 2018で表彰された。Rubyist Magazineに対する取り組みを評価していただいたとのことで、嬉しい。

f:id:miyohide:20181101234122j:plain

色んな人から「おめでとう」と声をかけていただき、やってきてよかったなと。RubyWorld Conferenceの場でも「記事書きますよ」と言っていただき、効果は抜群であった。

まだまだRubyist Magazineに対してはやりたいことがたくさんあるので、まだまだ続けていきたい。

Ruby Prize 2018にノミネートされた

るびま」ことRubyist Magazineの運営・編集・リリース管理などを数年やっていたら、Ruby Prize 2018にノミネートされました。ありがとうございます。

RubyPrize2018|候補者決定

発行ペースが落ちているのですが、これからも色々と記事を集めてるびまを続けていきたいと考えています。

Rails 5からbelongs_to associationを書くと親はデフォルト必須になった

はじめに

Rails 5(Rails 5.1?)からbelongs_to associationを書くと親が必須になっていました。これに今日はドハマリした...

具体的には、

class Post < ApplicationRecord
  belongs_to :article
end

というmodelがあったとして、rails consoleなどでPostインスタンスsaveしようとするとvalidationエラーが出ます。

> Post.new.save!
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
Traceback (most recent call last):
        1: from (irb):3
ActiveRecord::RecordInvalid (Validation failed: Article must exist)
>

経緯

Rails 5.0から5.1にアプリをあげてテストを流していたときに大量にテストが落ちたことがきっかけです。解決に至ったのは、次のブログ。

48n.jp

回避

上記のブログにあるように、belongs_tooptional: trueをつければOKです。ソース全体を書くと

class Post < ApplicationRecord
  belongs_to :article, optional: true
end

と言った感じになります。

実際にrails consoleで確かめてみます。

> Post.new.save!
   (0.1ms)  begin transaction
  Post Create (0.5ms)  INSERT INTO "posts" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", "2018-09-25 11:29:33.968321"], ["updated_at", "2018-09-25 11:29:33.968321"]]
   (1.3ms)  commit transaction
=> true
>

無事、生成できました。

Web App for Containers + PostgreSQLでコンテナ対応したRailsアプリを作ってみた

概要

Microsoftが提供しているパブリッククラウドサービス「Azure」の「Web App for Containers」を使ってRailsアプリを動かしてみました。Railsアプリと言っても、scaffoldで自動生成させたもので非常に単純なものです。Azureが提供しているPostgreSQLも合わせて使ってみたいと思い、ちょっとやってみました。

元ネタ

元ネタは「Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう! 」というSlideShare上にあったスライド。これをもとにRDBMSPostgreSQLに変更しただけです。

ハマったところ

  • Web App for ContainersがPortalにない
    • Web App on Linuxであった。
    • 言語設定が日本語版だからかもしれない。
  • Azure DB for PostgreSQLファイアウォールの設定に何を設定していいかがわからない
    • スライドでは、すべてのIPレンジを許可しているけど、さすがにそれはどうかなと
    • よくよく見てみたら、Web App for Containersの送信元はプロパティから見ることができるのでそこで制限すればできる。
  • PostgreSQLへの接続用環境変数設定漏れ
    • 環境変数の設定が漏れていて、ずっと「could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? 」が表示されて困った困った。
    • ホスト、ユーザ名、パスワードを環境変数として設定すればOK。

結果

development環境としてまずは動かすことができました。

ソースは以下においてあります。

github.com

production環境で動かすためには、

をすればできそうですが、やってません。今後の課題ということで。

今後は

今後は、

  • Production環境で動かすこと
  • Application Insightsを試してみる

ことがもっぱらの目標です。いつになるか分かりませんが、ゆっくりとやっていきます。

Ruby Business Users Conference 2018に参加してきた

今年も開催されたRuby Business Users Conference 2018に参加してきました。

Ruby Business Users Conference 2018

Ruby Business Users ConferenceはRubyを活用しているビジネス事例が紹介される場として、Rubyアソシエーションが毎年2月頃に開催している場です。

今回は、

  • Matzの基調講演
  • 金川 祐太郎さんが「モバイル決済アプリ開発における動的・静的型付け言語の比較と考察」と題してPixiv Pay開発を通して感じたRuby/Rails開発の考察
    • 2ヶ月ほどでサービスリリースのスピード感がすごい。
    • Rubyではリファクタリングで名前変更するのが難しい。JavaだとIDEで一発変換。RubyMine頑張って欲しいとのこと。
  • 高宮 知弘さんが「コミュニケーションデザインRubyRubyで繋がる~」と題してWeb接客システムON SKYの紹介
    • チャットシステムはコミュニケーションの最初のステップとしてハードルが低い。
    • 完璧を目指すのではなく、最初のフィルタリングとしてのWeb接客システム。だが、効果は高い。
  • 角 幸一郎さんが「Rubyを使ったシステム開発における様々なコードレビュー」と題してコードレビューの広がりとその観点・取り組みについて
    • ここ数年でコードレビューがかなり浸透してきた感じ。開発のスピードが上がってレビューの頻度も増えてきた。
    • Pull Requestがコードレビュー手段として一気に台頭。
    • どの観点でレビューをするかをキチンと決めておくこと。
      • 個人的には、いわゆるインデントとかは機械で自動フォーマットしたい。
  • Tomoya Kawanishiさんが「Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法」と題してエネチェンジ社におけるWebサービスの設計について
    • 将来の変更とサービス対応を見越してどのようにシステムを組んでいくか。ひとつが疎結合
      • 料金計算ロジックのライブラリ化やVueJSの取り込み方針など
  • 深谷 篤生さんが「esa.ioの育て方」と題してesa.ioにおけるシステム設計について
    • まさしく要望を受けてからの対応完了までのスピードが段違い。
    • コンテナ化とかマイクロサービス化など、言葉では知っているものが非常に自然に取り込まれている感じ。

という内容。どの発表も各社、各人のサービスの考えや設計を詳細に語っていただき、大変勉強になりました。

今年は基調講演が40分枠、その他の講演が20分枠。20分枠だと発表内容をかなり絞り込む必要があり、もっと話を聞きたいという思いが残りました。懇親会でフォローできればよかったのですが、ちょっと今回は参加できず。こういう場はスライドを見るだけではなく講演者と話をして理解が深まるものと思っていますので、ちょっと無理してでも参加すればよかったかな。