とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

GitHub Actions/CircleCIを使ったCIOpsの実践

CI/CDの処理の中で、何らかのテストを行なったあと、Kubernetesクラスターにコンテナアプリケーションをデプロイするということがあると思います。

今回は、CI/CDの研究で最近よく使うGitHub ActionsとCircleCIを使って、Kubernetesへのアプリケーションデプロイを試してみました。

基本的には、両方ともkubeconfigはbase64エンコードしたデータを環境変数に取り込んで、CIの実行時にそれらを呼び出すことにより実現できるようです。GitHub ActionsはGitHub、CircleCIはCircleCI側でこれらのデータを管理します。あとは必要な「パーツ」を組み合わせることでGitベースのアプリケーション管理が可能です。

GitHub Actionsの場合

まずはGitHub Actionsから。

GitHub Actionsには「Actions」という、CI/CD実行時に使えるパーツが用意されています。

github.com

今回は次の2つを使いました。

kubeconfigのbase64エンコードと登録

kubeconfigはbase64エンコードしてGitHub Secretに格納します。詳細は「暗号化されたシークレット」に書かれています。

base64エンコードの方法は、macOSの場合は次のような感じです。

cat ~/Downloads/yourclusters-kubeconfig | base64 > mysecret

CI/CDの定義

CIを定義するYAMLファイルは.github/workflowsディレクトリーの下に用意します。

name: First CI/CD

on:
  - push

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install kubectl
        uses: azure/setup-kubectl@v1
      - name: Run kubectl
        env:
          KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}
        run: |
          echo "$KUBE_CONFIG_DATA" | base64 --decode > /tmp/kube_config
          export KUBECONFIG=/tmp/kube_config
          kubectl apply -f deployment.yaml
          sleep 60
          kubectl get pods

CI/CDの結果はGitHubのプロジェクトのメニューのなかの「Actions」をクリックで確認できます。

CircleCIの場合

CircleCIの場合はちょっと検索すると実行例がすぐ出てきます。 CircleCIはGitHub Actionsの「Action」に相当する「Orbs」というものがあります。

GitHub Actionsは色々なActionを利用しましたが、CircleCIでは「circleci/kubernetes」一個ですみます。

確認した情報

kubeconfigのbase64エンコードと登録

kubeconfigはbase64エンコードして、CircleCIのプロジェクトの「Environment variable」に格納します。

「Environment variable」はCircleCIのプロジェクト設定の中にあり、そこで設定します。呼び出し名のデフォルトはKUBECONFIG_DATAです。

base64エンコードの方法は、macOSの場合は次のような感じです。

cat ~/Downloads/yourclusters-kubeconfig | base64 > mysecret

CI/CDの定義

CIを定義するYAMLファイルは.circleciディレクトリーの下に用意します。

version: '2.1'
orbs:
  kubernetes: circleci/kubernetes@1.3.0
jobs:
  create-update:
    docker:
      - image: 'cimg/base:stable'
    steps:
      - checkout 
      - kubernetes/install-kubeconfig:
          kubeconfig: KUBECONFIG_DATA
      - kubernetes/install-kubectl
      - kubernetes/create-or-update-resource:
          get-rollout-status: true
          resource-file-path: deployment.yaml
          resource-name: deployment/phpapp
          show-kubectl-command: true
workflows:
  kubedeploy-workflow:
    jobs:
      - create-update

CI/CDの結果はCircleCIのパイプライン一覧から、該当のパイプラインを選択すると確認できます。

もしかするとGitHub Actionsも別のActionを組み合わせて使うといい感じに動いてくれるかもしれませんが、比較した結果CircleCIのKubernetes Orbsは作り込まれていて、パラメータを加えるだけで色々結果が出せるので良いですね。

今回GitHub ActionsとCircleCIを使って、Kubernetesクラスターにアプリケーションのデプロイを試してみました。 どちらも同じことはできるものの、今回やりたかったことについてはCircleCIの方が使いやすそうでした。この用途では今後はCircleCIを使おうと思います。