「研究で分かったこと」が全部優しいのはなぜか、というスペースを聞いた

聞いた

多分デッドリンク PCでリンク取得できず。。

どこで?

Twitter space

ホスト

R As Well (@Luzwell) | Twitter

目的

あんまりちゃんと聞けていなかったけれど、すごく気になるタイトルなので、自分でもここにまとめていきたいと思った。

この下に研究でわかったやさしいことを書いていくぞ。

うまく回る理由

プロジェクトが継続的に回る理由

この記事の方針

この記事はペアプロ・モブプロ、テストコードあり、スクラム開発、CI/CD環境あり、マイクロサービスアーキテクトで開発している際に 詳細な設計書等がなくてもうまく回っていくのはなぜなのかを探るため、日々気づいたことを書きためておくための記事となる。 なので気づきがあれば更新をする。

ペアプロモブプロの効果

  • 二人以上で作業を行うため複雑な仕様を一人が分からない場合
    または意思疎通しながら進行する場合にテキストが自然と生まれる。
    テキストが生まれることで、不明点の発見ややるべきことが明文化かされはっきりする。
    この影響でメモ的な詳細設計書が他者にも伝わる形で残る効果があるように思う。

体制が時々変わる

プロダクト内で
なぜうまく回るかわからないが体制が良く変わる
ただ、ジョブ型で対応していて必要な体制に柔軟に変わっていく。

横断的な会議が存在する

プロダクト会
チーム会(改善系、新規開発系、プロジェクト系)などの分類
プロダクト内でのバックエンド定例、FEBFF会 VD会
各チームの朝会
各層でのレトロスペクティブ

相談事をやろうと思えばできる場が用意されている。
個人が上位チームへ進言しやすい環境の一つであると考えられる。

うまくいかなかったこと

体制とスプリントが決定した後に人員が別チームに移動になり、結果、チーム内でタスクを扱うことができる人員が存在しなくなり、別チームが受け持つ必要が生まれた。
スプリント進行中に裏での引継ぎ、調整が発生し、メンバーからの不満の声も漏れた。
プラスアルファでこのとき、プルリクエスト途中のタスクがある状態で別チームに人員が回るような状態も発生し、チーム間でのやり取りタスクの引継ぎが発生したときに
弱い組織状態であることが判明。チーム間のやりとりは少ない方が良い?

横断的にレビューをするような文化

なぜこれがあるのか、どういうところにそれを感じるのかを記述すること。

企画主体だが、別途スクラムマスタが存在する

以下から思い出しました。

上記結果的に進行がスムーズ

DEV、STG、PROD環境へのデプロイがカジュアル。

マージボタン押すだけ。
あとはyaml定義に沿ってデプロイ。
社員以外もデプロイしている。
レビューは2人以上で可
社員以外の場合社員に最低一人はaprove貰う必要があるが、かなりカジュアル。

タスクを分割する

タスクを分割してチケットを作成する。
上記を行うことで何が良くなるのかわからないが、どういう風に進行しているかを周囲の人間が認識しやすくTeamを横断したチェックが入りやすくなる。
また、チェックをする敷居が低くなる?何をしているかが一定数の人間に伝播するためであると思われる。
チケットにはゴールを書くこと。
定量的なものでなくともよい。
気軽なチケット作成で多くの人に状況が伝播しやすい環境の効果があると思われる。

TDD

単純にTDDにすることで不要なドキュメントが減る。
TDD実施することで、設計も同時にできるため。
リファクタリングや機能追加も割合容易にできるためよく回る。

企画と開発とがともに話す場を設けることの意味

情報の開示-情報の共有-疑問点または心のもやもやの解消を行うことで、互いに信頼、知識や状況の把握があることによる安心感を得られ心理的安全性を本来の意味でのチームの中で得ることができる。 分断した話し合いを行うことは情報の伝達効率が悪く、解釈と思い込みが発生し、コミュニケーション摩擦により心が摩耗する。しんどくなる。そして、モブ性に甘えるという本来の性分に落ちて情報の非対称性が生まれてお互いのことを理解できなくなり、開発チームと企画チームまたはもっと細かい粒度でチームが分断し、本来の目的を見失う。個々の目的を達成するために企画と開発が対立して心理的安全性は下がる。 個々の目的は達成しているが、余計な労力もしていて、真の目的を達成できなくなる。 本来サービスを届けるチームなんだけどな。。 モブ性に甘えるのはよくある平均的な人間だと思う。人が落ちていかないように場を作ることは大切。 仕組み上分断していたチームも場を提供することで生き生きとしている場面を見たときに思ったこと。 上のことをやったときにスクラムマスタの存在は不在だった。 存在させたら何か変わるような気がする。スクラムマスタの役割を学習して今のチームにぶち込んで何がどう変わるのかを確認してみようと思う。 ※心理的安全性が下がるはいいかえると不安になる。ということ。話す場を提供して情報を共有することで別の役割の人間に安心を提供できるという話。

