ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

友人とOSSを作っている

まだ1st releaseまでこぎついてないので、キリのいいところでまたエントリーを書こうと思うけど、とりあえず今の段階で文章を書きたくなったので何か書く。

Go言語で、gitのsquashを自動化するCLIツールを作っている。

自分はよく、ブランチを切って、WIPでPR出して、CIが通るまでオラオラと修正を続けて、最後にコミットをまとめてPRのWIPをはずす、という方法で(業務でも)開発することが多い。そのときのsquashするためにrebaseしてエディタを開いてpickをsなりfなりに変更するのがめんどくさい、というのがモチベーションだ。

その友人とは、先月あたりから一緒に開発をしていて、その前は彼が練習用に作ったJavaのアプリを彼が借りたVPS上にCI/CDの整備と監視のお手伝いをした。Docker化したり。

で、第二弾としてサービスじゃなくて何かツール作りませんか、ということで今回。

現職では「できない」「失敗した」の連続で、「わからない」「だけどやらなきゃ」そして「また失敗した」「迷惑かけた」のループの中ですっかりメンタルが憔悴していて、業務外の自主学習も一切止まってしまった。そんな中、友人との開発ではちゃんと貢献できるので、それでなんとか自尊心を保っている感じだ。感謝。

ちゃんと(?)したOSS開発をしたことも、contributionしたこともないので、コードを書いて、それなりに動きそうなモノができそうなのは楽しみだ。現職にならってissueでネタを貯めたり議論して、PRで修正出す。英語で。というOSS開発ではもちろん当たり前だが、そういうことも実践できているのは、現職での経験のおかげだ。

この友人は大学の友人で、何年か前も一緒に作ろうとしたが、途中で頓挫してしまった。(細かい理由は忘れてしまった)だけど、今それなりにうまく続いているのは、タイミングというのもあるだろうが、お互いの技術力が当時よりは向上したとか、OSS開発のやりかたみたいなのをなんとなく身についたとか、そういうところがあると思っていて、強くなって再開した感があってなんだかうれしい。

学びや気づきはあって。開発に割ける時間がバラバラなので、テストや本体実装の大きな変更が、相手の開発に影響を与えたりしてよくないので、リズムとPRの単位に関しては適切じゃないシーンがぼちぼちあって反省だったり。 この規模で、わりとはやく出したい!というモチベーションが高い中で、PRが溜まってしまうと相手がbranchを切った時点での状態と乖離してしまってマージにrebase & conflict解消が必要でダルいとか。

悪いところだけじゃなくて、最初はVScodeのLiveShare機能を使って、リモートペアプロで最初のinitialなcommitまでを一緒にやれたのはすごいよかった。これ、週1ぐらいで何か1つの機能を作るとかやればよかったね。

と、まだ作り終えてないのに振り返りみたいなことをしてしまったが、はじめての経験なので完成が楽しみだ。

2018年7月振り返り

blog.chaspy.me

といっても、7月は全然目標達成できていない。あんまりまじめに振り返るつもりはないが、一筆書いておく。

前半はちょいちょいブログを書いてるように、また開発合宿とか言ってるぐらいなのでまだよかったが、後半はメンタルがしんでいた。

今はもっとも底にある状態からは少しはあがってきて、なんとか浮上できそうな感じなのでこうやって文を書いている。

認知の歪みが起きていた。

大好きな読書もしていなければ、ブログを書いたり、空いてる時間で技術学習もまったくしなかった。ひたすら止まらない歪んだ認知のループに、言い聞かせてなんとか暴走しないようにするので精一杯だった、という感じ。

8月は特に目標を立てずにいこうと思う。まずは、通常営業、いつものペースを取り戻す。

そのためには好きなことをしなきゃね、やっぱりね、と思っている。いや、それができなかったんだろーがって感じだけど。今は大丈夫。

ゆっくり、少しずつ、進もう。

helm installで"Error: no available release name found"

何が起きたのか

deisをサクっと試すのにチュートリアルをやっている。

Install Workflow - Deis Workflow Documentation

で、GKEのクラスタを準備して、helmをいれて、さぁdeisをdeployすっぞーというタイミングでエラー。

$ helm install deis/workflow --namespace deis
Error: no available release name found

解決策としてはこのへん

github.com

でやってみる

$ kubectl create serviceaccount --namespace kube-system tiller
serviceaccount "tiller" created
$ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
clusterrolebinding "tiller-cluster-rule" created
$ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
deployment "tiller-deploy" patched

