つばくろぐ @takamii228

知は力なり

2019年にお金を払ったサービス

ふとTLに流れてきたので、やってみた。

増税があったりドルが混ざってたり月額年額が混ざってたりと費用はどんぶり勘定です。

新規

マネーフォワードME 5300円 / 年

今までスプレッドシート運用だったけどクレカ明細やキャッシュレス、PASMOとかの中まで把握・管理できるのよい。品目別に分析するの楽しい。

takamii.hatenablog.com

Apple Developer Program $99 / 年

仕事でモバイルアプリ開発やることになって、自分で実機に入れたりしたくなったので勉強用。正確には以前登録して更新しなかったのを復活させた。

継続

Amazon Prime 4900円 / 年

値上がりつらい。

Google Drive 100GB 2500円 / 年

主にGoogle Photo用。DropBoxはもう全く使わなくなった。まだ半分以上空いている。

dマガジン 440円 / 月

今年もお世話になった。コスパいい。

To Me Card 2200円 / 年

オートチャージ用。普通に使って元が取れることがわかった。

takamii.hatenablog.com

日本経済新聞Wプラン 5900円 / 月※

実家と折半。実家で紙の購読辞めるって言ったら電子版プランに変える。

IntelliJ IDEA Ultimate Personal 13600円 / 年

2年目なので。来年はもうちょっと安いらしい。

Evernote Plus 3100円 / 年

バイスがいっぱいあるので課金。ただ最近あまり使わなくなってきたなぁという印象。

お名前.com 1390円 / 年

個人ドメインの維持のため。

解約

Wi2 390円 / 月

使わなくなったので。テザリングでよくなった。

青山カード 1350円 / 年

クレカ整理のついでに解約した。自動音声で解約できた。

2019年の振り返り的な何か

今年もざっくり振り返ろうと思う。2018年の記事はこちら。

takamii.hatenablog.com

2019年にできたこと

AWS SAを取る

2月に取った。

takamii.hatenablog.com

GoをJava/PHPと同じくらい書けるようになる

シェルスクリプトではやりきれないやつをGoでサクっとかけた。ただ使ってないと文法忘れるので意識的に書かないと忘れそう。

Firebase + iOS or Android or JSで何か作る

仕事がモバイルアプリ開発になったので、Flutterでサンプルアプリを作ったりできた。

GCPAWSくらいできるようになる

GCPのquicklabのキャンペーンを全部埋めてk8sTシャツもらった。

PHP以外のフロントエンド開発(html/css/jsとかブラウザとか通信とか)の設計がわかるようになる

モバイルアプリの設計めっちゃやってる(できるとは言ってない)。フロントエンドの状態管理の設計めっちゃ難しい。けどできるようになりたい。

外部イベントの運営・ボランティアスタッフをやる

DevOps Days Tokyo 2019のボランティアスタッフとXP祭りの運営をお手伝いした。運営サイドから見える景色もいいものですね。

JAWS-UGのアーキ支部でCI/CDに関して議論できたのもよかった。

jawsug-arch.connpass.com

ブログを最低月一回投稿する

9月はすべりこみだったけど、なんとか月1ペースで投稿できた。

f:id:takamii228:20191231151510p:plain

競技プログラミングを再開する

再開できた。

takamii.hatenablog.com

8月まではコンスタントにコンテスト参加できてたけど、9月以降は多忙 & レート下がり恐れからサボり気味になった。ちなみにPASTは初級でした。しょぼい。精進したい。

f:id:takamii228:20191231151839p:plain

2019年にできなかったこと

Spring Bootでアーキテクチャ設計できるようになる

SprintBootを1.xから2.xにするのをちょろっとやって以来、一切触らなかった。忘れてそうなのでどっかでリハビリしたい。

英語学習を復活して少なくともTOEICスコア(785)を更新する

765だった。勉強しないとスコアは上がらないらしい。

半分できて、半分できなかった。

3年後、5年後の自分の仕事・人生の具体的なイメージを持つ

今年の主な仕事がモバイルアプリ開発だったので、これでネイティブアプリ・Webフロント・サーバサイド・AWSと一通り触ったことになったので良かった。あとやってないのはコンテナ・k8sくらいかな。

今年は一人称でCI/CDおじさん業をやってのけたので、この領域にはだいぶ力がついたなぁという気持ちにもなった。

ただ一通りやってみて、開発のコアになるシステムやアプリをどういう作りにするといいのかという設計に関して、周りをリードできる力がないと痛感したので、設計の領域でもっと精進したいと思った。

あとチーム開発をどううまく回すか的なエンジニアリングマネージャー業にもスクラムのプラクティスの延長で興味関心があるので、うまく業務の中で試行錯誤できたらいいなと思った。