rebase

起点ブランチを最新の状態にする

起点ブランチに問題がないか確認(動作確認 UT実行)

派生ブランチをremoteにpushしておく。(保険)

派生ブランチのコミットの量が多いときはコミットを一つにまとめる。

派生ブランチに問題がないか確認する(動作確認 UT実行)

問題がある場合localのブランチを消して、remoteブランチをlocalにcheckoutする

派生ブランチをremoteにpushしておく。(保険)

派生ブランチで起点ブランチのrebaseを行う

コンフリクトがある場合解消する

コンフリクトを解消できない場合はrebaseを取り消す。

rebase後に問題がないか確認(動作確認 UT実行)

問題がない場合remoteにpushする。

問題がある場合localのブランチを消して、remoteブランチをlocalにcheckoutする

push後起点ブランチにプルリクエストする。

Spring Bootで作成したアプリケーションをHerokuにデプロイする[Java][Heroku]

Spring Bootで作成したアプリケーションをHerokuにデプロイする[Java][Heroku]

Herokuとは

Heroku(ヘロク)は2007年創業のアメリカ合衆国の企業[1]。また、同社が開発と運営を行っているPaaS(Platform as a Service)の名称でもある[1]。2010年にはセールスフォース・ドットコムに買収された

via Wikipedia

wikipediaには他にも色々記載されていますが 今回の記事に一番近い解釈は アプリケーションを実行するための環境です。 以下が機能になります。 - 簡単なデプロイ - ホスティング - プラグインによるDB/キャッシュサーバ/その他ミドルウェアの利用 - プラグインの追加によるCI/CD - 多くの言語をサポートしています。

今回の開発環境

Windows10 Pro IntelliJ IDEA 2021.1 (Ultimate Edition)

前提

Gitインストールと初期設定済みであること
- Git DL
- WindowsのPath設定済みであること
HerokuCLI
- Heroku CLI DL
- WindowsのPath設定済みであること
Herokuのサービスにサインアップ済みであること
- Heroku sign up

作成するアプリが依存するライブラリなどの主なバージョン

主要素 項目 バージョン
言語 OpenJDK 8
FW SpringBoot 2.4.6
ビルドツール Gradle 6.8.3

手順

①Herokuにログイン

まずはじめにログインします。

Pathが通っている場合は、任意のディレクトリ。 C:\Program Files\Heroku\bin

Microsoft Windows [Version 10.0.19042.964]
(c) Microsoft Corporation. All rights reserved.

C:\Users\nyx>heroku login
 »   Warning: Our terms of service have changed: https://dashboard.heroku.com/terms-of-service
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/0b9f3c5d-103a-4271-91e0-85de0fdc381d?requestor=SFMyNTY.g2gDbQAAAAw2MC4xMTQuODIuNThuBgCGOBVSeQFiAAFRgA.frwzQ3iadLy_hiZ_ojUewt7PhVCkSredHjjb4pDjnnM
Logging in... done
Logged in as *********@gmail.com

C:\Users\nyx>

②SpringBootのサンプルアプリを作成します。

好きな方法で簡単なアプリを作成します。
いくつか方法があるので列挙していきます。
1. Spring Initializrでアプリを作成する。
2. ローカルでビルドツールを実行してアプリを作成する。Gradle,Mavenなど
3. IDEの機能を使って作成する。
今回は、3の方法でサンプルを作りました。
詳細は後述します。

③Gitのコマンドでローカルリポジトリを作成してコミットします。

作成したサンプルプロジェクトをgitで管理します。

#project folder
git init
git add .
git commit -m"first commit"

