初めてのGCP導入 -ApacheMavenとともに

## 概要
GCPの環境導入からMavenでのHelloWorldまで。

ほとんど公式ドキュメントをなぞっただけですが、
WSLのせいか、
主に、CloudSDKの導入で躓いたので、
備忘録です。

## 環境
+ Ubuntu 18.04.3 LTS (Windows Subsystem for Linux)
+ OpenJDK 1.8.0_222
+ Apache Maven 3.6.1

## google Cloud SDK の導入
正しく配布されるように、環境変数を作成する。

```console
    $ export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
```

Cloud SDK の配布 URI をパッケージ ソースとして追加する。

```console
    $ echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
```

Google Cloud の公開鍵をインポートする。

```console
    $ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
```

Cloud SDK を更新してインストールする。

```console
    $ sudo apt-get update && sudo apt-get install google-cloud-sdk
```

javaのAppEngineプラグインをインストールする。

```console
    $ sudo apt-get install google-cloud-sdk-app-engine-java
```

gcloud init を実行して開始する。

```console
    $ gcloud init
```

#### CloudSDKインストール時のトラブル
`updating database of manual pages`
の行で処理が止まる場合、以下のコマンドを順に実行する。

```console
    $ sudo dpkg --configure -a
    $ sudo apt-get -f install
    $ sudo apt-get --fix-missing install
    $ sudo apt-get update
    $ sudo apt-get dist-upgrade
    $ sudo apt-get clean
    $ sudo apt-get autoremove
    $ sudo apt-get update
```

いくつかのコマンドでエラーが発生したので、その対処も以下に示す。

###### sudo dpkg --configure -a のトラブル

エラーメッセージに従い、該当の行を削除。

```console
    $ sudo dpkg --configure -a
    dpkg: error: parsing file '/var/lib/dpkg/updates/0007' near line 0:
     newline in field name '#padding'
    $ sudo rm /var/lib/dpkg/updates/0007
```

###### sudo apt-get autoremove のトラブル

修正のためのプログラムを実行。

[参考サイト様](https://askubuntu.com/questions/760896/how-can-i-fix-apt-error-w-target-packages-is-configured-multiple-times)
よりzipファイルをダウンロード、カレントディレクトリに移動しておく。

```console
    $ sudo apt install python3-apt

    $ sudo python3 -OEs aptsources-cleanup.zip
```

<details>
<summary>実行結果</summary>
<div>

```
    Overlapping source entries:
     1. file “/etc/apt/sources.list.d/google-cloud-sdk.list”:
        deb http://packages.cloud.google.com/apt cloud-sdk-bionic main
     2. file “/etc/apt/sources.list.d/google-cloud-sdk.list”:
        deb http://packages.cloud.google.com/apt cloud-sdk-bionic main
    I disabled the latter entry.

    Overlapping source entries:
     1. file “/etc/apt/sources.list.d/google-cloud-sdk.list”:
        deb http://packages.cloud.google.com/apt cloud-sdk-bionic main
     2. file “/etc/apt/sources.list.d/google-cloud-sdk.list”:
        deb http://packages.cloud.google.com/apt cloud-sdk-bionic main
    I disabled the latter entry.

    1 source entry was disabled:
      # deb http://packages.cloud.google.com/apt cloud-sdk-bionic main
      # deb http://packages.cloud.google.com/apt cloud-sdk-bionic main

    Do you want to save these changes?  (yes/no)
    ? y
```

</div>
</details>

## サンプルHelloWorldのテスト
Mavenのプロジェクト作成

あらかじめ、GCPコンソール上でプロジェクトを作成しておく。
作成したプロジェクトのIDを
`[YOUR-PROJECT-ID]`
と置換して、下記のコマンド実行。

```console
    $ mvn archetype:generate -Dappengine-version=1.9.59 -Dapplication-id=[YOUR-PROJECT-ID] -Dfilter=com.google.appengine.archetypes:
```

対話形式で実行されるので、適当なものを選ぶ。
特に拘りがなければデフォルトで良い。
archetypeは「2」（空のプロジェクト）を選んだ。

<details>
<summary>実行結果</summary>
<div>

```
    Choose archetype:
    1: remote -> com.google.appengine.archetypes:appengine-flexible-archetype (A basic Java application with Google App Engine flexible.)
    2: remote -> com.google.appengine.archetypes:appengine-skeleton-archetype (A skeleton application with Google App Engine)
    3: remote -> com.google.appengine.archetypes:appengine-standard-archetype (A basic Java application with Google App Engine Standard)
    4: remote -> com.google.appengine.archetypes:endpoints-skeleton-archetype (A skeleton project using Cloud Endpoints Frameworks with Goog
    le App Engine Standard)
    5: remote -> com.google.appengine.archetypes:guestbook-archetype (A guestbook application with Google App Engine)
    6: remote -> com.google.appengine.archetypes:hello-endpoints-archetype (A simple starter application using Cloud Endpoints Frameworks wi
    th Google App Engine Standard)
    7: remote -> com.google.appengine.archetypes:skeleton-archetype (Archetype with a README about Google App Engine archetypes)
    Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 2

    Choose com.google.appengine.archetypes:appengine-skeleton-archetype version:
    1: 1.8.7
    2: 2.0.0-1.9.10
    3: 2.0.1-1.9.20
    4: 2.0.2-1.9.21
    5: 2.0.2-1.9.25
    6: 2.1.0-1.9.38
    7: 3.0.0
    8: 3.0.1
    Choose a number: 8:

    Define value for property 'groupId': [YOUR-GROUP-ID]
    Define value for property 'artifactId': [YOUR-ARTIFACT-ID]
    Define value for property 'version' 1.0-SNAPSHOT: :
    Define value for property 'package' [YOUR-GROUP-ID]: :
    [INFO] Using property: CloudSDK_Tooling = true
    [INFO] Using property: appengine-version = 1.9.59
    [INFO] Using property: application-id = [YOUR-GROUP-ID]
    [INFO] Using property: java8 = true
    [INFO] Using property: service = default
    Confirm properties configuration:
    groupId: [YOUR-ARTIFACT-ID]
    artifactId: [YOUR-GROUP-ID]
    version: 1.0-SNAPSHOT
    package: [YOUR-ARTIFACT-ID]
    CloudSDK_Tooling: true
    appengine-version: 1.9.59
    application-id: [YOUR-GROUP-ID]
    java8: true
    service: default
```

</div>
</details>


ビルドする。

```console
    $ mvn clean package
```

ローカルにデプロイ。

```console
    $ mvn appengine:run
```



## 参考

+ [Cloud SDK の最新バージョン（245.0.0）のインストール](https://cloud.google.com/sdk/docs/?hl=ja#deb)
+ [Apache Maven と App Engine プラグインの使用（Cloud SDK ベース）](https://cloud.google.com/appengine/docs/standard/java/tools/using-maven?hl=ja)
+ [Updating database of manual pages won't complete](https://answers.launchpad.net/ubuntu/+source/apt/+question/143596)
+ [Ubuntu日本語フォーラム](https://forums.ubuntulinux.jp/viewtopic.php?id=3856)
+ [How can I fix apt error “W: Target Packages … is configured multiple times”?
](https://askubuntu.com/questions/760896/how-can-i-fix-apt-error-w-target-packages-is-configured-multiple-times)