こんにちわ、菊村です。
OpenShiftに触れているので備忘録としてこちらに記録します。

OpenShiftってなに?

RedHat社が提供しているKubernetesの管理と実行を容易にGUIコンソール、専用のCLI(OC)から楽にしてくれるKubernetesコンテナプラットフォームです。 自分自身はこれまでAWSやGCPのクラウドインフラの設計構築をやってきていますが、Docker、Kubernetesはプライベートで触ってるくらいでまだまだ素人の域です。しかし、このOpenShiftを使うとDockerイメージやGitリポジトリなどの概念がちょっとわかってればすぐにアプリケーションをデプロイしてクラスターを構築し実行できるようになるのです。

PodやNetwork、Storage、デーモン、CI/CDなどさまざまな機能がありますが、お試しで30日から60日間、無料で使うことができます。聞くより触るが易し!

OpenShiftでCI/CDなJava SpringBootを構築してみた

ここではOpenShiftの構築については省略(後で追記するかもしれません)させていただき、開発者サンドボックスにGitHubにあるアプリケーションコードをOpenShift管理コンソールからデプロイする手順を紹介します。あまりググっても情報が出て来なかったため誰かの参考になるかもしれません。

開発者サンドボックスであればパブリッククラウドやローカルマシンに構築することなくすぐに検証を始めることができます。※RedHatのアカウントを作成する必要はあります(無料です)。

ログイン後にAdministrartor画面から開発者画面に切り替えます。

管理者→開発者

追加 > ソースカタログをクリック

Jenkinsを選択し作成する

トポロジーにJenkinsが追加されます(Jenkinsが起動できるようになるまで10分程度かかるかも)。

URLを開きます。

Jenkinsに接続できることを確認します。

Jenkinsに接続できることを確認したら再びOpenShiftに戻ります。
ビルドを選択します。

BuildConfigの作成をクリックします。

BuildConfigはフォームビューかYAMLビューで作成できます。
今回はYAMLビューで作成します。

デフォルトだと以下の構文です。

apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
  namespace: izumi777888888-dev
spec: {}
コンソールで見るとこんな感じです

これを今回はJavaのSpringBootで編集します。

ind: BuildConfig
apiVersion: build.openshift.io/v1
metadata:
  name: test-ci-cd # 任意の名前を指定
  namespace: izumi777888888-dev # プロジェクトを指定します(コンソールの上部に表示されています)。
spec:
  nodeSelector: null
  output: {}
  resources: {}
  successfulBuildsHistoryLimit: 5
  failedBuildsHistoryLimit: 5
  strategy:
    type: JenkinsPipeline       # JenkinsPipelineを指定します
    jenkinsPipelineStrategy:
      jenkinsfilePath: Jenkinsfile  # PipelineScriptを記述しているJenkinsfileを指定
  postCommit: {}
  source: # コードを取得するターゲットを指定します。※ここではGitHubの自分のリポジトリを指定
    type: Git
    git:
      uri: 'https://github.com/izumi777777/openshift-jenkins-cicd.git'
      ref: main
  triggers:
    - type: ConfigChange
  runPolicy: Serial

※ Jenkinsfileとは
Jenkinsはビルドの実行をBashスクリプトやWindowsスクリプトなどで記述することができ、中でもPipelineScriptで記述することが有名?らしいです。ここでは取得してくるリポジトリに”Jenkinsfile”をあらかじめ作成し、BuildConfigの”strategy”セクションで指定してあげています。

pipeline
    {
       agent {
            label 'maven'
        }
        stages
        {
          stage('Build App')
          {
            steps
             {
              git branch: 'main', url: 'https://github.com/izumi777777/openshift-jenkins-cicd.git' // ここでも取得するGitHubリポジトリのURLとブランチを指定します。
              script {
                  def pom = readMavenPom file: 'pom.xml'
                  version = pom.version
              }
              sh "mvn install"
            }
          }
          stage('Create Image Builder') {
            when {
              expression {
                openshift.withCluster() {
                  openshift.withProject() {
                    return !openshift.selector("bc", "sample-app-jenkins-new").exists();
                  }
                }
              }
            }
            steps {
              script {
                openshift.withCluster() {
                  openshift.withProject() {
                    openshift.newBuild("--name=sample-app-jenkins-new", "--image-stream=openjdk18-openshift:1.14-3", "--binary=true")
                  }
                }
              }
            }
          }
          stage('Build Image') {
            steps {
              sh "rm -rf ocp && mkdir -p ocp/deployments"
              sh "pwd && ls -la target "
              sh "cp target/openshiftjenkins-0.0.1-SNAPSHOT.jar ocp/deployments"
              script {
                openshift.withCluster() {
                  openshift.withProject() {
                    openshift.selector("bc", "sample-app-jenkins-new").startBuild("--from-dir=./ocp","--follow", "--wait=true")
                  }
                }
              }
            }
          }
          stage('deploy') {
            when {
              expression {
                openshift.withCluster() {
                  openshift.withProject() {
                    return !openshift.selector('dc', 'sample-app-jenkins-new').exists()
                  }
                }
              }
            }
            steps {
              script {
                openshift.withCluster() {
                  openshift.withProject() {
                    def app = openshift.newApp("sample-app-jenkins-new", "--as-deployment-config")
                    app.narrow("svc").expose();
                  }
                }
              }
            }
          }
        }
    }


