読者です 読者をやめる 読者になる 読者になる

GeekFactory

int128.hatenablog.com

Spring Security OAuth2のリトライを@Retryableで書く

Spring Security OAuth2のアクセストークン取得で接続失敗に対してリトライを行いたい場合、Spring Retryを使うと簡単に実現できます。 やりたいこと Spring BootのアプリでOAuth 2.0クライアントを利用する。 Spring Security OAuth2でアクセストークンを取…

Spring BootアプリのテストをSpockで書く(続編)

以前にSpring BootアプリケーションのテストをSpockで書く方法を紹介しましたが、この方法ではテストの所要時間が長くなる問題がありました。本稿では他の方法を紹介します。 int128.hatenablog.com 具体的には、インナークラスの @TestConfiguration でMock…

Spring BootでログやActuatorにバージョン情報を含める

ログやActuatorにバージョン情報を含めておくと、本番環境でどのバージョンのアプリケーションが実行されているか簡単に確認できるので便利です。 ビルド時にapplication.ymlにバージョン情報を含める Gradleでは、以下のようなビルドスクリプトを書くとappl…

ターミナルのウィンドウタイトルにホスト名などを入れる

zsh

久しぶりにzshネタです。 複数のタブを開いていろんなサーバにSSHしていると区別が付かなくなってきたので、ウィンドウタイトルに実行コマンド、ホスト名、カレントディレクトリを入れてみました。zshの組み込みコマンドだけで実現してみました。 function _…

Spring Security OAuth2でリクエストログを出力する

Spring Security OAuth2でアクセストークンのリクエストとレスポンスのログを出力するには、Apache HttpClientを使うと簡単です。 概要 Spring Security OAuth2のアクセストークン取得はRestTemplateを利用しています。 RestTemplateはデフォルトではHttpURL…

doma-spring-bootのSQL例外変換

doma-spring-bootを利用すると、Doma2の例外クラス(JdbcException)をSpring Transactionの例外クラス(DataAccessException)に変換してくれます。例外変換の仕様が明文化されていないようなので調べてみました。どこかにまとめてあったら教えてください。…

2016年の振り返り

2016年もお世話になりました。 概況 振り返り 仕事 Spring CloudとかSwaggerとかAWSとか触ってた。 JIRA, Confluence, Mattermost, ownCloud, GitBucket, Jenkins, Artifactory, SonarQubeとかをDocker Composeベースで開発基盤に導入してた。 上期は暇で、…

Jenkinsで自分でビルドしたGitコマンドを使う

Jenkins Agentで自分でビルドしたGitコマンドを使う方法を説明します。新しいバージョンのGitを使いたい場合に有用です。 方針 JenkinsにはGitやAntなどの外部ツールを管理する機能があります。 外部ツールが必要になった場合に自動的にインストールスクリプ…

Spring BootアプリのテストをSpockで書く

