LoginSignup
5
2

More than 1 year has passed since last update.

OCI DevOps で Oracle Functions の CI/CD - パイプライン作成編

Last updated at Posted at 2021-12-04

はじめに

こちらの記事は、Oracle Cloud Infrastructure Advent Calendar 2021 その 2 の Day 5 の記事として書かれています。
今回は、10 月後半に全機能が揃った OCI DevOps に関する記事です。OKE の方はきっと誰かが書いてくれることを願って私の方では Oracle Functions に特化した内容で書きたいと思います。内容が結構ボリューミーになりそうなので全 2 回に分けたいと思います。

2022/01/19 追記: Oracle Cloud Infrastructure(OCI) DevOpsことはじめ
OCI Tutorials に DevOps & OKE のハンズオンが追加されたので、OKE で同様の事を実施したい場合はこちらをご参照ください。

  1. 事前準備編
  2. ビルド、デプロイメント・パイプライン作成編 ← 本記事はこれ

今回は、ビルド、デプロイメント・パイプライン作成編です。

今回作る環境

全 2 回を通してこのような環境を作ってみます。

image01.png

ソースコード本体は、コミュニケーション機能(Issue, Wiki, etc.)が充実している GitHub, GitLab で管理し、バックアップを取るためにソースコードを Code Repository へミラーリングする実際の開発現場でよく取られそうな構成です。

実際に作ってみる

前提

ビルド・パイプライン

GitHub からのミラーリングの設定 ~ OCIR1 に Oracle Functions の Docker Image を push する所までを作っていきます。図で表すと以下の赤線の箇所を作成していきます。

image17.png

外部接続の定義

まずは、GitHub → Code Repository に対するミラーリングの設定を行うための接続定義を行います。OCI コンソール左上のハンバーガーメニューから開発者サービス > プロジェクトと選択します。

image18.png

先ほど、作成した DevOps のプロジェクトの詳細画面から外部接続を選択します。

image19.png

外部接続の作成を押し、以下のように入力して外部接続を新しく定義します。

  • 名前: github-connection
  • タイプ: GitHub
  • ボールト・シークレット
    • ボールト: 作成済みの Vault(GitHub の PAT が格納されている Vault を選択する)
    • シークレット: GitHub の PAT

image20.png

これで、ミラーリングのための外部接続設定は完了です。

リポジトリのミラーリング設定

ミラーリングの設定を行います。作成済みの DevOps プロジェクトの詳細画面からコード・リポジトリを選択します。

image21.png

リポジトリのミラー化を選択します。

image22.png

以下のように入力して、ミラー先のリポジトリを定義します。

  • 接続: github-connection
  • リポジトリ: fn-examples
  • ミラーリング・スケジュール
    • スケジュール・タイプ: カスタム
    • ミラーリング間隔: 15 分(最短 1 分から設定可能なので、お好きな値に設定してください)
  • 名前: github_fn-examples

これで、ミラー先のリポジトリの作成が完了です。

build_spec.yaml の作成

いよいよ、ビルドを行うための設定ファイルを書いていきます。build_spec.yaml の仕様に関しては OCI Document - ビルド指定をご参照ください。今回は、以下のような設定ファイルを fn-examples/fn-hello/に配置します。

build_spec.yaml
# https://docs.oracle.com/ja-jp/iaas/Content/devops/using/build_specs.htm
# build runner config
version: 0.1
component: build
timeoutInSeconds: 10000
shell: bash
env: # ... 1
  variables:
    function_name: fn-hello
    function_version: 0.0.2
  exportedVariables:
    - tag

# steps
steps:
  - type: Command
    name: "Docker image build"
    timeoutInSeconds: 4000
    command: |
      cd fn-hello
      fn build
      docker tag ${function_name}:${function_version} fn-hello-image
      tag=${function_version}
    onFailure:
      - type: Command
        command: |
          echo "Failure successfully handled"
        timeoutInSeconds: 60

outputArtifacts:
  - name: fn-hello-image
    type: DOCKER_IMAGE
    location: fn-hello-image

いくつか、ポイントがあるので簡単に補足します。

  1. パイプライン中に使用する変数を定義しています。
    • variables(パイプライン中に使用する変数)
      • function_name: 作成した関数名(fn-hello)
      • function_version: func.yaml に記載のある関数のバージョン
    • exportedVariables(後続のステージに渡す変数を定義)
      • tag: 実際に OCIR に push されるときの Docker Image のバージョン
  2. Docker Image のビルドを Fn CLI のビルドオプション(fn build)を用いて実施しています。また、作成される Docker Image は今回の場合だと fn-hello:0.0.2 という名前が付けられているので、それを docker tag ...fn-hello-image に変更しています。次に、実際に push する際のバージョンを tag=${function_version}で設定し、アーティファクトの配信ステージで活用します。(単純に Commit Hash(${OCI_TRIGGER_COMMIT_HASH})を使うのでも良いと思います。)
  3. 次のステージ(アーティファクトの配信)で使うためのアーティファクトを指定します。

作成した build_spec.yaml は GitHub に push しておきます。

# ./fn-examples
git add fn-hello/build_spec.yaml
git commit -m "Added build_spec.yaml"
git push origin main

ビルド・パイプラインの作成

前工程で作成した build_spec.yaml を実際に適用するビルド・パイプラインを作成していきます。作成済みの DevOps プロジェクトの詳細画面からビルド・パイプラインを選択します。