$ helm init --service-account tiller
$HELM_HOME has been configured at /Users/take/.helm.
Warning: Tiller is already installed in the cluster.
(Use --client-only to suppress this message, or --upgrade to upgrade Tiller to the current version.)
Happy Helming!

成功。

$ helm install deis/workflow --namespace deis --set global.use_rbac=true
NAME:   austere-mongoose
LAST DEPLOYED: Mon Jul 23 01:59:04 2018
NAMESPACE: deis
STATUS: DEPLOYED

RESOURCES:
==> v1/Secret
NAME                   TYPE    DATA  AGE
minio-user             Opaque  2     3s
deis-router-dhparam    Opaque  1     3s
objectstorage-keyfile  Opaque  2     3s

==> v1/ConfigMap
NAME                  DATA  AGE
dockerbuilder-config  2     3s
slugbuilder-config    2     3s
slugrunner-config     1     3s

==> v1beta1/RoleBinding
NAME                   AGE
deis-builder           3s
deis-monitor-telegraf  3s
deis-router            3s

==> v1/Service
NAME                    TYPE          CLUSTER-IP    EXTERNAL-IP  PORT(S)                                                   AGE
deis-builder            ClusterIP     10.7.250.176  <none>       2222/TCP                                                  3s
deis-controller         ClusterIP     10.7.253.248  <none>       80/TCP                                                    3s
deis-database           ClusterIP     10.7.254.205  <none>       5432/TCP                                                  3s
deis-logger             ClusterIP     10.7.249.24   <none>       80/TCP                                                    3s
deis-minio              ClusterIP     10.7.251.113  <none>       9000/TCP                                                  3s
deis-monitor-grafana    ClusterIP     10.7.250.120  <none>       80/TCP                                                    3s
deis-monitor-influxapi  ClusterIP     10.7.245.126  <none>       80/TCP                                                    3s
deis-monitor-influxui   ClusterIP     10.7.248.97   <none>       80/TCP                                                    3s
deis-nsqd               ClusterIP     10.7.251.253  <none>       4151/TCP,4150/TCP                                         3s
deis-logger-redis       ClusterIP     10.7.255.161  <none>       6379/TCP                                                  3s
deis-registry           ClusterIP     10.7.245.229  <none>       80/TCP                                                    3s
deis-router             LoadBalancer  10.7.247.6    <pending>    80:30737/TCP,443:30975/TCP,2222:32153/TCP,9090:30151/TCP  3s
deis-workflow-manager   ClusterIP     10.7.246.247  <none>       80/TCP                                                    3s

==> v1/ServiceAccount
NAME                   SECRETS  AGE
deis-builder           1        3s
deis-controller        1        3s
deis-database          1        3s
deis-logger-fluentd    1        3s
deis-logger            1        3s
deis-minio             1        3s
deis-monitor-telegraf  1        3s
deis-nsqd              1        3s
deis-registry          1        3s
deis-router            1        3s
deis-workflow-manager  1        3s

==> v1beta1/ClusterRole
NAME                      AGE
deis:deis-builder         3s
deis:deis-controller      3s
deis:deis-logger-fluentd  3s
deis:deis-router          3s

==> v1beta1/ClusterRoleBinding
NAME                      AGE
deis:deis-builder         3s
deis:deis-controller      3s
deis:deis-logger-fluentd  3s
deis:deis-router          3s

==> v1beta1/Role
NAME                   AGE
deis-builder           3s
deis-monitor-telegraf  3s
deis-router            3s

==> v1beta1/DaemonSet
NAME                   DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR  AGE
deis-logger-fluentd    2        2        0      2           0          <none>         3s
deis-monitor-telegraf  2        2        0      2           0          <none>         3s
deis-registry-proxy    2        2        1      2           1          <none>         3s

==> v1beta1/Deployment
NAME                   DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
deis-builder           1        1        1           0          3s
deis-controller        1        1        1           0          3s
deis-database          1        1        1           0          3s
deis-logger            1        1        1           0          3s
deis-minio             1        1        1           0          3s
deis-monitor-grafana   1        1        1           0          2s
deis-monitor-influxdb  1        1        1           0          2s
deis-nsqd              1        1        1           0          2s
deis-logger-redis      1        1        1           0          1s
deis-registry          1        0        0           0          1s
deis-router            1        0        0           0          1s
deis-workflow-manager  1        0        0           0          0s

