Packer でイメージ作るのを CircleCI でやってみる

# Packer でイメージ作るのを CircleCI でやってみる

[Packer でイメージ作る最中に色々やってみる](https://qiita.com/okaru/items/6d21dcb39e7a38a45450) で作った Packer の json を使って、CircleCI 上で Packer を動かしてみたいと思います。

1. github に push する
2. CircleCI でフックして、自動的に packer が動く
3. packer で作られたイメージが aws の AMI にプッシュされる

まぁ、こんな流れをやってみたいと思います。

ちょっと調べたら、CircleCI の 熊（bear）さんが [Packer Workflows to validate, build and deploy AMIs using CircleCI](https://github.com/CircleCI-Public/circleci-packer) というのを上げてくれてます。ただ、ちょっと内容が難しい感じなので、もうちょい簡単なやつを作ってみたいと思います。

## 前提

1. CircleCI にアカウントを作りましょう（githubログインすれば自動で連携される・・・ﾊｽﾞ）
2. CircleCI の Contexts に AWS のキー情報を設定しましょう

aws とか github とかは今さらな感じなので、割愛します。。。

## レポジトリ作りましょう

github 上にレポジトリ作って下さい。
`New repository` なんていうボタンを押せば、適当に作れると思います。

![github_001.png](https://qiita-image-store.s3.amazonaws.com/0/318450/7f07464d-0050-70bc-9a0a-a43af8bd68e6.png)

`Repository name` 入れて、 `private` 選んで、 `Create repository` 押します。

![github_002.png](https://qiita-image-store.s3.amazonaws.com/0/318450/e80c3e82-49a3-bc6a-02d3-880982d705a0.png)

できたやつの `HTTPS` アドレス確認しておいてください。

![github_003.png](https://qiita-image-store.s3.amazonaws.com/0/318450/d2f7a1cd-cc46-daa1-051c-ad58bf8c4c21.png)

## github に上げる用のソース作ります。

まず、レポジトリ用のディレクトリ作ります。

```
> mkdir circleci_test
> cd circleci_test
> mkdir .circlrci
```

CircleCI 用のコンフィグファイル作ります。
とりあえず、Packer でビルドするだけしかやってません。

```.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: hashicorp/packer:1.3.3
    working_directory: ~/packer
    steps:
      - checkout
      - attach_workspace:
          at: ~/packer
      - run:
          name: Build
          command: packer build build.json
          no_output_timeout: 30m
workflows:
  version: 2
  build-and-deploy:
    jobs:
      - build:
          context: AMI
```
※`context` を `AMI` で設定しているので、これは適宜合わせてください。

Packer 用のビルドファイルは前回と同じでよいです。
(名前だけ example.json -> build.json に変更しました)

```build.json
{
  "variables": {
    "aws_access_key": "",
    "aws_secret_key": ""
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "ap-northeast-1",
    "source_ami_filter": {
      "filters": {
        "virtualization-type": "hvm",
        "name": "ubuntu/images/*ubuntu-bionic-18.04-amd64-server-*",
        "root-device-type": "ebs"
      },
      "owners": ["099720109477"],
      "most_recent": true
    },
    "instance_type": "t2.micro",
    "ssh_username": "ubuntu",
    "ami_name": "packer-example {{timestamp}}"
  }],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "sleep 30",
        "sudo apt-get update",
        "sudo apt-get install -y nginx"
      ]
    }
  ]
}
```

そしたら、コミットしてプッシュしちゃいましょう。

```
> git init
> git add .
Initialized empty Git repository in ~/circleci_test/.git/
> git commit -m "first commit"
[master 00ffe8c] second commit
 2 files changed, 54 insertions(+)
 create mode 100644 .circleci/config.yml
 create mode 100644 build.json
> git remote add origin https://github.com/<your account>/<repository name>.git
> git push -u origin master
Username for 'https://github.com': <account mail>
Password for 'https://<account mail>@github.com':
Counting objects: 6, done.
Delta compression using up to 3 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 958 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/<your account>/<repository name>.git
   e5d5887..00ffe8c  master -> master
Branch master set up to track remote branch master from origin.
```

とりあえず、これでプッシュはできたはずです。

## CircleCI で連携させてみよう

[CircleCI](https://circleci.com/) にログインして、`ADD PROJECTS` で作成したレポジトリ名のやつを `Set Up Project` します。

![circleci_001.png](https://qiita-image-store.s3.amazonaws.com/0/318450/8504328c-40b4-c5dd-9171-bf224fe861b7.png)

`Start Building` って出ると思うのでポチっと押します。

![circleci_002.png](https://qiita-image-store.s3.amazonaws.com/0/318450/de66ab17-8eed-4c7b-f67d-bd765b210281.png)

ビルドが走り、成功すると、`SUCCESS` になります。

![circleci_packer.png](https://qiita-image-store.s3.amazonaws.com/0/318450/93f87393-dbe8-991d-99d8-c31be2b4ecfd.png)

## 忘れるとできない Contexts

`Create Cotext` をポチっとします。

![circleci_003.png](https://qiita-image-store.s3.amazonaws.com/0/318450/3ca48ff5-2bb5-25fe-f49f-1d79e57fa5b0.png)

`AMI` を作成して、必要な AWS のキーを登録します。
`Security` が `Public` なのは、同じ組織内で見られるという意味です。

![circleci_004.png](https://qiita-image-store.s3.amazonaws.com/0/318450/9c475c47-cfbb-cfee-54cc-6ff9a96206a4.png)

今回の作業だと `AWS_IMAGE` は使わないです。

## AMI ができているか確認

AWSのコンパネで確認してみましょう。

![circleci_005.png](https://qiita-image-store.s3.amazonaws.com/0/318450/b9972dc8-80bc-df02-92cf-4711d858bdd0.png)

できてますね。

## まとめ

とりあえずテストとかなしでやってみました。
これで、github を更新するたびに、AMI が作成されるようになります。