AWS Copilot Pipelineを触ってみた

#きっかけ
[前回AWS Copilotを触ってみました](https://qiita.com/takeh/items/23d7b3300dc008bb9dbc)が、その時はpipelineをうまく動かせませんでした。
しかし、その後うまく動いたので今回はcopilot pipelineの話を書こうと思います。

#動かなかった原因
なぜ動くようになったのかは不明です...
とりあえずcopilotに新バージョンが出ていたのでバージョンを上げて色々試していたら動きました...

```bash
$ copilot --version
copilot version: v0.2.0
```

#Copilotのセットアップ
まずはCopilotをセットアップします。セットアップに使うファイルややり方は[前回記事](https://qiita.com/takeh/items/23d7b3300dc008bb9dbc)同様です。

```bash
# 必要なファイル
.
├── Dockerfile
└── index.html

0 directories, 2 files
```

```dockerfile
# Dockerfile
FROM nginx
EXPOSE 80
COPY index.html /usr/share/nginx/html
```

`copilot init`でCopilotのセットアップを開始します。
選択肢の詳細等の詳しいセットアップ方法は[前回記事](https://qiita.com/takeh/items/23d7b3300dc008bb9dbc)を確認してください。

```
$ copilot init

（省略）

Application name: qiita-copilot-pipeline-app        # 今回設定したアプリ名
Service type: Load Balanced Web Service
Service name: qiita-copilot-pipeline-service        # 今回設定したサービス名
Dockerfile: ./Dockerfile

（省略）
✔ Wrote the manifest for service qiita-copilot-pipeline-service at copilot/qiita-copilot-pipeline-service/manifest.yml
Your manifest contains configurations like your container size and port (:80).
（省略）

All right, you're all set for local development.
Deploy: Yes

（省略）
```

git管理しているフォルダで`copilot init`を行うと、Copilotセットアップ中に自動で作成されたAmazon ECRのImageタグにcommit番号？（7桁の英数字）が入ります。
git管理していない場合は以下のメッセージが表示され、Imageタグを入力するように求められます。

```bash
fatal: not a git repository (or any of the parent directories): .git
Note: Failed to default tag, are you in a git repository?
Input an image tag value: 
```

設定がすべて終わるとアクセス先URLが表示されるのでブラウザで確認してみましょう。
index.htmlの内容が表示されているはずです。

```bash
✔ Deployed qiita-copilot-pipeline-service, you can access it at http://.....
```

Copilotのセットアップが終わったファイル構成は以下の通りです。

```bash
# ファイル構成
.
├── .git
│   └── （省略）
├── Dockerfile
├── README.md
├── copilot                               # 今回のcopilot initで作成されたフォルダ
│   ├── .workspace                        # 今回のcopilot initで作成された隠しファイル
│   └── qiita-copilot-pipeline-service    # 今回のcopilot initで作成されたフォルダ
│       └── manifest.yml                  # 今回のcopilot initで作成されたファイル
└── index.html
```

`copilot init`で作成されたファイルをGitHubにプッシュしましょう。
`./copilot/.workspace`ファイルも忘れずにGitHubプッシュをしてください。
.workspaceファイルがないとPipeline実行時にbuildでエラーが発生します。（気づかずにハマった...）

#Copilot Pipelineのセットアップ
続いて今回のメインディッシュのCopilot Pipelineのセットアップを行います。

`copilot pipeline init`で対話形式のセットアップが始まります。

```bash
$ copilot pipeline init

  Would you like to add an environment to your pipeline? [? for help] (y/N) 
```

`Would you like to add an environment to your pipeline?`でNoにすると、後ほど聞かれるGitHubのPersonal Access Tokenの設定のみ行われ、Pipelineの設定は行われません。（下の環境に関する質問がスキップされる）
何に使うんだろ...:thinking:

```bash
  Which environment would you like to add to your pipeline?  [Use arrows to move, type to filter, ? for more help]
  > test
```

pipelineを追加する環境を選択します。
ここでは自動で作成されるテスト環境以外の環境は作っていないので、表示されているテスト環境を選択します。

```bash
  Which GitHub repository would you like to use for your service?  [Use arrows to move, type to filter, ? for more help]
  > git@github.com:『アカウント名』/『リポジトリ名』

  Please enter your GitHub Personal Access Token for your repository copilot-test: [? for help]
```

接続するGitHubリポジトリを選択し、GitHubの`Personal Access Token`を入力します。
Personal Access TokenはGitHubサイトで以下の操作で生成します。
1. GitHubアカウントの`Settings`をクリック
2. 左メニューの一番下の`Developer settings`をクリック
3. 左メニューの一番下の`Personal access tokens`をクリック
4. Personal access tokens画面の`Generate new token`をクリック
詳しくは[GitHub「Personal access tokens」の設定方法 - Qiita](https://qiita.com/kz800/items/497ec70bff3e555dacd0)が参考になります。

```
（省略）
✔ Wrote the pipeline manifest for qiita-copilot-pipeline at 'copilot/pipeline.yml'
The manifest contains configurations for your CodePipeline resources, such as your pipeline stages and build steps.
✔ Wrote the buildspec for the pipeline's build stage at 'copilot/buildspec.yml'
The buildspec contains the commands to build and push your container images to your ECR repositories.
```

セットアップが終わると`copilot/pipeline.yml`と`copilot/buildspec.yml`が作成されます。

```bash
# ファイル構成
.
├── .git
│   └── （省略）
├── Dockerfile
├── README.md
├── copilot
│   ├── .workspace
│   ├── buildspec.yml       # 今回のcopilot pipeline initで作成されたファイル
│   ├── pipeline.yml        # 今回のcopilot pipeline initで作成されたファイル
│   └── qiita-copilot-pipeline-service
│       └── manifest.yml
└── index.html
```

またセットアップ完了後に以下のように推奨手順が表示されます。

```bash
Recommended follow-up actions:
- Commit and push the generated buildspec and manifest file.
- Update the build phase of your buildspec to unit test your services before pushing the images.
- Update your pipeline manifest to add additional stages.
- Run `copilot pipeline update` to deploy your pipeline for the repository.
```

が、今回作成されたbuildspec（buildspec.yml）とPipelineマニフェスト（pipeline.yml）は[Pipelines · aws/copilot-cli Wiki](https://github.com/aws/copilot-cli/wiki/Pipelines#setting-up-a-pipeline-step-by-step)の`Setting up a Pipeline, step by step`でオプションになっており、以下の通り同ページのシンプルな手順でも触れられていないため、推奨手順に書かれている`- Update the build phase of your buildspec to unit test your services before pushing the images.`と`- Update your pipeline manifest to add additional stages.`は無視することにします。

```bash
# Pipelines · aws/copilot-cli Wikiに書かれているシンプルな手順
$ copilot pipeline init
$ git add copilot/buildspec.yml && git commit -m "Adding Pipeline Buildspec" && git push
$ copilot pipeline update
```

ということで、[Pipelines · aws/copilot-cli Wiki](https://github.com/aws/copilot-cli/wiki/Pipelines#setting-up-a-pipeline-step-by-step)に書かれているシンプルな手順に従います。

```bash
$ git add copilot/buildspec.yml && git commit -m "Adding Pipeline Buildspec" && git push
$ copilot pipeline update
```

CodePipelineが作成されます。
AWSマネジメントコンソールで確認するとしばらくステータスが`進行中`なので`成功しました`になるまで待ちます。
以下のコマンドでも確認できます。

```bash
$ copilot pipeline status
Pipeline Status

Stage                        Transition          Status
-----                        ----------          ------
Source                       ENABLED             Succeeded
└── SourceCodeFor-qiita-app                      Succeeded
Build                        ENABLED             InProgress
└── Build                                        InProgress
DeployTo-test                ENABLED               -

Last Deployment

  Updated At    8 minutes ago
```

ステータスが`成功しました`になったらpipelineの設定が完了しているので試しにローカルのindex.htmlを編集してGitHubにプッシュしてみましょう。
5、6分待つと公開サイトに反映されているはずです :tada:

#その他のCopilot Pipelineのコマンド
###Pipelineの詳細情報表示

```bash
$ copilot pipeline show
```

###Pipelineの削除

```bash
$ copilot pipeline delete
```

#Pipelineマニフェスト（pipeline.yml）
このファイルは以下の3要素で構成されています。
このファイルを更新した場合は`copilot pipeline update`を実行する必要があります。

- name: Pipelineの名前
- source: 追跡するGitHubリポジトリとブランチ
- stages: デプロイする環境

#まとめ
奥が深そうなので今回は`buildspec.yml`には触れませんでした。
が、テストも関係してきてテスト担当者としては見逃せないので、日を改めて研究したいと思います。

#We're hiring!
AIチャットボットを開発しています。
ご興味ある方は [Wantedlyページ](https://www.wantedly.com/projects/266837) からお気軽にご連絡ください！

#参考記事
[Pipelines · aws/copilot-cli Wiki](https://github.com/aws/copilot-cli/wiki/Pipelines#setting-up-a-pipeline-step-by-step)
[AWS CopilotでAmazon ECSの環境とCI/CDの超簡単構築を試してみた - SMARTCAMP Engineer Blog](https://tech.smartcamp.co.jp/entry/try-aws-copilot)
[GitHub「Personal access tokens」の設定方法 - Qiita](https://qiita.com/kz800/items/497ec70bff3e555dacd0)