DaggerのサンプルをNetlifyにデプロイしてみた

# Daggerとは

https://dagger.io/

>最新のCI/CDツール。
Docker上で動くため、Docker環境は事前に用意しておく必要がある。
パイプラインの記述が`yaml`ではなく`cuelang`を使用している。

https://cuelang.org/

# メリット

・開発環境とCI環境の統一ができる
・yamlの書き直しが減る

など、ほかにもあるかも
# Daggerのインストール

こちらを見てください

https://docs.dagger.io/install

# Daggerのサンプル

こちらを使用しました。
forkするなり、そっくりそのまま自分で作るなど。

https://github.com/dagger/todoapp

## サンプルをローカル実行
### 準備

#### プロジェクトにdaggerが入っていない時
```bash
dagger project init
```

#### プロジェクトにdaggerが入っている時
```bash
dagger project update
```

デバッグする時に詳しくログを出すための`export`
```bash
export DAGGER_LOG_FORMAT="plain"
export DAGGER_LOG_LEVEL="debug"
```

### 実行
```bash
dagger do build
```

### 以下、実行後の構成

![スクリーンショット 2022-06-28 144754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706381/c5af02fa-31bb-d7a6-d62f-8ec0de84f8d2.png)

## ローカルからNetlifyにデプロイする

Netlifyの登録についてはこちらを参考にしてください

https://ralacode.com/blog/post/netlify-registration/

また、アクセストークンも取得しておいてください

https://qiita.com/ub0t0/items/7a31369692e03a9428f0#netlify_auth_token%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95

```bash
export USER=Netlifyのユーザー名
export NETLIFY_TOKEN=Netlifyのアクセストークン
```

```bash
dagger do deploy
```

その後、Netlifyの管理画面に移動すればデプロイされているサイトがあります！

## GitHub Actionsのyamlの記述

```.github/workflows/todoapp.yml
name: todoapp

on:
  push:
    # Trigger this workflow only on commits pushed to the main branch
    branches:
      - main

# Dagger plan gets configured via client environment variables
# This needs to be unique across all of netlify.app
# APP_NAME: todoapp-dagger-europa

jobs:
  dagger:
    runs-on: ubuntu-latest
    steps:
      - name: Clone repository
        uses: actions/checkout@v2

      # You need to run `dagger project init` locally before and commit the cue.mod directory to the repository with its contents
      - name: Deploy to Netlify
        uses: dagger/dagger-for-github@v3
        # See all options at https://github.com/dagger/dagger-for-github
        with:
          version: 0.2
          workdir: todoapp
          # To pin external dependencies, you can use `project update github.com/[package-source]@v[n]`
          cmds: |
            project update
            do deploy
        env:
          # Get one from https://app.netlify.com/user/applications/personal
          USER: ${{ secrets.USER }}
          NETLIFY_TOKEN: ${{ secrets.NETLIFY_TOKEN }}



```
#### NETLIFY_TOKENとUSERはGithub settings の Secretに入れておく事

https://docs.github.com/ja/actions/security-guides/encrypted-secrets


## Next.jsの自作アプリをデプロイしたい場合の追加事項

yarn.cueでデプロイするディレクトリ名がデフォルトでbuildになっている為

```go
	// Path of the yarn script's output directory
	// May be absolute, or relative to the workdir
	outputDir: string | *"./build"
```

### 1. packege.jsonの変更で行う場合
package.json内にあるscriptsのbuildの項目に、
`next export -o build`を追加しておくことで生成ファイルの名前をbuildに固定する

```package.json
"scripts": {
  "dev": "next dev",
  "build": "next build && next export -o build",
  "start": "next start",
  "lint": "next lint"
}
```

### 2. [アプリ名].cueの変更で行う場合

```go
// Build live-front
build: yarn.#Script & {
  name:   "build"
  source: actions.source.output
  outputDir: "out" //ここでディレクトリの指定をする
}
```

## Dagger有りと無しでのGitHub ActionsのYamlの記述差

2022/07/14日現在での差分
月日がたっていると変更されている可能性がございます

### Daggerあり
 ```diff 
 name: todoapp 

 on:
   push:
     branches:
       - main

 jobs:
   dagger:
     runs-on: ubuntu-latest

     steps:
       - name: Clone repository
+        uses: actions/checkout@v2
   
+      - name: Deploy to Netlify
+        uses: dagger/dagger-for-github@v3
+        with:
+          version: 0.2
+          workdir: todoapp
+          cmds: |
+            project update
+            do deploy

         env:
+          USER: ${{ secrets.USER }}
+          NETLIFY_TOKEN: ${{ secrets.NETLIFY_TOKEN }}

```

### Daggerなし
```diff
 name: yaml_todoapp

 on:
   push:
     branches:
       - main

 jobs:
   publish:
     runs-on: ubuntu-latest

     steps:
       - name: Clone repository
-        uses: actions/checkout@master
  
-      - name: Use Node.js
-        uses: actions/setup-node@v3
  
-      - name: Install dependencies
-       run: yarn && yarn run build
-        working-directory: yaml_todoapp
-        env:
-          CI: false
  
-      - name: netlify Deploy
-        uses: netlify/actions/cli@master
-        with:
-          args: deploy --dir=./yaml_todoapp/build --prod

        env:
-          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_TOKEN }}
-          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}

```