BuildConfig作成後

BuildConfig

Jenkinsfile(PipelineScript)を確認してみるとImageに”–image-stream=openjdk18-openshift:1.14-3″を指定しているかと思います。ここはOpenShiftの”ImageStreams”に予めイメージをYamlで宣言してあげる必要があります。

まずはOpenShiftコンソール管理画面を開発者から管理者向けに切り替えます。

ビルド内にあるImageStreamsを選択します。


ImageStreams作成から以下のYamlに書き換えます(参考まで)。

デフォルトImageStream
openjdk18-openshift:1.14-3のイメージ指定の例
apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
  name: openjdk18-openshift
  namespace: izumi777888888-dev
spec:
  tags:
    - name: "1.14-3"  # タグ名を指定
      from:
        kind: DockerImage
        name: registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift:1.14-3  # イメージのURLを指定

次にGitHubのWebHook用のシークレットを2つ作成します。1つ目はGitHubの変更をWebHookするためのシークレット、二つ目はGeneric用のシークレットを作成します。
OpenShiftコンソールを管理者から開発者へ切り替えます。

一番下段にあるシークレットを選択します。

Webhookシークレットを選択しシークレットをGithub用と、Generic用を2本作成しシークレット名をメモします。

generic
github

シークレット名は小文字で作成しましょう。大文字を入れるとエラーになります。
シークレットを作成後はBuildConfigに戻り作成したシークレット名をtriggersのgithubとgenericにそれぞれシークレット名で指定します。入力後は保存をクリックします。

kind: BuildConfig
apiVersion: build.openshift.io/v1
metadata:
  name: test-ci-cd
  namespace: izumi777888888-dev
  uid: f6d80a67-0bd2-4bf9-837c-8c72f5915011
  resourceVersion: '3057551028'
  generation: 3
  creationTimestamp: '2023-09-17T16:18:00Z'
  managedFields:
    - manager: openshift-apiserver
      operation: Update
      apiVersion: build.openshift.io/v1
      time: '2023-09-17T16:18:00Z'
      fieldsType: FieldsV1
      fieldsV1:
        'f:status':
          'f:lastVersion': {}
    - manager: Mozilla
      operation: Update
      apiVersion: build.openshift.io/v1
      time: '2023-09-17T16:48:59Z'
      fieldsType: FieldsV1
      fieldsV1:
        'f:spec':
          'f:failedBuildsHistoryLimit': {}
          'f:runPolicy': {}
          'f:source':
            'f:git':
              .: {}
              'f:ref': {}
              'f:uri': {}
            'f:type': {}
          'f:strategy':
            'f:jenkinsPipelineStrategy':
              .: {}
              'f:jenkinsfilePath': {}
            'f:type': {}
          'f:successfulBuildsHistoryLimit': {}
          'f:triggers': {}
spec:
  triggers:
    - type: GitHub
      github:
        secret: cicegithub
    - type: Generic
      generic:
        secret: cicdtestgeneric
    - type: ConfigChange
  runPolicy: Serial
  source:
    type: Git
    git:
      uri: 'https://github.com/izumi777777/openshift-jenkins-cicd.git'
      ref: main
  strategy:
    type: JenkinsPipeline
    jenkinsPipelineStrategy:
      jenkinsfilePath: Jenkinsfile
  output: {}
  resources: {}
  postCommit: {}
  nodeSelector: null
  successfulBuildsHistoryLimit: 5
  failedBuildsHistoryLimit: 5
status:
  lastVersion: 1

シークレットを指定後にBuildConfigの下段にWebhookのGitHub、Genericのシークレットがそれぞれ表示されます。この値をそれぞれコピーしてメモ帳などに貼り付けてGitHubのWebhookの設定に追加します。

設定後は念の為、接続ができるか確認しましょう。

OpenShiftコンソール画面に戻り該当するBuildのビルドの詳細から最初のビルドが始まってることが確認できます。

ビルドが完了したのでトポロジーに戻ってアプリケーションがデプロイされたことを確認します。

パスを/helloで指定しているためURLにhelloを指定します。

JavaのSpringBootのアプリケーションをOpneShfitのPodにデプロイすることができました( ・∇・)

CI/CDできるかやってみる

試しにコードを変更してGitHubリポジトリにPushしてみます。

もう一度ブラウザを確認!っと思ったらスクショを取り忘れ環境も消してしまったためここでは掲載ができないですが、しっかりブラウザで更新した通りのコードが反映されていました。

投稿者 izumi kikumura

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です