その一方でできてないと思う点は、会社の枠を越えて自身の人生においてどう生きていくか、考えたけど結局行動に移せなかったから。

いろいろ見たけど、うーんという気持ちで結局コンフォートゾーンから抜け出さなかった。

この辺はもうちょっと言語化と情報収集を継続して頑張りたい。

主なアウトプット

GitLabとFlutterがメインだった。

GitLab CI使ってFlutterのCI/CDパイプラインを作った話をどっかでアウトプットしたいお気持ちなので年始頑張ろうと思う。

GitHub

特に何か公開しているわけではないけど。

takami228 (Masanori Takami) · GitHub

f:id:takamii228:20191231171558p:plain

振り返り

↑も合わせて、2019年を振り返ってみた。

良かったこと・できたこと
  • 未経験・新しい技術に対して学ぶ姿勢が継続できていること
  • 月1ブログ投稿が継続できていること
  • コミュニティ活動の運営側に関われたこと
  • 競プロが再開できたこと
  • ISUCONに初参加できたこと
  • Jira Cloud / Confluence Cloudで情報管理できていること

やっぱり目標があると前にすすめるのでよい。前に立てた目標の半分くらいは達成できた。

ISUCONは初見殺し感はあってボロボロだったけど楽しかった。来年も出たいなぁ。

あとAtlassianのツールが無料で使えるようになったのは大きい。ちょっとしたメモをConfluenceに集約できるし、読書や目標管理にJiraが使える。

良くなかったこと・できなかったこと
  • 積読やWIPの本が残ってるのに新しい本を買ってしまったこと
  • 1回しか外部発表できなかったこと
  • 働きすぎたこと
  • 働きすぎて?体調を崩しそうになったこと
  • 3年後、5年後の自分の仕事・人生の具体的なイメージを持つことを先送りにしたこと

本を買いすぎて、家のスペースを圧迫しだした。ちゃんと読んで手元に置くものとそうでないものを種別したい。

夏あたりからちょっと働きすぎてしまった。ちょっとハイになっていたところもあったかもしれない。最近突発的に目眩が起きて辛い思いをした。

やはり健康第一なので、食事・運動・睡眠には注意したい。

2020年の抱負的な何か

いくつできるかわからんけど、今年もとりあえず書いてみる。

  • AWS SA Pro or DevOps Proを取る
  • GCP Professional Cloud Architectを取る
  • TOEICスコア(785)を更新する
  • AtCoderで緑キープ & レート1000になる
  • PASTで中級になる
  • ISUCONに出る(開催されれば)
  • フロントエンドの設計を理解する
  • いわゆるアーキテクト業を自信を持って遂行でき、自分の色を出せるようになる
  • いわゆるエンジニアリングマネージャー業を自信を持って遂行でき、自分の色を出せるようになる
  • CI/CD関連できちんと言語化してなんかアウトプットする
  • 3年後、5年後の自分の仕事・人生の具体的なイメージを持つ
  • 健康を維持・推進する

2020年はいくつできるかな、頑張ろう。

最後に、去年はこんなことを書いていた。

社会人歴5年目だけどまだまだ自分がこれから進みたい方向性はぶれてるので、いろいろつまみ食いしながらレベル上げしたいと思ってる。 けどいろんなところに顔つっこみ過ぎている感もあるし時間は有限なので、かけるべき時間と期限を決めてうまくやっていこうと思う。

今年は社会人6年目で、いろいろ区切りがいいなーと思ってた。小学校6年、中学・高校6年、大学・大学院6年。 年齢はアラサー。何か環境を変えるようなことをしようかなと思ったけど、行動には移さなかった。このままズルズルいくのもアレなので、人生のマイルストーンを真剣に考えねば。

でもまだまだ霧の中を歩いているような気分なので、2020年もいろいろつまみ食いしながらレベルアップしていこうと思う。

flutterのバージョンをGitLab CI Runner上で動的に切り替える

