CircleCIでビルドして、AWS EC2にデプロイするために知りたかったこと

## push時に変更されたファイルによって、処理を分ける方法
[path-filtering](https://circleci.com/developer/ja/orbs/orb/circleci/path-filtering)を利用する。

### config.yml
[path-filtering](https://circleci.com/developer/ja/orbs/orb/circleci/path-filtering)で変更されたファイルを判定して、build.ymlのparametersに渡す。

```yml
version: 2.1

setup: true

orbs:
  path-filtering: circleci/path-filtering@0.1.3

workflows:
  setup-workflow:
    jobs:
      - path-filtering/filter:
          base-revision: develop # 比較対象のブランチ
          config-path: .circleci/build.yml
          mapping: |
            aaa1/.* changed_aaa true
            aaa2/.* changed_aaa true
```

### build.yml
config.yml で判定された結果をparametersで受け取って、処理を分岐させる。

```yml
parameters:
  changed_aaa:
    type: boolean
    default: false

jobs:
  build:
    build_aaa:
      executor:
        name: default
      steps:
        - when:
            condition: <<pipeline.parameters.changed_aaa>>
            steps:
              - run: echo "build"
        - unless:
            condition: <<pipeline.parameters.changed_main>>
            steps:
              - run: echo "not build"

workflows:
  build_and_deploy:
    jobs:
      - build_aaa:
          filters:
            branches:
              only:
                - develop
```

## 環境別（本番、ステージング等）の設定値を同じKeyで取得する。
Contextに設定すると同じKeyで取得できて便利。
https://app.circleci.com/settings/organization/github/VJSOL/contexts

## AWS EC2のセキュリティグループにCircleCIの実行サーバーのipアドレスを追加、削除
参考にした記事：
[CircleCI2.0からEC2にアクセスするときだけ特定のIPを許可したい](https://qiita.com/rintaro-ishikawa/items/02e6a63dbc90ea67a991)

### セキュリティグループにipを追加

```yml
commands:
  add_security_group_ssh_ip:

    description: "ec2のセキュリティグループにcircleciのipを追加。"
    steps:
      - aws-cli/install
      - run:
          name: "authorize-security-group-ingress"
          command: |
            IP=`curl -s ifconfig.me`
            echo "current executor ip:${IP}"
            echo "#!/bin/bash" > ./sg.sh
            echo "aws configure set region ap-northeast-1" >> ./sg.sh
            echo "aws ec2 authorize-security-group-ingress --group-id $EC2_SECURITY_GROUP_ID \
             --ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges='[{CidrIp=${IP}/32,Description="circle ci"}]'" >> ./sg.sh
            bash ./sg.sh
```

### セキュリティグループからipを削除

```yml
orbs:
  aws-cli: circleci/aws-cli@1.3.2

commands:
    remove_security_group_ssh_ip:
      description: "ec2のセキュリティグループからcircleciのipを削除。"
      steps:
        - aws-cli/install
        - run:
            name: "revoke-security-group-ingress"
            command: |
              IP=`curl -s ifconfig.me`
              echo "current executor ip:${IP}"
              echo "#!/bin/bash" > ./sg.sh
              echo "aws configure set region ap-northeast-1" >> ./sg.sh
              echo "aws ec2 revoke-security-group-ingress --group-id $EC2_SECURITY_GROUP_ID \
               --ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges='[{CidrIp=${IP}/32,Description="circle ci"}]'" >> ./sg.sh
              bash ./sg.sh
```

## SCPでファイルを送る。
ドキュメント：
[CircleCI に SSH キーを登録する](https://circleci.com/docs/ja/2.0/add-ssh-key/)

```yml
commands:
    deploy_file:
      parameters:
        file_path:
          type: string
        deploy_target_path:
          type: string
        restart_command:
          type: string

      steps:
        - attach_workspace:
            at: ~/workspace
        # add_ssh_keys でcircle ciの管理画面で登録した秘密鍵を呼び出す。
        - add_ssh_keys:
            fingerprints: # circle ciの管理画面「SSH Keys」に設定したkeyのFingerprintを設定
              - "aaaaaaaaaaaaaaaaaaaaaaaaa"
              - "bbbbbbbbbbbbbbbbbbbbbbbbb"

        # SCPでデプロイ対象のサーバーにファイルを送信。
        - run: scp -o StrictHostKeyChecking=no << parameters.file_path >> $SSH_USERNAME@$TARGET_HOST:<<parameters.deploy_target_path>>

        # remoteのサーバーで再起動コマンドの実行
        - run: echo "ssh -o StrictHostKeyChecking=no $SSH_USERNAME@$TARGET_HOST '<<parameters.restart_command>>'" > restart_command.sh;
        - run: bash ./restart_command.sh
```