==> v1/Pod(related)
NAME                                    READY  STATUS             RESTARTS  AGE
deis-logger-fluentd-2nzb5               0/1    ContainerCreating  0         3s
deis-logger-fluentd-tdr9q               1/1    Running            0         3s
deis-monitor-telegraf-4flv9             0/1    ContainerCreating  0         3s
deis-monitor-telegraf-sscpr             0/1    ContainerCreating  0         3s
deis-registry-proxy-97cgs               0/1    ContainerCreating  0         3s
deis-registry-proxy-j2k2s               1/1    Running            0         3s
deis-builder-55bbd946bd-9srb5           0/1    ContainerCreating  0         3s
deis-controller-59c948dbd4-k7hxq        0/1    Pending            0         3s
deis-database-5875dcff85-6cl6t          0/1    Pending            0         3s
deis-logger-7445666f95-8w9wq            0/1    ContainerCreating  0         2s
deis-minio-64454c6bf6-cvpch             0/1    Pending            0         2s
deis-monitor-grafana-77d54db485-rdq48   0/1    Pending            0         2s
deis-monitor-influxdb-5fb56d489c-zn4c5  0/1    Pending            0         1s
deis-nsqd-649fbc4947-tjcwr              0/1    ContainerCreating  0         1s
deis-logger-redis-7fcc95cc5d-977tm      0/1    Pending            0         1s
deis-registry-554c5569db-zxcgb          0/1    Pending            0         0s
deis-router-98ccf5c64-466r5             0/1    Pending            0         0s

何をしたのか

そういえばhelm initを最初にしたときにこう言われている。

$ helm init
Creating /Users/take/.helm
Creating /Users/take/.helm/repository
Creating /Users/take/.helm/repository/cache
Creating /Users/take/.helm/repository/local
Creating /Users/take/.helm/plugins
Creating /Users/take/.helm/starters
Creating /Users/take/.helm/cache/archive
Creating /Users/take/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /Users/take/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

TillerというHelmのServer側にあるコンポーネントは既にGKE上にインストールされてるよ。デフォルトだとallow unauthenticated usersを認めてないんよ。と言ってる。

やり方公式に載ってました。

github.com

Service Accountはkubernetesの認証方式の1つ。作成したservice accountにはsecretも一緒に作成されて、そのtokenを使ってclientはpodへアクセスすることができる。今回helm initで使うservice accountを明示することで、podのdeployが許可されたのだろう。

参考

qiita.com

⎈ Happy Helming!⎈

入社して一ヶ月

blog.chaspy.me

blog.chaspy.me

これまでと同じくシュっとかく。しっかりは書かない。

9末に向けて、1ヶ月を振り返りつつ、目標設定もしたので感情をつらっと書いておく。

できることが少し増えて、できないことがこんなにある、ということが現実味を帯びて迫ってきている感じで、なかなかしんどい。

一方で、(想像はしてたにせよ)扱うシステム・インフラの(まだ知らないが故だが)膨大さに、理解のスピードが追いつくかは不安である。自分自身のコーディング/インフラスキルに対する不安もある。 とはいえ、そもそもソフトウェアエンジニアリングそのものが不安との戦いだとすら僕は思っているので、そういうものだと思ってやるしかないのはわかっている。


変わらない不安は、やっぱり自分ができること、自分ができるスピード、自分が知ってること、自分のことばかりだ。チームにはどうやって勝つねんみたいな強いひとばかりだが、焦らずやっていこうと言い聞かせる他ない。

このへんの不安が確信になった感じ。

まぁやるしかないのは変わらない。日々自己否定を頑張って無視している。

目下の課題はこのへん

  • 英語
    • 仕事の大半は英語なので、読み書きのスピードが仕事のスピードとほぼイコールになる。読んだ結果が間違ってれば誤認識になるし、書いたものが伝わらなければチームメンバーに対して余計なオーバーヘッドをかける。話す聞くの前にまず読む書くをトレーニングしないとまずい。
  • キーボード
    • これまでサボってきたのが悪いが、キーボード、ターミナル操作が遅い。毎日1つずつスピードアップのために何か覚える、とかやったほうが良さそう。pecoが超絶便利なのでなるべく組み合わせて、aliesにコマンド化していれる、などしている。vimとかtmuxとかショートカットキーとか、テクさがまだ足りない。
  • 新しいことの学び方
    • 永遠のテーマみたいなテーマだが、未知へのハックの仕方が悪い。何年エンジニアやってんだって話だけど(いやたった4年か。。。とか言って励ますけど)わからないことをわかる能力というか。何言ってんだ。今やっているのはとにかく言語化。何がわかったのか、何がわかってないのか、問いは何か、その問いの答えは何か。これを愚直に繰り返す。あとは図にする。のろまでもこれを繰り返すしかない。このへんは改善のアクションが自分で浮かんでない。見つめ直しが足りないのかも。