④Heroku CLI コマンドでHeroku上にアプリを作成する

heroku create

参考はこちら

⑤作成したアプリをHerokuにデプロイする。

# 自分が作成したアプリを管理しているブランチがmasterブランチなのでmasterを指定している。
git push heroku master

⑥デプロイできたことを確認する。

ブラウザでログに出力されたURLにアクセスして下記のように表示されたら成功です。

REFERENCE

Heroku公式チュートリアル
Heroku公式 Intoroduction
Heroku java support
Heroku CLI
https://github.com/rami2076/heroku_getting_start_v8

付録

IntelliJ IDEAを経由して作成するサンプルアプリの詳細

  1. IntelliJ IDEA の メニューバーの 「File>New>Project ...」と選択していき、「Project ...」をクリックすると下記が面が表示されます。画面のように設定を変更し、「Next」をクリック。
  2. 依存関係を選択します。今回はシンプルなWeb Applicationにするので「Spring Web」だけを選択しています。また、Spring Bootのバージョンを2.4.6(SNAPSHOT)にします。
  3. 現在のディレクトリ構造は下記となっています。
C:\Users\nyx\IdeaProjects\heroku_java8_get_start>tree
フォルダー パスの一覧:  ボリューム Windows
ボリューム シリアル番号は 3A86-E7F1 です
C:.
├─.gradle
│  ├─6.8.3
│  │  ├─fileChanges
│  │  ├─fileHashes
│  │  └─vcsMetadata-1
│  ├─buildOutputCleanup
│  ├─checksums
│  ├─configuration-cache
│  └─vcs-1
├─.idea
├─gradle
│  └─wrapper
└─src
    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─nyx
    │  │          └─heroku_java8_get_start
    │  └─resources
    │      ├─static
    │      └─templates
    └─test
        └─java
            └─com
                └─nyx
                    └─heroku_java8_get_start

4. gitignoreの追加 gitignore.io 5. クラスファイルの追加

package com.nyx.heroku_java8_get_start;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Index Rest Controller
 */
@RestController
public class IndexRestController {

    /**
     * 最初のメッセージを返却する
     *
     * @return {@code "Hello World!"}
     */
    @GetMapping(path = "/", produces = MediaType.TEXT_PLAIN_VALUE)
    public String firstMessage() {
        return  "Hello World!";
    }

}
  1. 動作確認
http://localhost:8080/

実行結果

Herokuへのデプロイ実行時のターミナルの状態

  • デプロイ実行画面
Microsoft Windows [Version 10.0.19042.964]
(c) Microsoft Corporation. All rights reserved.

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   .gitignore
        new file:   build.gradle
        new file:   gradle/wrapper/gradle-wrapper.jar
        new file:   gradle/wrapper/gradle-wrapper.properties
        new file:   gradlew
        new file:   gradlew.bat
        new file:   settings.gradle
        new file:   src/main/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplication.java
        new file:   src/main/java/com/nyx/heroku_java8_get_start/IndexRestController.java
        new file:   src/main/resources/application.properties
        new file:   src/test/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplicationTests.java


C:\Users\nyx\IdeaProjects\heroku_java8_get_start>heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/35e5c2b9-66ec-43e9-a665-1aab6ea3b21e?requestor=SFMyNTY.g2gDbQAAAAw2MC4xMTQuODIuNThuBgCXfRlSeQFiAAFRgA.9v7aHnbs9ezqvPQIQpwPzTqJwUWgwe6XSkV261ritZY
Logging in... done
Logged in as *********@gmail.com

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git branch -a

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git branch

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>
C:\Users\nyx\IdeaProjects\heroku_java8_get_start>
C:\Users\nyx\IdeaProjects\heroku_java8_get_start>
C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   .gitignore
        new file:   build.gradle
        new file:   gradle/wrapper/gradle-wrapper.jar
        new file:   gradle/wrapper/gradle-wrapper.properties
        new file:   gradlew
        new file:   gradlew.bat
        new file:   settings.gradle
        new file:   src/main/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplication.java
        new file:   src/main/java/com/nyx/heroku_java8_get_start/IndexRestController.java
        new file:   src/main/resources/application.properties
        new file:   src/test/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplicationTests.java