この記事はFlutter Advent Calendar 2019 (#2)の記事です。

※12/21 8時時点で18日分に空きがあったので埋めさせていただきました(参考

はじめに

GitLab CIを使ってFlutterのCI/CDをやっているのですが、CI環境において複数のFlutterのバージョンを管理する必要があり、少し悩んだので以下にまとめます。

GitLab CI Runnerは以下のような感じで、shellモードでMac mini上で動かしています。

f:id:takamii228:20191220225237p:plain

今回、Flutterのバージョンアップの検証が必要になったのですが、すでに配信中のアプリで利用しているFlutterのバージョンに対してはバージョンアップが完了するまでの間に緊急パッチを宛てる可能性があります。そのため、緊急パッチのビルド時につかうFlutterのバージョンと、バージョンアップ検証で使うFlutterのバージョンをそれぞれのビルドで使い分ける必要があります。

検討した解決策

CI環境上で複数のflutterのバージョンを動作させる方法として、以下の2つ案を考えました。

  1. 配信版と追加開発をブランチを分けて、ブランチごとに固定のGitLab CI Runnerを割り当てる
  2. GitLab CIの実行時に使うバージョンを動的に切り替えられるようにする

メリット・デメリットは以下の通りです。

メリット
デメリット
案1
  • 要件を満たすことができる
  • 各バージョンを設定したCI Runnerに対応するブランチの命名規則を決める必要がある
  • .gitlab-ci.ymlの設定が煩雑になる。
  • 各CI Runnerに対して別々にバージョンの設定する必要がある
案2
  • 要件を満たすことができる
  • CI Runnerとブランチの命名規則を対応させる必要がない
  • .gitlab-ci.ymlの設定がシンプルになる
  • 各CI Runnerの設定を分ける必要がない
    • バージョンが変わる場合、CIの実行の度に都度バージョン切り替えの処理が走るためCIの実行時間が長くなる

    GitLab CIではCI Runnerにタグをつけることができ、tagonlyexcept等を記述することで特定のブランチのジョブを特定のCI Runnerで実行させる、という設定ができます。

    https://docs.gitlab.com/ce/ci/yaml/

    しかしデメリットで書いた通り、普段の開発においてはfetuareブランチやhotfixブランチを切ったりリリースタグを切ったりとブランチの命名規則を複数考慮してgitlab-ci.ymlを設定するのはなかなか骨が折れます。

    今回は設定が煩雑になることに加え、バージョンアップ版のリリースまでの移行期間のみ並行運用が走ること、また都度実行で増える実行時間が2-3分程度で待てるレベルであることを踏まえて2を選択することにしました。

    実装

    各ビルドで使うflutterのバージョンはpubspec.yamlに記載できるため、それを使ってflutterのバージョンを切り替えてからCIを実行するように.gitlab-ci.ymlを設定します。

    ...
    environment:
      sdk: ">=2.1.0 <3.0.0"
      flutter: 1.9.1+hotfix.6
    ...
    

    yamlから特定のキーの値を取得するのにはyqが使えます。

    yq.readthedocs.io

    pubspec.yamlに記載されたバージョンでflutterのversionを切り替えるシェルは以下のように記載できます。

    #!/bin/sh
    
    set -x
    set -e
    
    # get tagert flutter version
    TARGET_FLUTTER_VERSION=`cat pubspec.yaml | yq -r .environment.flutter`
    
    TARGET_FLUTTER_VERSION_TAG_NAME=v${TARGET_FLUTTER_VERSION}
    
    CURRENT_DIR=`pwd`
    FLUTTER_DIR=${HOME}/development/flutter
    
    cd ${FLUTTER_DIR}
    
    # current version
    flutter --version
    
    # flutter checkout
    git checkout -f master
    git pull
    git checkout -f ${TARGET_FLUTTER_VERSION_TAG_NAME}
    
    flutter precache
    
    flutter doctor
    
    # updated version
    flutter --version
    
    cd ${CURRENT_DIR}
    

    ポイントとしてはflutterのバージョンはpubspec.yamlにはvなしで記載されているのに対し、flutterのタグではvがついているためgit checkoutするときに付与する必要があります。

    flutter.dev

    flutterのバージョンの切り替えはflutter versionコマンドを使うこともできますが、これを実行するには対象のバージョンがあるchannelをflutter channelで事前に指定し、かつupgradeを実行して最新化しておく必要があります。

    最新化がされていなかったり、切り替えたいバージョンのchannelが異なっている場合はflutter versionコマンドは失敗してしまいます。

    $ flutter version -f v1.13.3
    There is no version: 1.13.3
    Unable to checkout version branch for version 1.13.3.
    

    なので、今回はflutterコマンドがインストールされている場所~/development/flutterに移動し、master上でpullして都度タグをcheckoutする方式を取るようにしました。

    チェックアウトした後はflutter precacheすることで依存するライブラリが落ちてきます。

    macOS install - Flutter

    最後に↑のシェルを.gitlab-ci.ymlbefore_scriptの中で実行するように設定すれば完成です。

    ...
    before_script:
      - ./set-flutter-version.sh
    ...
    

    似たような感じでxcode-selectすればXCodeのバージョンも指定できそうですね。

    gradle wrapperやmaven wrapperでのバージョン指定、Docker buildなどと同様にビルドさせる環境のツールのバージョンはgitレポジトリに定義含めてしまって、CIの実行の度に動的に変えられるようにしておくと管理が便利になりますね。

    あとはflutterのバージョン切り替えもDocker Buildみたいにキャッシュできたらいいのになー。