目標は、自分で見つけ出して改善を週に2つできるようになろう、ということになった。改善そのものは好きだし、大切だし、得意だと思うけど、改善をするためには現状を「わかって」いないとできない。なかなかいい目標設定をするなぁ、とボスに感心。

あとは、仕事をコントロールしている感がない。散らかっているというか。このへんは抜け出したい。

  • 業務依頼
    • やったあと復習
  • 中期的にやる業務
  • 新しく何かを覚える
  • わからないことの整理

このあたりがぐちゃぐちゃ。週報、月報、振り返りをうまくやって足場を固めたい。

次は「入社して三ヶ月」に書く。そのときに上記の課題や、今回立てた目標がどうなっているかをまた振り返りたい。

勉強会行くのやめる

勉強会は(少なくとも参加者である限りは)得られることは「知ること」であり、「できること」ではない。「できること」が一切ない今、「知ること」を優先させるのは時間の使い方として得策ではない、というだけ。

主催のクローズド勉強会以外はしばらくおやすみしようと思う。

自分自身のタイミングの問題であり、言うまでもないけど勉強会文化を否定するわけでもないし、むしろ感謝ばかり。

直近は(半分仕事だけど)明日のStudySapuri Product Meetup、あとは個人的に思い入れのあるJTF2018は行く。9月のbuilderscon tokyo 2018、チケット勢いで買っちゃってたけど平日だしいかないかも。5000円寄付。

techplay.jp

2018.techfesta.jp

builderscon.io

さ、特のり弁分走ろ。

NginxをAWS上で作って壊す「Nginx Up and Running」0.2.0をリリースした

趣味インフラ趣味プロジェクトなので勝手にリリースごっこをしているだけであります。

初回リリース時の記事はこちら。

blog.chaspy.me

何が変わったか

issue & PR

0.1.0まではガシガシmasterに向けてcommit & pushしてましたが、そのあとはissue & PRで、ちゃんとcommitやPRにはrefでissue情報を加えています。現職での仕事の仕方に習っています。

で、今回の変更をPRベースで振り返ります。

Testing on CircleCI

github.com

github.com

このリポジトリ、TerraformでAWS上にインフラ(EC2)を作ったあと、ansibleでNginxを作って、InfratasterでL7のテストをするというものです。CIでは何をするか悩みました。悩んだ結果、AWS上には実際にリリースせず、テストに絞ることにしました。

テストをするにしても、実際にAWS上にインフラを作るわけではないので、TerraformとAnsible/Infratasterの2つにわけました。

Terraformは単純にplanをしているだけなので、テストとしては少し甘いかもしれません。TerraformもCI時はlocal(?)に実行できる(?)とかあればいいんですが、わけがわからないので諦め。

次にNginxをinstallするansibleと、構築後のNginxに対してL7のテストを行うInfratasterですが、CircleCIで立ち上がるコンテナに対して、local実行することにしました。

もともと、AWSに対して実行するときも、作成したEC2インスタンスのpublic IPアドレスをhosts、spec/spec_hosts.rbに出力していたので、CI実行時はlocalhostに書き換えることで対応できました。

使うDocker Imageもどうしようか悩んだのですが、Ansibleが入ったイメージをFROMとし、rbenvをいれる部分はDockerfileを書きました。

https://hub.docker.com/r/chaspy/nginx-up-and-running/

あとはAWSのcredentialですが、環境変数に持たせることでCIでもAWSに対してデプロイするときでも動くようにしました。

CIも、テストもとても大事なので、今回ちゃんとできてよかった。

Embedding build status badges

github.com

バッジつけましたー。

CircleCI

Build nginx from source with ngx_mruby module

github.com

ngx_mrubyを使うには、Nginxをbuildするときに指定しないといけません。以前軽くvagnratで動かした時にinstallのshellは書いていたので、それをplaybookにかきおこすダルい作業をしていました。

Ansible、loginしないから/etc/profileとかにexport書いても読んでくれなくてPATHとおらねー!とか、shell moduleとcommand moduleで謎の挙動違いがあってNo such file or directoryになったりとかで無駄にハマったりしました。

あとngx_mrubyのお試しで無駄にfizzbuzzを返すようにしていて、そのテストをInfratasterで書きました。

今後Nginx / ngx_mrubyのconfigとテストをメインにどんどん書いていきたいので、その基盤ができてよかった。

Add Japanese Document

github.com

結局ほぼほぼREADMEに書いている内容と同じになってしまったが、今後増えて行くといいと思う。そんな思いでまずは簡単に書いた。

