ElixirにおけるCircleCI設定
ElixirにおけるCircleCI設定を簡単ですが纏めておきます
parroty/excoveralls導入
カバレッジ率を取って一喜一憂したいので、parroty/excoveralls を導入します
mix.exs に追加します
def project do
[
app: :【あなたのアプリ名】,
version: "0.0.1",
elixir: "~> 1.4",
elixirc_paths: elixirc_paths(Mix.env),
compilers: [:phoenix, :gettext] ++ Mix.compilers,
start_permanent: Mix.env == :prod,
aliases: aliases(),
test_coverage: [tool: ExCoveralls], ←◯追加
preferred_cli_env: ["coveralls": :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test], ←◯追加
deps: deps()
]
end
〜省略〜
defp deps do
[
{:phoenix, "~> 1.3.3"},
{:phoenix_pubsub, "~> 1.0"},
{:phoenix_ecto, "~> 3.2"},
{:postgrex, ">= 0.0.0"},
{:phoenix_html, "~> 2.10"},
{:phoenix_live_reload, "~> 1.0", only: :dev},
{:gettext, "~> 0.11"},
{:excoveralls, "~> 0.9", only: :test}, ←◯追加
{:cowboy, "~> 1.0"}
]
end
その後、 mix deps.getして mix coverallsするといい感じにカバレッジ取れます
mix coveralls.html を使うとHTMLで見れてカッコいい感じです
CircleCI導入
FusicではCircleCIを利用しています
CircleCIにてADD PROJECTS

Operating System にLinux、Language にElixirを選択するとsampleが表示されますので
Repositoryに.circleci/config.ymlに配置します
CircleCIが提供するElixirのContainerImageが若干古かった(当時1.4)だったので
1.6を使うように変更したり、カバレッジを取るようにしました
# Elixir CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-elixir/ for more details
version: 2
jobs:
build:
docker:
# specify the version here
- image: circleci/elixir:1.4
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/postgres:9.4
working_directory: ~/repo
steps:
- checkout
# specify any bash command here prefixed with `run: `
- run: mix deps.get
- run: mix ecto.create
- run: mix test
↓
# Elixir CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-elixir/ for more details
version: 2
general: ←◯追加
artifacts: ←◯追加
- "cover/excoveralls.html" ←◯追加
jobs:
build:
docker:
# specify the version here
- image: circleci/elixir:1.6 ←△変更
environment: ←◯追加
MIX_ENV: test ←◯追加
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
- image: circleci/postgres:10.4 ←△変更
working_directory: ~/repo
steps:
- checkout
- run: echo 127.0.0.1 【開発環境用postgresqlContainer名】 | sudo tee -a /etc/hosts ←◯追加 ※1
# specify any bash command here prefixed with `run: `
- run: mix local.hex --force ←◯追加
- run: mix local.rebar --force ←◯追加
- run: mix deps.get
- run: mix ecto.create
- run: mix coveralls.html ←◯追加
- store_artifacts: ←◯追加
path: cover/excoveralls.html ←◯追加
destination: cover/excoveralls.html ←◯追加
これで、excoveralls.html にてカバレッジの状況を確認することが出来ます
※1で /etc/hostsを置き換えている理由を説明します
開発時は ElixirとPostgresqlのContainerは分けているので
Container間のつなぎ込みは名前解決で対応しています
mix.exs のテスト用指定が test になっているので、
環境変数は MIX_ENV:test として開発環境Containerと
CircleCIのContainerの設定ファイルは config/test.exs 共通化して
設定ファイルの管理を楽にしたいです
なので、 MIX_ENV:test として設定ファイルを共通化しながら、
CircleCI側の名前解決(127.0.0.1)を開発環境用の名前解決と合わせることで
上記問題を解決しました。