Spring BootアプリケーションのテストをSpockで書く方法を説明します。最近のバージョンを対象にしています。 Spring Boot 1.4 Spock 1.1-rc-3 Groovy 2.4 本稿では以下のテストレベルを対象とします。 コンポーネントテスト(依存コンポーネントをモックに…

FeignでOAuth 2.0クライアントを使う

RESTクライアントのSpring Cloud Netflix FeignでOAuth 2.0を使う方法を説明します。 @FeignClientのconfigurationでOAuth2FeignRequestInterceptorを設定する。 OAuth2FeignRequestInterceptorにクライアントIDやクライアントクレデンシャルを渡す。 具体的…

Feignでレスポンスボディによる例外処理を行う

REST APIクライアントのSpring Cloud Feignを使う場合に異常系のステータスコードをハンドリングする方法を調べたのでメモです。 デフォルトの振る舞い APIが400番台や500番台のステータスコードを返した場合、FeignはFeignExceptionをスローします。これは…

Jenkins PipelineでGitリポジトリにpushする

JenkinsのジョブでGitリポジトリにブランチやタグをpushしたい場合があります。Jenkinsfileでどのように実装するか調べてみました。 実装例 お急ぎの方は下記のコードを参考にしてください。 def userRemoteConfig = scm.userRemoteConfigs.head() withCrede…

Swagger YAMLのバリデーションをCIで回す

Swagger YAMLを書いていると間違いに気づかないことがよくあります。リポジトリにpushした時にJenkinsやCircle CIなどで構文チェックできるとミスを防げるます。そこで、GradleのプラグインにSwagger YAMLのバリデーションを追加してみました。 使い方 build…

Spring Bootで例外発生時にJSONを返す

Spring BootのREST APIサーバで例外発生時のエラー情報をJSONで返す方法を調べたのでメモです。 やりたいこと 例外が発生した場合は常にエラー情報をJSONで返したい。 例外の種類によってステータスコードを分けたい。例えば、バリデーションエラーが発生し…

Swagger Codegenにおけるspring-cloudテンプレートのカスタマイズ

Swagger Codegenではコード生成のテンプレートをカスタマイズできますが、ライブラリに spring-cloud を選んだ場合はカスタマイズの仕方に注意が必要です。 springのテンプレート構造は以下になります。 template/ api.mustache ←すべてのライブラリで共通の…

Spring Cloud Feignのステータスコードと例外

Spring Cloud Feignの例外を調べてみたのでメモします。 (11/22修正)Root Causeのスタックトレースしか貼り付けていなかったので、すべてのCauseに修正しました。 結果 エラーのステータスコードを受け取った場合、 feign.FeignException が発生します。 …

Gradle Swagger Generator Plugin 1.5.1 has been released

Gradle Swagger Generator PluginでSwagger UIを生成できるようになりました。 以下のビルドスクリプトで generateSwaggerUI タスクを実行すると、 build/swagger-ui フォルダにSwagger UIが出力されます。 plugins { id 'org.hidetake.swagger.generator' v…

Using env.BRANCH_NAME on Jenkins Multibranch Pipeline

Jenkins Multibranch Pipelineで、ビルドの契機となったブランチに応じて固有の処理を行いたい場合があります。例えば、masterブランチがpushされた場合のみテスト環境にデプロイするといった使い方が考えられます。Travis CIの TRAVIS_BRANCH 、Circle CIの…

開発チームがプロダクトコードを書き始めるまでに準備すること

頭の中を整理するため、いわゆるZero Feature Releaseに必要なことをまとめてみました。開発チームがプロダクトコードを書き始めるまでに作っておくとよいものです。 ソースコードリポジトリ(例:GitHub) エディタ設定(例:editorconfig) ビルドツール(…

Gradle Swagger Generator Pluginを公開します

GradleでSwagger YAMLからAPIサーバやAPIクライアント、APIドキュメントを生成するプラグインを作りました。 github.com もともとはGradle Swagger Codegen Pluginという名前でしたが、コードだけでなくドキュメントの生成もできるようになったので名前を変…

GradleからS3に成果物を公開する

GradleからS3に成果物を公開する方法を調べたのでメモです。あらかじめIAMユーザを作成し、キーを取得しておく必要があります。 S3 Maven Repositoryに公開する Gradleのmaven-publishプラグインを使うと、S3のMavenリポジトリに成果物を公開できます。詳し…

スクリプトコンソール上でSlaveでコマンドを実行する

Jenkinsのスクリプトコンソールを利用すると、Slaveで任意のコマンドを実行できます。具体的には、 RemotingDiagnostics.executeGroovy() メソッドを利用してSlaveでGroovyスクリプトを実行します。 import hudson.util.RemotingDiagnostics // Slaveノード…

宣言的APIクライアントSpring Cloud Feignを使ってみる

Spring Cloud Feignを利用すると、Spring MVCと同じアノテーション(@RequestMapping)を使ってAPIクライアントを定義できます。同じアノテーションが使えるので学習コストを抑えられるメリットがあるでしょう。また、APIサーバとAPIクライアントの仕様が同…

ACMのドメイン所有確認メールをSESで受信

aws

ACM(Amazon Certificate Manager)でSSL証明書を発行するには、ドメイン管理者に送付されるメールで承認をクリックする必要があります。ドメインの管理組織が異なる場合やメールサーバを用意していない場合は、ドメイン管理者へのメールをSESで受け取ること…

Gradle Swagger Codegen Plugin 1.1.0をリリースした

GradleでSwagger Code Generatorを利用するためのプラグインをリリースしました。 github.com バージョン1.1.0では、自動生成の対象を components オプションで選べるようになりました。下記のビルドスクリプトではモデルクラスとAPIクラスを生成しています…

HubotによるJIRAチケット作成の自動化

チケット駆動開発を行う上で障壁になることの一つに「チケット作成が面倒でだんだんやらなくなる」という課題があります。 Jim Coplien先生は紙の付箋を強く推奨しています*1し、私も分かりやすいアナログの方が好きです。しかし、JIRAにはディスプレイさえ…

docker-gitbucketでExternal DBやPrefixなどを設定する

DockerでGitBucketを立ち上げる時は f99aq8ove/docker-gitbucket というイメージを利用しています。GitBucket最新版への追随が早いので重宝しています。 github.com このたびPRがマージされたので、環境変数でExternal DBやPrefixなどを設定できるようになり…

Multibranch PipelineによるJenkinsとGitBucketの連携

JenkinsのMultibranch Pipelineを利用するとCIで以下ができるようになります。 ビルドの設定を Jenkinsfile に書いてバージョン管理できる。 リポジトリへのpushやPull Requestのマージを契機にジョブを実行できる。 パイプラインでビルドフローを分かりやす…

Jenkins GitHub PluginをGitBucketで利用する

JenkinsとGitBucketの連携にGitHub Pluginが使えるか調べてみました。GitBucket APIはGitHubと互換性があるので、理論上はGitHub Pluginが使えるはずです。 結論 GitHub互換のURL形式でリダイレクトを設定することで、GitHub PluginでもGitBucketのWebhookを…

Gradle Swagger Codegen Pluginを書いた

Swaggerのソースコード生成をGradleで利用するためのプラグインを書きました。 github.com 以下のようなビルドスクリプトを実行すると、SwaggerでAPIサーバを自動生成できます。 plugins { id 'org.hidetake.swagger.codegen' version '1.0.0' } repositorie…

チーム開発を始める時に決めること

頭の中を整理するために、新たにチーム開発を始める時に決めることをリストアップしてみました。すべて書き出すと大量になるので、プロセスや開発基盤を中心に書いています。 プロジェクト計画 ゴール マイルストン スコープ リリース計画 プロセス チーム構…

KPTとYWTMの振り返り手法を使い分ける

チーム開発の振り返り(レトロスペクティブ)ではKPTが広く使われていますが、YWTMという手法もあります。 yu-hi.babymilk.jp 私のチームでは、スプリントの振り返りはKPT、一定の区切り(月とか四半期)での振り返りはYWTMを使っています。具体的には、個人…

Gradle TestKitでプラグインをテストする

GradleプラグインのテストにGradle TestKitを利用すると便利です。 何に使うの? ユニットテストではうまく動いているのに、実際のプロジェクトにプラグインを適用するとうまく動かないことがあります。これはGroovyのバージョンが違うとか、ビルドスクリプ…

REST APIの例外設計

REST APIを設計する場合に、エラーをどのステータスコードで返却するか議論になることがあります。例えば、以下のような場合が挙げられます。 キー指定のリクエストでDBにデータがない場合(例: GET /books/1 ) 一覧のリクエストでDBにデータがない場合(…

Swagger CodeGenでダミーデータを返すスタブを出力する

Swagger codegenで言語にnodejs-serverを指定すると、Node.jsベースのRESTサーバが生成されます。基本的には空のデータを返す実装になるのですが、ある一定の条件を満たす場合は aeiou や 123456789 といったダミーデータを返す実装を出力してくれるようです…

acmesmithでSSL証明書を管理する

開発環境などのテンポラリな環境でSSL証明書を利用したい場合はLet's Encryptが便利です。Let's Encryptの証明書を管理するツールにはcertbotやlegoなどがありますが、それらは鍵や証明書をローカルディスクに格納するため、他のサーバで証明書を利用したい…

VirtualBoxのグラフィックスコントローラをvmsvgaに変更する

VM

VirtualBoxでゲストOSを実行する場合、通常はVirtualBoxに対応したディスプレイドライバをゲストOSにインストールする必要があります。ゲストOSが特殊で標準のディスプレイドライバしか利用できない場合は低解像度しか利用できませんが、もしゲストOSがVMwar…

あさりのリゾット

あさりのリゾットを作ったらめっちゃ美味しかったのでメモを残します。 材料(2人分) 材料 数量 米 1合 あさり 1パック たまねぎ 半玉 にんにく 適量 じゃがいも 1玉 白ワイン 200ml 水 100ml バター 適量 塩 適量 黒胡椒 適量 オリーブオイル 大量 作り方 …

Swagger自動生成スタブの継続的デプロイ

SwaggerにはYAMLからAPIクライアントやAPIサーバのコードを自動生成する機能があります。コードの自動生成を利用することでドメインの実装に集中でき、また、スタブを利用することでチーム開発を円滑に進められるといったメリットがあります。 しかし、コー…

Gradle SSH Plugin 2.6.0 released

Gradle SSH Plugin 2.6.0、Groovy SSH 2.6.0をリリースしました。 github.com 2.6.0の変更点 New feature Add executeScript method for script execution (thanks to @matthiasbalke) Add inputStream setting for command or shell (thanks to @matthiasba…

Gradle SSH Plugin 2.5.0 released

Gradle SSH Plugin 2.5.0、Groovy SSH 2.5.0をリリースしました。 github.com 2.4.1〜2.5.0の変更点 New feature Add timeout setting (2.5.0) Bug fixes Fix executeSudo never finish if password is wrong (2.5.0) Fix closing gateway session (2.4.3) U…

Continuous deployment to App Engine from Circle CI by Gradle

Circle CIを利用して、JVMベースのアプリをGoogle App Engineにデプロイする作業を自動化してみました。 うれしいこと 誰でも簡単にデプロイできる CIやPull Requestレビューを通過したコードのみデプロイできるように制限できる ビルド環境の差異による影響…

Circle CIでSSHサーバを利用する際の注意点

Circle CIでテストコードからローカルのSSHサーバを利用する際の注意点をメモします。 背景 SSHクライアントのテストでSSHサーバが必要なので、CI環境で用意したい。具体的には、Gradle SSH PluginのテストでCircle CIのSSHサーバを利用したい。 課題と対策 …

Gradle SSH Plugin 2.4.0をリリースした

Gradle SSH Plugin 2.4.0、Groovy SSH 2.4.0をリリースしました。 github.com 2.4.0の変更点 New features: Host key checking for gateway access Put files filtered by given closure Get files filtered by given closure Add ssh.runtime object in CLI…

ITのビジネス価値を最大化するには

2016年になってもアジャイルはテストをしないとか、計画を立てないとか、1日10回デプロイするための技法といった誤解が広まっているのは残念すぎる。 まず、ITのビジネス価値を最大化するという視点が必要なはず。事業の売上や費用を改善するためにシステム…

TestKitによるGradleプロジェクトのテスト

最近のGradleで導入されているTestKitを使ってみたのでメモします。 TestKitでできること TestKitを利用すると、Gradleプロジェクトに対するテストを実行できます。例えば、何かの設定ファイルを自動生成するタスクをGradleで定義している場合に、そのタスク…

VyOSでIP masqueradeの最小構成

VyOSで最小限のルータを設定する時のメモです。 前提 INTERNAL側に複数のクライアントをぶら下げたい INTERNAL側でDHCPサーバを立てて、クライアントの設定を省力化したい GLOBAL側はイントラネットなのでファイアウォールは設定しない 設定 GLOBAL側とINTER…

Gradle SSH Plugin 2.3.0をリリースした

Gradle SSH Plugin 2.3.0、Groovy SSH 2.3.0をリリースしました。 github.com 2.3.0の変更点 リモートコマンドを実行する時にコマンドラインを簡単にエスケープする構文を追加しました。これまでは自分でエスケープする(シングルクォートで囲む、もしくはバ…

Gradle SSH Plugin 2.2.0をリリースした

Gradle SSH Plugin/Groovy SSH 2.2.0をリリースしました。 2.2.0の変更点 authentications でユーザ認証方式を指定できるようになりました。通常の使い方(パスワード認証、公開鍵認証)ではユーザ認証方式を指定する必要はありませんが、Kerberos認証などの…

Gradle SSH Plugin 2.1.1をリリースした

Gradle SSH Plugin/Groovy SSH 2.11をリリースしました。 2.1.1の変更点 SCP GET/PUTの性能を改善しました。 github.com 2.1.0でSCPサポートを追加しましたが、非効率な実装が残っていたため、2.1.1で性能を改善しました。 Test Item scp vs sftp (2.1.0) sc…