くりにっき

フルスタックキュアエンジニアです

プリッカソン8でえもいwebhookを作った #prickathon

prickathon.connpass.com

えもいwebhookとは?

emoji notify webhook、略してemoy(えもい)webhookです

何番煎じか分からないですがSlackにemojiが登録された時に通知するwebhookです

f:id:sue445:20190721224711p:plain

リポジトリ

github.com

技術的なこと

のいつもの感じです

特徴

  • emojiを1つ登録しただけなのにたまに2回webhookが飛んでくることがあるのですが、Slack通知はなるべく最初の1回だけになるようにしてます
    • memcachedで通知を5分間キャッシュしてるだけなので完全に同時にリクエストがくると無理
  • emojiのaliasも判別(冒頭のスクショ参照)
  • Deploy to Herokuボタンに対応してるのでHerokuのアカウントさえあれば1クリックでデプロイできます

f:id:sue445:20190721225132p:plain

スライド版

esa-pages.io

【追記あり】Docker Hubのrubyイメージで急にbundle installできなくなった時の対応

tl;dr;

export BUNDLE_PATH__SYSTEM=false をつける

あらすじ

会社で 今日のアニメボット を動かしているんですが、7/11夕方までは動いていたのに7/12分から急に動かなくなる現象になりました

エラー内容

+ bundle install --jobs=4 --retry=3 --path=vendor/bundle --gemfile=Gemfile --clean --without development
Using a custom path while using system gems is unsupported.

path:
Set for your local app (/usr/local/bundle/config): "vendor/bundle"

path.system:
Set via BUNDLE_PATH__SYSTEM: true

disable_shared_gems:
You have not configured a value for `disable_shared_gems`

