seike460.hatenablog.com

試した技術などを書く

ElixirにおけるCircleCI設定

ElixirにおけるCircleCI設定を簡単ですが纏めておきます

parroty/excoveralls導入

カバレッジ率を取って一喜一憂したいので、parroty/excoveralls を導入します

github.com

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

f:id:seike460:20180519211230p:plain

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)を開発環境用の名前解決と合わせることで
上記問題を解決しました。

f:id:seike460:20180811021131p:plain

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

Macにanyenvを使ってelixirをインストールする

開発環境をDockerを使わずに構築したので忘備録

Dockerを使うと、すんなり準備出来てしまって何が必要かほとんど把握出来なかったのと
手元のMacですぐ確認したい事ありそうなので、手元で構築してみようと思いました

anyenvをインストール

exenvでバージョン管理したいので、anyenvを使います

github.com

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もインストールしていた方が良いと思います

github.com

git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update

erlenvをインストール

anyenv install erlenv

新しめのerlangをいれます
erlenvは install コマンドがなくてmake するっぽい
ファイルを落としてインストール
javaとかいろいろ入れてるのは、途中でエラー出たので、随時追加しました
--with-sslMacbrew管理してる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にて登壇させて頂く機会を頂きました。

phpcon.fukuoka.jp

僕みたいな一介のエンジニアが。。。と少なからず思ってしまっていましたが
採択して頂いた運営の方々の為にも、自信を持って発表出来るように努めました。

発表したスライド
何故PHPなんですか?

発表動画

www.youtube.com

僕の他にも弊社の社員が登壇させて頂いてます。 fusic.co.jp

最近はGolangに興味を持って書くようにしていましたが、
たまに感じる窮屈な感じを言語化して伝えてみようと思いました。

青いアイコンでお馴染みの @soudai1025 さんがカンファレンス前につぶやいていたのを見て
実際に素振りをひたすら繰り返しました。

弊社の社員にも協力して時間もらって聞いてもらったり、
@nako0123 さんをお招きして一緒に練習したりしてました。
やっぱり素振ってて良かったと思います。
壇上に上がっても案外緊張せずに話せたと思ってます。

とはいえ噛みすぎてて、後半になればなるほど少し焦りが出てしまいました。
喋りたいことが飛んじゃった部分もあったので、
次回またチャンスがあれば登壇して完璧にやりきりたい

本編では一番最初だったのですが、その後も浮遊感が抜けなくて
発表をしっかり聞けなかった感じがあったので、
後日ちゃんと発表者のスライドを見直そうと思います

togetter.com

その他のイベント

PHPカンファレンス本編以外にも非公式イベントが多数あり、
めちゃくちゃ豪華過ぎる方々が参加されてました。

PHPカンファレンス福岡 前々夜祭(非公式) pepabo.connpass.com

【非公式】PHPカンファレンス福岡2018前夜祭リジェクトコン connpass.com

僕は、前々夜祭 → スタッフ・登壇者前夜祭 → エールズ → 弊社社員と3時まで激論というなかなかハードな感じでした。
特に一番最後のは、別日にやりなさいと過去の自分を嗜めたいです。

アフターハック

fusic.connpass.com 弊社でも非公式イベントを行ってまして、若干の遅刻の後に参加
盛り上げなきゃ!と思ってお酒を飲み過ぎて若干の空回り感は否めませんでしたが、
僕の壮大な勘違いを@uzullaさん @tadsanさん @kunitさん @k1LoWさん からしっかり教えてもらいました。
無知を晒すことにはなりましたが、結果凄く良かったです。

感想

前日にFukuoka.goでも発表していたので、結果、個人的には4daysになってました。
かなり濃い4日間となりました。

fukuokago.connpass.com

とても、とても良かったです。
ただただ楽しかった。
少し反省すべき点もあったので、今後の行動に反映していきたいです。

あと、お酒が適量飲めるようなちゃんとした大人になりたいです。

golangでリポジトリ作った時にするCI設定

新しいプロジェクトを始めたのでいつもサッとするCI設定をまとめてみました

dep導入

CIを回す時にたいてい必要なのでサッと導入します
インストールしてない場合は go getします

go get -u github.com/golang/dep

その後Repositoryのルートにて、dep用のファイルを作成

dep init

Gopkg.tomlGopkg.lockリポジトリにPushしておきます
いつもはこの段階でCircleCIの設定(.circleci/config.yml)もPushします

CircleCI導入

FusicではCircleCIを利用していますので、僕もCircleCIを利用しています

CircleCIにてADD PROJECTS

f:id:seike460:20180519211230p:plain

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

f:id:seike460:20180519211919p:plain

f:id:seike460:20180519211943p:plain

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

Scrutinizer導入

Scrutinizerにて Add Repository

f:id:seike460:20180519212027p:plain

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

f:id:seike460:20180519212124p:plain

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

f:id:seike460:20180519212205p:plain

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リンクを押下するとコピペする内容がわかります

f:id:seike460:20180519212350p:plain

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