その後CircleCIにSlackの設定やAWSの設定を行なってますが今回は割愛します
Macにanyenvを使ってelixirをインストールする
開発環境をDockerを使わずに構築したので忘備録
Dockerを使うと、すんなり準備出来てしまって何が必要かほとんど把握出来なかったのと
手元のMacですぐ確認したい事ありそうなので、手元で構築してみようと思いました
anyenvをインストール
exenvでバージョン管理したいので、anyenvを使います
READMEに書いてますが、インストールしてない人は以下で設定してください。(zsh用です)
$ git clone https://github.com/riywo/anyenv ~/.anyenv $ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.zprofile $ echo 'eval "$(anyenv init -)"' >> ~/.zprofile $ exec $SHELL -l
anyenv-updateもインストールしていた方が良いと思います
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
erlenvをインストール
anyenv install erlenv
新しめのerlangをいれます
erlenvは install コマンドがなくてmake するっぽい
ファイルを落としてインストール
javaとかいろいろ入れてるのは、途中でエラー出たので、随時追加しました
--with-sslはMacのbrew管理してるopensslを利用したかったためです
http://www.erlang.org/download にてダウンロードするerlangを決めます
今回は20.3
wget http://www.erlang.org/download/otp_src_20.3.tar.gz tar zxf otp_src_20.3.tar.gz cd otp_src_20.3 brew cask install java brew install unixodbc wxmac fop ./configure --prefix=$HOME/.anyenv/envs/erlenv/releases/20.3 --with-ssl=$(brew --prefix openssl) make make install erlenv global 20.3 erlenv rehash
exenvをインストール
anyenv install exenv
exenv install -l ← 1.7.1が最新だった exenv install 1.7.1 exenv global 1.7.1 elixir -v
anyenvとかDockerとか環境構築が楽になったなーとしみじみ思いました。
開発には普通にDockerを使おうと思います
PHPカンファレンス福岡2018で登壇させて頂きました
本編
とても光栄なことに昨年に引き続き
PHPカンファレンス福岡2018にて登壇させて頂く機会を頂きました。
僕みたいな一介のエンジニアが。。。と少なからず思ってしまっていましたが
採択して頂いた運営の方々の為にも、自信を持って発表出来るように努めました。
発表したスライド
何故PHPなんですか?
発表動画
僕の他にも弊社の社員が登壇させて頂いてます。 fusic.co.jp
最近はGolangに興味を持って書くようにしていましたが、
たまに感じる窮屈な感じを言語化して伝えてみようと思いました。
青いアイコンでお馴染みの @soudai1025 さんがカンファレンス前につぶやいていたのを見て
実際に素振りをひたすら繰り返しました。
そーだいさんは発表上手いですねって言われること多いけど最低でもフルで素振り三回はするし、それくらいするとスムーズに喋れるところと喋れないところわかるから全部スムーズに喋れるまで調整してるだけでマジオススメなんで資料は一週間前に作って素振り三回してみてほしい
— そーだい@初代ALF (@soudai1025) 2018年5月22日
弊社の社員にも協力して時間もらって聞いてもらったり、
@nako0123 さんをお招きして一緒に練習したりしてました。
やっぱり素振ってて良かったと思います。
壇上に上がっても案外緊張せずに話せたと思ってます。
とはいえ噛みすぎてて、後半になればなるほど少し焦りが出てしまいました。
喋りたいことが飛んじゃった部分もあったので、
次回またチャンスがあれば登壇して完璧にやりきりたい
本編では一番最初だったのですが、その後も浮遊感が抜けなくて
発表をしっかり聞けなかった感じがあったので、
後日ちゃんと発表者のスライドを見直そうと思います
その他のイベント
PHPカンファレンス本編以外にも非公式イベントが多数あり、
めちゃくちゃ豪華過ぎる方々が参加されてました。
PHPカンファレンス福岡 前々夜祭(非公式) pepabo.connpass.com
【非公式】PHPカンファレンス福岡2018前夜祭リジェクトコン connpass.com
僕は、前々夜祭 → スタッフ・登壇者前夜祭 → エールズ → 弊社社員と3時まで激論というなかなかハードな感じでした。
特に一番最後のは、別日にやりなさいと過去の自分を嗜めたいです。
アフターハック
fusic.connpass.com
弊社でも非公式イベントを行ってまして、若干の遅刻の後に参加
盛り上げなきゃ!と思ってお酒を飲み過ぎて若干の空回り感は否めませんでしたが、
僕の壮大な勘違いを@uzullaさん @tadsanさん @kunitさん @k1LoWさん
からしっかり教えてもらいました。
無知を晒すことにはなりましたが、結果凄く良かったです。
感想
前日にFukuoka.goでも発表していたので、結果、個人的には4daysになってました。
かなり濃い4日間となりました。
とても、とても良かったです。
ただただ楽しかった。
少し反省すべき点もあったので、今後の行動に反映していきたいです。
あと、お酒が適量飲めるようなちゃんとした大人になりたいです。
golangでリポジトリ作った時にするCI設定
新しいプロジェクトを始めたのでいつもサッとするCI設定をまとめてみました
dep導入
CIを回す時にたいてい必要なのでサッと導入します
インストールしてない場合は go getします
go get -u github.com/golang/dep
その後Repositoryのルートにて、dep用のファイルを作成
dep init
Gopkg.tomlとGopkg.lockをリポジトリにPushしておきます
いつもはこの段階でCircleCIの設定(.circleci/config.yml)もPushします
CircleCI導入
FusicではCircleCIを利用していますので、僕もCircleCIを利用しています
CircleCIにてADD PROJECTS