C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git commit -m"add:first commit."
[master (root-commit) 86a803b] add:first commit.
 11 files changed, 397 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 build.gradle
 create mode 100644 gradle/wrapper/gradle-wrapper.jar
 create mode 100644 gradle/wrapper/gradle-wrapper.properties
 create mode 100644 gradlew
 create mode 100644 gradlew.bat
 create mode 100644 settings.gradle
 create mode 100644 src/main/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplication.java
 create mode 100644 src/main/java/com/nyx/heroku_java8_get_start/IndexRestController.java
 create mode 100644 src/main/resources/application.properties
 create mode 100644 src/test/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplicationTests.java

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git status
On branch master
nothing to commit, working tree clean

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git branch
* master

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/b74c0c51-b57e-409d-91ec-f246db68c152?requestor=SFMyNTY.g2gDbQAAAAw2MC4xMTQuODIuNThuBgB4bhtSeQFiAAFRgA.g1afhoARe7TWuD-J0rz82oycjF-3s3zFL4G6dDfQ7j0
Logging in... done
Logged in as *********@gmail.com

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>heroku create
Creating app... done, ⬢ sample-userland-******
https://sample-userland-******.herokuapp.com/ | https://git.heroku.com/sample-userland-******.git

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git branch -a
* master

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git remote -v
heroku  https://git.heroku.com/sample-userland-******.git (fetch)
heroku  https://git.heroku.com/sample-userland-******.git (push)

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git status
On branch master
nothing to commit, working tree clean

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git push heroku master
Enumerating objects: 27, done.
Counting objects: 100% (27/27), done.
Delta compression using up to 4 threads
Compressing objects: 100% (18/18), done.
Writing objects: 100% (27/27), 57.95 KiB | 6.44 MiB/s, done.
Total 27 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-20 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Gradle app detected
remote: -----> Spring Boot detected
remote: -----> Installing JDK 1.8... done
remote: -----> Building Gradle app...
remote: -----> executing ./gradlew build -x check
remote:        ./gradlew: 39: cd: can't cd to "./
remote:        Downloading https://services.gradle.org/distributions/gradle-6.8.3-bin.zip
remote:        ..........10%..........20%..........30%...........40%..........50%..........60%..........70%...........80%..........90%..........100%
remote:        To honour the JVM settings for this build a single-use Daemon process will be forked. See https://docs.gradle.org/6.8.3/userguide/gradle_daemon.html#sec:disabling_the_daemon.
remote:        Daemon will be stopped at the end of the build
remote:        > Task :compileJava
remote:        > Task :processResources
remote:        > Task :classes
remote:        > Task :bootJarMainClassName
remote:        > Task :bootJar
remote:        > Task :jar SKIPPED
remote:        > Task :assemble
remote:        > Task :build
remote:
remote:        BUILD SUCCESSFUL in 37s
remote:        4 actionable tasks: 4 executed
remote: -----> Discovering process types
remote:        Procfile declares types     -> (none)
remote:        Default types for buildpack -> web
remote:
remote: -----> Compressing...
remote:        Done: 66.4M
remote: -----> Launching...
remote:        Released v3
remote:        https://sample-userland-******.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/sample-userland-******.git
 * [new branch]      master -> master

C:\Users\nyx\IdeaProjects\heroku_java8_get_start>

動作確認画面 - ログに記載されたデプロイ先のURLをコピーしてブラウザからアクセスして動作確認を実施 https://git.heroku.com/sample-userland-******

Heroku CLIインストール時の問題

  • インストール時に下記のようなメッセージが出た場合、Pathの設定に失敗した可能性があります。
  • デフォルトは下記ディレクトリなので環境設定からパスの追加を行ってください。
    C:\Program Files\Heroku\bin

SpringBoot Azure Active Directoryの最新ドキュメントを追跡する

SpringBoot Azure Active Directoryの最新ドキュメントを追跡する

最新のドキュメントについて

ベース1

基本的に最新のドキュメントは以下になります。

https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/azure-spring-boot-starter-active-directory
上記をMSのドメイン内で表示しているのが以下になります。(画像が表示されない。)

https://docs.microsoft.com/en-us/java/api/overview/azure/spring-boot-starter-active-directory-readme?view=azure-java-stable
ただし、上の設定だけだと不十分で過去の情報も併せて読む必要があります。

