こんにちわ、菊村です。
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作成後
Jenkinsfile(PipelineScript)を確認してみるとImageに”–image-stream=openjdk18-openshift:1.14-3″を指定しているかと思います。ここはOpenShiftの”ImageStreams”に予めイメージをYamlで宣言してあげる必要があります。
まずはOpenShiftコンソール管理画面を開発者から管理者向けに切り替えます。
ビルド内にあるImageStreamsを選択します。
ImageStreams作成から以下のYamlに書き換えます(参考まで)。
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本作成しシークレット名をメモします。
シークレット名は小文字で作成しましょう。大文字を入れるとエラーになります。
シークレットを作成後は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してみます。
もう一度ブラウザを確認!っと思ったらスクショを取り忘れ環境も消してしまったためここでは掲載ができないですが、しっかりブラウザで更新した通りのコードが反映されていました。