Operating System にLinux、Language にGoを選択するとsampleが表示されますので
Repositoryに.circleci/config.ymlに配置します
私は少し修正して以下のような形で使ってます
このテンプレート使うとcoverageのアップロードを行ないます
※@haya14busaさん作成の複数のパッケージをまとめてカバレッジするための
goverageを使ってます
version: 2
general:
artifacts:
- "coverage.out"
jobs:
build:
docker:
- image: circleci/golang:1.9
working_directory: /go/src/github.com/【アカウント】/【リポジトリ】
steps:
- checkout
- run: go get -u golang.org/x/lint/golint github.com/golang/dep/cmd/dep github.com/haya14busa/goverage
- run: golint ./...
- run: go vet ./...
- run: dep ensure
- run: goverage -v -coverprofile=coverage.out ./...
- run: go tool cover -html coverage.out -o coverage.html
- store_artifacts:
path: coverage.out
destination: coverage.out
- store_artifacts:
path: coverage.html
destination: coverage.html


その後CircleCIにSlackの設定やAWSの設定を行なってますが今回は割愛します
Scrutinizer導入
Scrutinizerにて Add Repository

Githubを選んでGithub Repositoryにリポジトリ名を入力
Default Configに「Go」を選択
Scrutinizerのcoverage Badgeを表示したいのでScrutinizerでもTestを走らせてます
Tests チェックしてAdd Repository

coverage を取りたいので設定変更します
左メニューのスパナを選んでConfigurationを選択します
Repository Configを変更します

checks:
go: true
build:
nodes:
analysis:
project_setup:
override:
- 'true'
environment:
go:
version: go1.9.2
tests:
override:
- command: go get -u github.com/haya14busa/goverage
- go-scrutinizer-run
- govet-run
- golint-run
-
command: goverage -v -coverprofile=coverage.out ./...
coverage:
file: 'coverage.out'
format: 'go-cc'
変更するとBadgeのcoverageが表示されます
BadgeはgithubのREADME.mdに記述しておきます
README.mdに記述する内容はTOP画面の
Badgesリンクを押下するとコピペする内容がわかります

README.mdにBadgeが表示されると気持ちいいです
※下記画像はプロジェクト開始直後に作成した、最高に気持ちいい状態です

ブログ書いたほうが良いと聞いたので
ゆるく書きます