コードの変更点は無いのでDocker Hubのイメージ( https://hub.docker.com/_/ruby/ruby:2.6-slim )に変更があったことはすぐに分かりました。

修正方法

環境変数

export BUNDLE_PATH__SYSTEM=false

をつければbundle installできるようになりました

CircleCIの場合

.circleci/config.yml に下記を追記

environment:
  BUNDLE_PATH__SYSTEM: "false"

GitLab CIの場合

.gitlab-ci.yml に下記を追記

variables:
  BUNDLE_PATH__SYSTEM: "false"

対応PR

github.com

追記:2019/7/13

BUNDLE_PATH__SYSTEM=true するやつがrevertされたので新しくimageをpullし直せば大丈夫そうに見える。(まあCIサーバだと自分でコントロールできないので BUNDLE_PATH__SYSTEM=false 固定でいいかもしれないけど)

github.com

Code Climate Test Reporter用のCircleCI Orbsを作った

https://circleci.com/orbs/registry/orb/sue445/codeclimate

github.com

経緯

自分のリポジトリ.circleci/config.yml にあった野良commandをコピペ運用するのが嫌だったというのと、既存のCode Climate系のOrbsを探した時にいいのがなかったのでOrb化しました

使い方

version: 2.1

orbs:
  codeclimate: sue445/codeclimate@x.y.z

jobs:
  test:
    environment:
      CC_TEST_REPORTER_ID: YOUR_CODE_CLIMATE_REPORTER_ID
  
    steps:
      - checkout
  
      - codeclimate/with-cc-test-reporter:
          after_build_args: "--coverage-input-type simplecov"
  
          steps:
            - run: bundle exec rspec

Orbでやってること

Code Climate Test Reporter を使う時は

  1. バイナリをダウンロード
  2. ./cc-test-reporter before-build を実行
  3. 任意のテストコマンドを実行
  4. ./cc-test-reporter after-build を実行

という流れなのですが、3以外の部分を codeclimate/with-cc-test-reporter の中に隠蔽しています。

小ネタ

commandのparameterの steps typeを使うとRubyでいうところのブロックを使ったサンドイッチメソッドのようなリファクタリングができて割と便利

https://github.com/sue445/circleci-orb-codeclimate/blob/0.1.0/src/commands/with-cc-test-reporter.yml#L4-L7

awscli-allを作った

awscli-allについて

awsのクライアント全部入りのDockerイメージです

https://hub.docker.com/r/sue445/awscli-all/

github.com

作った理由

CIから AWS SAM のデプロイをしたかったんですが、AWSは公式のDockerイメージを提供しておらず、かといってCIで普通にインストールしようとすると pip install awscli aws-cli-sam だけで1分くらいかかるし、Docker Hubを見てもあまりメンテされてないのがほとんどだったのでイラッとしたので自分で作りました。

Docker Hubをaws cliで検索すると似たような名前のイメージがたくさんあって埋もれそうなので、せっかくなのでAWSの公式クライアント全部入りって感じでawscli-allという名前にしました。

全部入りにするために https://github.com/awshttps://github.com/awslabsリポジトリを調べたんですが、awscliとaws-cli-samの他はecs-cliしかなくて意外に少なかったという感想。

余談1

https://github.com/aws/aws-cli/issues/3291 がクローズされてるのでAWSは公式のDockerイメージを作る気は無い模様。こうやって野良イメージが増えていくんやなぁ(遠い目)

余談2

この手の野良イメージは全然メンテされずに古くなっていくのが常ですが、awscli-allを含めて僕がメンテしてるDockerイメージは全部CircleCIで定期ビルドして新しいバージョンが出たらtagをpushして全自動で新しいイメージをリリースしているので、CircleCIが死なない限りは勝手にイメージがリリースされていくので安心してください。

2020/10/28追記

awscli v2であれば公式のDockerイメージが提供されてるのでそれを使うといいと思います。(samとか他のパッケージは入ってないけど)

docs.aws.amazon.com

hub.docker.com

rubicure v1.2.1で平成&令和対応をした

先日 スター☆トゥインクルプリキュア でキュアコスモが発表されました

下記のツイートを見てrubicureで令和対応の需要を感じて対応しました

GitHub

サンプル

Rubicure::Girl#heisei? and Rubicure::Girl#reiwa?

Rubicure::Girlheisei?reiwa? メソッドが生えて、平成プリキュアなのか令和プリキュアなのか容易に判別できるようになりました

>> Cure.star.heisei?
=> true
>> Cure.star.reiwa?
=> false

まだ実装は何もないですが、 Cure.cosmo.reiwa?true になります(します)

Rubicure::Series#heisei? and Rubicure::Series#reiwa?

Rubicure::Series にも同様に heisei?reiwa? が生えています。

ここで注意点ですが、スター☆トゥインクルプリキュアは平成プリキュアでも令和プリキュアでもあるので *1Precure.star_twinkle.heisei?Precure.star_twinkle.reiwa? は両方 true が返るようになっています。

>> Precure.hugtto.heisei?
=> true
>> Precure.hugtto.reiwa?
=> false

>> Precure.star_twinkle.heisei?
=> true
>> Precure.star_twinkle.reiwa?
=> true

*1:あくまで自分の現時点での見解なので、公式からスタプリは平成(令和)プリキュアではないという見解が発表されたらrubicureでも追従します

gitlabci-bundle-update-mr v0.3.0をリリースした

gitlab.com

changelog

https://gitlab.com/sue445/gitlabci-bundle-update-mr/blob/master/CHANGELOG.md#v030

v0.3.0の新機能

GitLab CIが他のCIと比べて優れてる機能の1つにMerge when pipeline succeeds(CIが通ったら自動でMergeRequestをマージする)があるのですが、gitlabci-bundle-update-mrでも対応しました

f:id:sue445:20190504202355p:plain

bundle updateのMRは作りたいけど各gemのchangelogを読むまでもないような雑なアプリの場合だといちいちAcceptボタンをポチるのも面倒だと思うので、API経由でMerge when pipeline succeedsを有効にするようにしました

gitlabci-bundle-update-mr --merge-when-pipeline-succeeds

のように --merge-when-pipeline-succeeds を渡すことで有効になります。(デフォルトだとOFF)