image23.png

ビルド・パイプラインの作成をクリックし、以下のように入力しビルド・パイプラインを新規に作成します。

  • 名前: fn-hello-build-pipeline

image24.png

作成したビルド・パイプラインの詳細画面でステージの追加を押し、新規にステージを作成します。

image25.png

ステージ・タイプの選択でマネージド・ビルドを選択し、を押します。

image26.png

以下のように入力し、ビルド・ステージを追加します。

  • ステージ名: build_stage
  • ビルド指定ファイル・パス: fn-hello/build_spec.yaml
  • プライマリ・コード・リポジトリ
    • ソース: 接続タイプ: github_fn-examples
    • ブランチの選択: main
    • ソース名の作成: fn-hello

image27.png

次に、build_stage で生成し outputArtifact として出力した Oracle Functions の Docker Image を OCIR へプッシュするステージを作成します。build_stage 下の"+"アイコンをクリックし、ステージの追加を選択します。

image30.png

ステージ・タイプとしてアーティファクトの配信を選択します。

image31.png

以下のように入力します。

  • ステージ名: image_push
  • アーティファクトの作成を選択
    • 名前: fn-hello-image
    • タイプ: コンテナ・イメージ・リポジトリ
    • コンテナ・レジストリへの完全修飾パス: <region-key>.ocir.io/<namespace>/devops/fn-hello:${tag}
    • このアーティファクトで使用するパラメータの置き換え: はい、プレースホルダーを置き換えます
  • ビルド構成/結果アーティファクト名: build_spec.yaml で outputArtifact として指定した名前(fn-hello-image)

image32.png

これで、ビルドパイプラインが起動された際に Oralce Functions の Docker Image の作成と OCIR へプッシュを行うビルド・パイプラインが作成できました。

トリガーの設定

作成したビルド・パイプラインを起動するためのトリガーを作成します。作成済みの DevOps プロジェクトの詳細画面からトリガーを選択します。

image28.png

トリガーの作成を押し、以下のように入力します。

  • 名前: fn-hello-trigger
  • ソース接続: OCI コード・リポジトリ
  • コード・リポジトリの選択: github_fn-examples
  • アクションの追加
    • ビルド・パイプラインの選択: fn-hello-build-pipeline
    • イベント: プッシュにチェックを入れる

image29.png

これで、GitHub へソースコードの変更を push し OCI の Code Repository と同期がとられたタイミングで作成したビルド・パイプラインが動作するところまで作成することが出来ました。

image17.png

デプロイメント・パイプライン

いよいよ、ビルド・パイプラインで作成した Docker Image を Oracle Functions へデプロイするパイプラインを作成していきます。図で表すと以下の赤線の箇所を作成していきます。

image45.png

環境の作成

まずは、デプロイ先の環境を定義します。作成済みの DevOps プロジェクトの詳細画面から環境を選択します。

image33.png

環境の作成を押し、以下のように入力します。

  • 環境タイプ: ファンクション
  • 名前: fn-hello-env

image34.png

環境詳細で以下のように入力します。

  • リージョン: 自分がリソースを配置するリージョンを選択
  • コンパートメント: 自分がリソースを配置するコンパートメントを選択
  • アプリケーション: devops-app
  • ファンクション: fn-hello

image35.png

デプロイメント・パイプラインの作成

定義した環境にデプロイするためのパイプラインを作成します。作成済みの DevOps プロジェクトの詳細画面からデプロイメント・パイプラインを選択します。

image36.png

パイプラインの作成を押し、以下のように入力します。

  • パイプライン名: fn-hello-deploy-pipeline

image37.png

ステージの追加を押します。

image38.png

タイプとして、ファンクション用のステージを選択します。

image39.png

以下のように入力します。

  • ステージ名: deploy_stage
  • 環境: fn-hello-env
  • アーティファクトの選択から、fn-hello-image を選択します

image40.png

これで、デプロイメント・パイプラインの作成は完了です。

ビルド・パイプラインの連携設定

最後に、作成したビルド・パイプラインとデプロイメント・パイプラインを連携させます。作成済みの DevOps プロジェクトの詳細画面からビルド・パイプラインを選択します。

image23.png

先ほどの手順で作成した fn-hello-build-pipeline を選択します。image_push の下の"+"アイコンを押します。

image41.png

ステージの選択でデプロイメントのトリガーを選択します。

image42.png

以下のように入力します。

  • ステージ名: deploy_stage
  • デプロイメント・パイプラインの選択を押し、作成済みの fn-hello-deploy-pipeline を選択します。

image43.png

最終的に以下のような状態になっていればパイプライン作成は完了です!

image44.png

実際に動かしてみる

今回は、手動で実行します。ビルド・パイプラインから手動実行の開始をクリックします。

しばらく時間が経過すると、パイプラインの実行が成功したことが確認できます。

image46.png

また、OCIR にて build_spec.yaml で設定した${tag}のイメージが生成されていることからも確認できます。

image47.png

以降は、ソースコード等に対する変更が行われ、Code Repository にその変更が反映(ミラー)されたことをトリガーとし、パイプラインが実行されます。

終わりに

OCI Native な CI/CD サービスが全て揃ったので、さらに開発体験が良くなりますね!是非試してみてください!
また、今回使用したソースコード等は https://github.com/shukawam/fn-examples に格納しています。

参考


  1. Oracle Container Infrastructure Refistry 

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2