以下、過去のチュートリアルのAzureAD側の設定が参考になります。
https://docs.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory
ただ、参考にするべき画像の内容が異なる。

最低限必要なスコープの情報が古いままとなっている。スコープとしてDirectory.AccessAsUser.Allを割り当てる必要があり、この権限はサインインしたユーザが存在しているディレクトリと同じ階層のユーザ情報にすべてアクセスすることができる権限となっている。上長に不信感を与えて両省が下りない状態となる。AzureAdversion3.1.0までこの状態で、3.2.0からDirectory.Read.Allとなり、サインインしたユーザの情報を読み取ることのみができる権限のみ必要な状態となる。

なので、画像は間違いで、Directory.Read.Allを設定する必要があることになる。

バージョンによって異なると思われるので詳細は以下ファイルを確認すること。

https://github.com/Azure/azure-sdk-for-java/blob/28993948d2cf44e1c2a13ff46120767ca232294f/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad/webapp/AADWebAppConfiguration.java#L126-L127
ここで言っている画像は以下になります。

補足知識 ドメイン知識 スコープ

スコープに関する記事 現状正しい情報を確認可能
https://docs.microsoft.com/en-us/graph/permissions-reference

ベース2 ログイン認可に必要なredirect-uriの制約に関する知識

ログイン時に必要に必要となるredirect-uriの制約(設定の変更はできないが認識する必要がある。)
サーバ側(AzureAD本体)のredirect-uriの設定を追加する必要がある。
この時に制約を知っておく必要がある。
https://docs.microsoft.com/en-us/azure/active-directory/develop/reply-url

補足知識

AzureADにはグループを認可局として扱うことができる機能がある。
認可局として扱う場合は、Springにはグループを設定する必要がある。
また、Spring側の設定にグループを追加する必要がある。
グループを設定したくない場合はAzureADのサーバ側に疑似的なグループを設定する必要がある。
また、session-statelessの設定を追加する必要がある。
https://docs.microsoft.com/en-us/java/api/overview/azure/active-directory-spring-boot-starter-readme?view=azure-java-stable

ベース3 ログアウト

SSOをAzureADが担保するためにアプリ側でセッションが切れている場合に通常のログアウトを行っても、AzureADサーバが担保するexpireの時間以内の場合は、自動的にログインした状態となる。ここを制御するためには、ログアウトのURLを設定する必要がある。
ログアウトについては以下を参考にする。
https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-web-app-sign-user-sign-in?tabs=java 特にURLが要//login.microsoftonline.com/common/oauth2/v2.0/logout

補足 最新情報を追う

最新リリースのソースを追う
下記ファイルの履歴やblameを確認して最新バージョン又はリリースバージョンのリビジョンを見つけることで特定のバージョンのソースを確認できる。
https://github.com/Azure/azure-sdk-for-java/blob/28993948d2cf44e1c2a13ff46120767ca232294f/sdk/spring/azure-spring-boot/pom.xml#L16

3.4.0リビジョンのソースは下記
https://github.com/Azure/azure-sdk-for-java/commit/a04075d5ce607d79d0b273b42b579b184dd0197d

認証のみの履歴を追う場合は、下記パッケージ配下の履歴だけを見れば十分追うことができる。
https://github.com/Azure/azure-sdk-for-java/commits/master/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad

リリースの状態を知りたいときは下記
https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/spring/azure-spring-boot/CHANGELOG.md
Springbootとのバージョンの関係を知りたい場合は下記
https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/README.md
Spring Initializrの状態を知りたい場合は下記だが、更新が遅れる場合がある。
https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/spring/spring-reference.yml

SpringOAuth2の差異

spring-oauth2のデフォルトだけで対応できるソーシャルサービスの場合は、redirect-uriの設定を一部変更可能
spring-azure-active-directoryの場合は、変更は不可
サーバ側(AzureADの本体側)のredirect-uriの設定は変更ができる。

ログアウトの設定もデフォルトのSpringのとは逸脱している注意が必要

SpringOAuth2のデフォルトカスタマイズ情報。AzureADの認証にはほとんど使えないが、考え方は参考に独自内部認証サービスを作成する場合や、SpringSecurityの大枠を知るためには読む必要がある。
https://docs.spring.io/spring-security/site/docs/5.2.x/reference/html/oauth2.html