skaffold dev でリソースが作成されない（manifests と deploy の違い）

# はじめに
記事を見てくださりありがとうございます！
@HayatoHanaoka と申します。
今日も仕事で扱っている技術でちょっとした躓きがあり、それを解消していく中でとある学びを得ました。
その内容を、備忘録がてら記事にします！
ちなみに、ネタバレをすると...
1. `manifests` と `deploy` プロパティの関心の違い
1. 関心に合わせたプロパティを選ぶことの大切さ
です。

# 何が起きたか？
### `skaffold dev -f e2e.yaml --port-forward` でリソースが構築されない
やりたかったことは、以下の`e2e.yaml`を`skaffold dev`することで、
モック用のpodとアプリケーション用のpodを同時に立ち上げることです。
``` e2e.yaml
apiVersion: skaffold/v4beta10
kind: Config
requires:
  - path: ./app/skaffold.yaml
  - path: ./deps.yaml
```
しかし...
``` zsh
$ skaffold dev -f e2e.yaml --port-forward

~ イメージビルドやプルのログ ~

Starting deploy...
Listing files to watch...
 - docker-registry/my_app
Press Ctrl+C to exit
Watching for changes...
```
なにも立ち上がってないように見える...。
``` zsh
$ kubectl get svc,pod    
No resources found in my_app namespace.
```
やっぱり何も立ち上がっていない。

# 原因
### `./app/skaffold.yaml` と `./deps.yaml` で使っていたプロパティに問題があった！
結論、`manifests` プロパティだけを使っていて、 `deploy` プロパティを設定していなかったことが原因でした。

# 解決法
2通りの解決法がありました。
1. `manifests` -> `deploy` に書き換える
1. `deploy` プロパティを追加する
:::note warn
プロパティについて詳しく知りたい方は、公式docsをご参照ください。
https://skaffold.dev/docs/references/yaml/
:::

それぞれの方式の特徴を記述しておきます。（毎度の如く、自己解釈です。ご容赦ください。）
- 前者
    - マニフェストの作成〜デプロイ方法までをまとめて設定できる
        - デプロイまでの工程を自身で行う場合に有用
    - `kubectl`などのコマンド単位でのデプロイ方法を指定できたりする
- 後者
    - `manifests` プロパティを残すことで、マニフェストファイルの作成に注力できる
        - デプロイはCDツール等を用いて行う場合に有用
    - `deploy` プロパティにデプロイ方法を設定することも可能

私の場合、デプロイ自体は `Arogocd` を使用していたため、マニフェストファイルの作成に注力したプロパティを残せる後者の方式を選択しました。

### 修正前
```./app/skaffold.yaml
apiVersion: skaffold/v4beta10
kind: Config
metadata:
  name: my_app
build:
  artifacts:
    - image: docker-registry/my_app
      context: ../../../my_app
      docker:
        dockerfile: ../environments/my_app/app/Dockerfile
  tagPolicy:
    gitCommit:
      variant: AbbrevCommitSha
  local:
    push: false
    useBuildkit: true
manifests:
  helm:
    releases:
      - name: my_app
        chartPath: helm/deployment
        valuesFiles:
          - helm/values.yaml
        setValueTemplates:
          image: docker-registry/my_app
          tag: '{{ .IMAGE_TAG_docker_registry_my_app }}'
```
```./deps.yaml
apiVersion: skaffold/v4beta10
kind: Config
metadata:
  name: mock
manifests:
  helm:
    releases:
      - name: mock
        chartPath: ../lib/mock/helm
        setValues:
          name: mock
          port: 30005
          resources:
            requests:
              memory: 256Mi
              cpu: 100m
```

### 修正後 1（`manifests` -> `deploy` に書き換える）
`./app/skaffold.yaml`
```diff_yaml
apiVersion: skaffold/v4beta10
kind: Config
metadata:
  name: my_app
build:
  artifacts:
    - image: docker-registry/my_app
      context: ../../../my_app
      docker:
        dockerfile: ../environments/my_app/app/Dockerfile
  tagPolicy:
    gitCommit:
      variant: AbbrevCommitSha
  local:
    push: false
    useBuildkit: true
- manifests:
+ deploy:
  helm:
    releases:
      - name: my_app
        chartPath: helm/deployment
        valuesFiles:
          - helm/values.yaml
        setValueTemplates:
          image: docker-registry/my_app
          tag: '{{ .IMAGE_TAG_docker_registry_my_app }}'
```
`./deps.yaml`
```diff_yaml
apiVersion: skaffold/v4beta10
kind: Config
metadata:
  name: mock
- manifests:
+ deploy:
  helm:
    releases:
      - name: mock
        chartPath: ../lib/mock/helm
        setValues:
          name: mock
          port: 30005
          resources:
            requests:
              memory: 256Mi
              cpu: 100m
```

### 修正後 2（`depoloy` プロパティを追加する）
`./app/skaffold.yaml`
```diff_yaml
apiVersion: skaffold/v4beta10
kind: Config
metadata:
  name: my_app
build:
  artifacts:
    - image: docker-registry/my_app
      context: ../../../my_app
      docker:
        dockerfile: ../environments/my_app/app/Dockerfile
  tagPolicy:
    gitCommit:
      variant: AbbrevCommitSha
  local:
    push: false
    useBuildkit: true
manifests:
  helm:
    releases:
      - name: my_app
        chartPath: helm/deployment
        valuesFiles:
          - helm/values.yaml
        setValueTemplates:
          image: docker-registry/my_app
          tag: '{{ .IMAGE_TAG_docker_registry_my_app }}'
+ deploy:
+   helm: {}
```
`./deps.yaml`
```diff_yaml
apiVersion: skaffold/v4beta10
kind: Config
metadata:
  name: mock
manifests:
  helm:
    releases:
      - name: mock
        chartPath: ../lib/mock/helm
        setValues:
          name: mock
          port: 30005
          resources:
            requests:
              memory: 256Mi
              cpu: 100m
+ deploy:
+   helm: {}
```

# 最後に
実は動き的には `deploy` を使おうが `manifests` を使おうがそこまで変わりはないはずです。
ただ、やりたいことや関心に適したプロパティを選んであげることも大切なので、今後は気をつけて書いていこうと思いました！🛹