いつまで続くかわかんないですが、薄い本というか、NginxをAWS上で、CI/CDこみで動かしたい、そういう職場で働いている、キャッチアップしたいひとが、git cloneしてすぐに動かして試せる、学習用の技術書。。。のサポートリポジトリ、みたいなイメージで今回取り組んでいます。

まだまだ道半ばですが、v1.0.0の頃にはそれなりのボリュームのものになればいいなと思います。まだまだ中身もよくないところたくさんあるし、少しずつ直しつつ、ようやくCI/CDまわりの基盤となる部分や、必要ソフトウェアの導入まで終わったので、今後はようやく中身!って感じですね。

今後

さっきも言ったけどNginxでできること、ngx_mrubyでできることをconfigを書きつつ、Infratasterでテストも書きつつ、ドキュメントも書きつつ、っていうのを少しずつ進めて、コンテンツを増やしていきます。

おわりに

Vagrant版もつくろうかなーって思っている。というか以前作ったのがあるので移行する感じで。。。

github.com

Amazon-Linux "ami-cbf90ecb"でrakeが使えない

nginx + mrubyを動かそうとしたとき、CentOSではyumで入るrubyで動くが、EC2のamazon-linux "ami-cbf90ecb"ではrakeが動かない。ngx_mrubyをbuildしようとしたときのことだ。

[ec2-user@ip-10-1-1-67 ngx_mruby]$ ruby --version
ruby 2.0.0p643 (2015-02-25) [x86_64-linux]
[ec2-user@ip-10-1-1-23 ~]$ rake
-bash: rake: command not found

なんでないんや

[ec2-user@ip-10-1-1-23 ~]$ ls -la /usr/bin/rake
lrwxrwxrwx 1 root root 22 Jul 15 09:55 /usr/bin/rake -> /etc/alternatives/rake

おっあるやん

[ec2-user@ip-10-1-1-23 ~]$ ls -la /etc/alternatives/rake
lrwxrwxrwx 1 root root 16 Jul 15 09:55 /etc/alternatives/rake -> /usr/bin/rake2.0

ほう

[ec2-user@ip-10-1-1-23 ~]$ ls -la /usr/bin/rake2.0
ls: cannot access /usr/bin/rake2.0: No such file or directory

なるほど

で、なんか2.4はあるのね

[ec2-user@ip-10-1-1-23 ~]$ ls -la /usr/bin/rake2.4
-rwxr-xr-x 1 root root 1185 Aug 18  2017 /usr/bin/rake2.4

結論

symlinkはりなおそ

[ec2-user@ip-10-1-1-23 ~]$ sudo rm /etc/alternatives/rake
[ec2-user@ip-10-1-1-23 ~]$ sudo ln -s /usr/bin/rake2.4 /etc/alternatives/rake
[ec2-user@ip-10-1-1-23 ~]$ rake --version
rake, version 12.0.0

/etc/alternative/rakeって何

せっかくなので軽くググる

なるほどー、symlinkでバージョンを切り替えるのをサポートするalternativeというのがあって、なんことやらrakeは2.0の実態がなくなって2.4しかない状態になっていた感じね。

じゃalternative使って2.4向けてやればよかったのね

(再)結論

rubyを2.4に切り替えてやればいい

alternativesコマンドで確認したところ、rakeはない。

[ec2-user@ip-10-1-1-227 ~]$ sudo alternatives --display rake

rubyはなんやかんやでて、2.0と2.4をサポートしてそうな雰囲気。

[ec2-user@ip-10-1-1-227 ~]$ sudo alternatives --display ruby | grep ruby
ruby - status is auto.
 link currently points to /usr/bin/ruby2.0
/usr/bin/ruby2.0 - priority 2000
 slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.0.pc
 slave ruby.1: /usr/share/man/man1/ruby2.0.1.gz
/usr/bin/ruby2.4 - priority 243
 slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.4.pc
 slave ruby.1: /usr/share/man/man1/ruby2.4.1.gz
Current `best' version is /usr/bin/ruby2.0.

切り替える。

[ec2-user@ip-10-1-1-227 ~]$ ruby -v
ruby 2.0.0p643 (2015-02-25) [x86_64-linux]
[ec2-user@ip-10-1-1-227 ~]$ sudo alternatives --config ruby

There are 2 programs which provide 'ruby'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/ruby2.0
   2           /usr/bin/ruby2.4

Enter to keep the current selection[+], or type selection number: 2
[ec2-user@ip-10-1-1-227 ~]$ ruby -v
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-linux-gnu]

[ec2-user@ip-10-1-1-227 ~]$ rake --version
rake, version 12.0.0

おしまい。