ワークショップ管理者向けのJenkins構築設定. また、利用者分のPodで利用するPVCの事前作成が必要。
$ oc new-project app-devops
$ oc new-app jenkins-persistent --param ENABLE_OAUTH=true --param MEMORY_LIMIT=8Gi --param VOLUME_CAPACITY=20Gi --param DISABLE_ADMINISTRATIVE_MONITORS=true
...
--> Success
Access your application via route 'jenkins-app-devops.apps.na311.openshift.opentlc.com'
Run 'oc status' to view your app.
$ for i in `seq 1 10`
do
oc new-project user$i-development
oc policy add-role-to-user edit system:serviceaccount:app-devops:jenkins -n user$i-development
oc policy add-role-to-user edit user$i -n app-devops
done
$ oc process -f openshift/custom-jenkins-agent.yaml | oc apply -n app-devops -f -
buildconfig.build.openshift.io/custom-jenkins-agent-maven created
imagestream.image.openshift.io/custom-jenkins-agent-maven created
$ oc start-build custom-jenkins-agent-maven -n app-devops
Githubでこのレポジトリをフォークし、自分のアカウントにレポジトリをコピーしましょう。 また1箇所変更が必要です。Jenkinsfileの13行目を自分のプロジェクト名に変更しましょう。
$ vim Jenkinsfile
deploy_project = "userX-development"
agent
部分を次に差し替えることで、mavenのキャッシュを利用するためビルド速度を改善できます。
agent {
kubernetes {
cloud 'openshift'
yaml """\
apiVersion: v1
kind: Pod
spec:
serviceAccountName: jenkins
volumes:
- name: m2-volume
persistentVolumeClaim:
claimName: shared-m2
containers:
- name: jnlp
image: image-registry.openshift-image-registry.svc:5000/app-devops/custom-jenkins-agent-maven
args: ['\$(JENKINS_SECRET)', '\$(JENKINS_AGENT_NAME)']
volumeMounts:
- mountPath: "/home/jenkins/.m2"
name: m2-volume
- name: postgres
image: image-registry.openshift-image-registry.svc:5000/openshift/postgresql:13-el8
env:
- name: POSTGRESQL_USER
value: 'freelancer'
- name: POSTGRESQL_PASSWORD
value: 'password'
- name: POSTGRESQL_DATABASE
value: 'freelancerdb_test'
""".stripIndent()
}
}
Jenkinsへアクセスできるか確認しましょう。
- URL: https://jenkins-app-devops.apps.cluster-mf7f2.mf7f2.sandbox1686.opentlc.com
- ID/PW: Gitlabのアカウントです
アプリケーションのパイプラインを実行するためにJenkins Itemを作成する。
- "New Item"を選択
- Itemの種類は"Pipeline"を選択し、
userX-job
の名前をつける。わかりやすいようにユーザ名を先頭に付けてください。 - "Build Triggers"項目で"Generic Webhook Trigger"にチェックを付け下記を設定する
- token: 任意の文字列(他の人とかぶらないようにユーザ名を含めてください。)
- "Pipeline"の項目で実行するパイプライン定義を設定する
- "pipeline script from SCM"を選択
- SCMに"Git"を選択
- Repository URLにはフォークした自分のレポジトリのURLを入力
- Branches to buildは
*/main
を入力 - これでSave
お使いのGitレポジトリへWebhookの設定を行う。 Generic Webhook Triggerの場合下記のURLでトリガーできる。
https://jenkins-app-devops.apps.cluster-mf7f2.mf7f2.sandbox1686.opentlc.com/generic-webhook-trigger/invoke?token=<your-token>
ここまでできたらパイプラインを実行すれば、アプリケーションがデプロイされる。 アプリケーションの変更にも自動でデプロイできる状態だ。 レポジトリに任意の変更を加えてみよう。
パイプラインが正常に終了すれば、みなさんの専用の環境でアプリケーションが起動している状態になります。
http://pipeline-practice-java-userX-development.apps.cluster-mf7f2.mf7f2.sandbox1686.opentlc.com
からアクセスできます。
Curlでもブラウザでもアクセス可能です。
$ curl pipeline-practice-java-user1-development.apps.cluster-mf7f2.mf7f2.sandbox1686.opentlc.com/hello
{
"foo": "bar",
"hello": "world"
}
$ curl pipeline-practice-java-user1-development.apps.cluster-mf7f2.mf7f2.sandbox1686.opentlc.com/freelancers
[
{
"freelancerId": "1",
"firstName": "Ken",
"lastName": "Yasuda",
"email": "ken.yasuda@example.com",
"skills": [
"ruby",
"php",
"mysql"
]
},
{
"freelancerId": "2",
"firstName": "Tadashi",
"lastName": "Komiya",
"email": "tadashi.komiya@example.com",
"skills": [
"c#",
"windows",
"sqlserver"
]
},
{
"freelancerId": "3",
"firstName": "Taro",
"lastName": "Goto",
"email": "taro.goto@example.com",
"skills": [
"ruby",
"postgresql",
"java"
]
}
]
$ curl pipeline-practice-java-user1-development.apps.cluster-mf7f2.mf7f2.sandbox1686.opentlc.com/freelancers/1
{
"freelancerId": "1",
"firstName": "Ken",
"lastName": "Yasuda",
"email": "ken.yasuda@example.com",
"skills": [
"ruby",
"php",
"mysql"
]
}
ここまでできたところで、一度なにが行われたのか解説します。
- Jenkinsfile
- test
- application build
- deploy
- Jenkins agent
現状のサンプルアプリケーションでは/hello
は"hello": "world"
を含むAPIを返すことがテストとして書かれています。
src/main/java/com/redhat/freelancer4j/freelancer/rest/HealthCheckEndpoint.java
の34行目の map.put("hello", "world");
を任意の文字列に変更してパイプラインを実行させてみよう(Webhookの設定をしていれば、自動的にパイプラインが実行されるはずです)。
パイプラインの結果がどうなったか確認してみましょう。
@GET
@Path("/hello")
@Produces(MediaType.APPLICATION_JSON)
public Map<String, String> getHello() {
HashMap<String, String> map = new HashMap<>();
map.put("hello", "world!!!!!");
map.put("foo", "bar");
return map;
}
上で落ちてしまったパイプラインを修正するため、src/test/java/com/redhat/freelancer4j/freelancer/rest/HealtCheckEndpointTest.java
のテストを変更して変更をデプロイしてみます。デプロイ成功後、/hello
に接続して、意図したようにアプリケーションが変更されていることを確認しましょう。
@Test
public void invokeHello() throws Exception {
given().get("/hello").then().assertThat().statusCode(200).body("hello", equalTo("world!!!!!"));
}
sonarqubeのURL: https://sonarqube-sonarqube-app-devops.apps.cluster-mf7f2.mf7f2.sandbox1686.opentlc.com