From bfa75a897bf2f0c66cfa2366fd8629637c77447f Mon Sep 17 00:00:00 2001 From: "yukumi.okada" Date: Tue, 12 Nov 2024 19:13:31 +0900 Subject: [PATCH] =?UTF-8?q?=E5=95=8F=E9=A1=8C=E7=82=B9=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- doc/HandsOn_Slide.md | 79 ++++++++++++++++----------------------- docker/Dockerfile.jenkins | 5 +++ docker/compose.yml | 72 +++++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 48 deletions(-) create mode 100644 docker/Dockerfile.jenkins diff --git a/.gitignore b/.gitignore index 8c32236..85b153e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -vscode \ No newline at end of file +vscode +volume diff --git a/doc/HandsOn_Slide.md b/doc/HandsOn_Slide.md index 63831e2..aaf69d3 100644 --- a/doc/HandsOn_Slide.md +++ b/doc/HandsOn_Slide.md @@ -9,7 +9,7 @@ footer: "Jenkins CI/CD ハンズオン" - CI/CDの基礎を理解する - Jenkinsでの自動化ワークフローを体験 -- 簡単なアプリケーションのビルドとテスト +- GiteaとMattermostを活用した簡単なCI/CDパイプライン構築 --- @@ -18,9 +18,8 @@ footer: "Jenkins CI/CD ハンズオン" 1. Jenkinsの概要 2. 「Hello World」ジョブの作成 3. サンプルアプリケーションのビルドとテスト -4. 簡単なデプロイ処理 -5. GitHub Webhookを使った自動トリガー -6. (オプション) Slack通知の設定 +5. Gitea Webhookを使った自動トリガー +6. Mattermost通知の設定 --- @@ -35,16 +34,16 @@ footer: "Jenkins CI/CD ハンズオン" # Step 1: 「Hello World」ジョブの作成 1. **ジョブの作成**: - - 「新しいジョブ作成」 → 「フリースタイルプロジェクト」 + - 「新規ジョブ作成」 → 「フリースタイルプロジェクト」 - ジョブ名を「Hello World」に設定 2. **ビルド設定**: - - 「ビルド」セクション → 「シェルの実行」 + - Build Steps → ビルド手順の追加 → 「シェルの実行」 - コマンド: `echo "Hello, World!"` 3. **実行と確認**: - - 「ビルド」ボタンをクリック - - コンソール出力で結果を確認 + - 「ビルド実行」ボタンをクリック + - Buildsに追加された履歴を開き、コンソール出力で結果を確認 --- @@ -77,76 +76,62 @@ if __name__ == "__main__": # Step 2 (続き): ビルドとテストの自動化 1. **新規ジョブ作成**: - - 「新しいジョブ作成」 → 「フリースタイルプロジェクト」 + - 「新規ジョブ作成」→「フリースタイルプロジェクト」 - ジョブ名:「Pythonアプリビルドとテスト」 -2. **Gitリポジトリの設定**: +2. **Giteaリポジトリの設定**: - 「ソースコード管理」→「Git」を選択 - - リポジトリURLを入力 + - リポジトリURLを入力、資格情報を追加 + - 「ビルドするブランチ」を「main」に変更 3. **ビルド設定**: - - 「シェルの実行」→ `python3 -m unittest test_app.py` + - Build Steps →「シェルの実行」→ `python3 -m unittest test_app.py` 4. **実行と確認**: - ジョブを実行し、テスト結果を確認 --- -# Step 3: デプロイ処理の追加 +# Step 3: Gitea Webhookでの自動トリガー -1. **アーティファクト保存**: - - 「ビルド後の処理」 → 「アーカイブするアーティファクト」 - - 保存するファイル:`*.zip` +1. **ビルド・トリガの設定**: + - 「ビルド・トリガ」→「GitHub hook trigger for GITScm polling」を有効化 -2. **シェルコマンド追加**: - - 「シェルの実行」→ `zip -r app.zip .` - -3. **実行と確認**: - - ジョブ実行後、ZIPファイルが生成され、アーティファクトとして保存されていることを確認 - ---- - -# Step 4: GitHub Webhookでの自動トリガー - -1. **ビルドトリガーの設定**: - - 「ビルドトリガー」→「GitHub hook trigger for GITScm polling」 - -2. **GitHubの設定**: - - GitHubリポジトリの「Settings > Webhooks」→ Webhook追加 - - URL例: `http://localhost:8081/github-webhook/` +2. **Giteaの設定**: + - Giteaリポジトリの 設定 → Webhook → Webhook追加 → Gitea + - URL: `http://<使っているjenkinsのURL>/gitea-webhook/` - Content typeは`application/json` 3. **確認**: - - GitHubに変更をプッシュし、Jenkinsでジョブが自動的に実行されることを確認 + - Giteaリポジトリに変更をプッシュし、Jenkinsでジョブが自動的に実行されることを確認 --- -# Step 5 (オプション): Slack通知の設定 +# Step 4: Mattermost通知の設定 -1. **Slackプラグイン設定**: - - JenkinsにSlack Notification Pluginをインストール - - SlackのワークスペースでWebhookを設定し、トークンを取得 +1. **Mattermost Webhookの設定**: + - Mattermostの統合機能で「内向きのウェブフック」を選択 + - 新しいWebhookを作成し、Webhook URLを取得 + - 通知先のチャンネルを指定 -2. **Slack通知の追加**: - - 「ビルド後の処理」→「Slack通知」 - - 成功時・失敗時の通知を設定 +2. **JenkinsのMattermost通知設定**: + - Jenkinsのプラグイン管理から「Mattermost Notification」をインストール + - ジョブの「ビルド後の処理」で「Mattermost Notifications」を追加し、Webhook URLや通知内容を設定 + - EndpointがWebhook URLでProject Channelは通知送信先チャンネル名 3. **通知の確認**: - - ビルド実行後、Slackに通知が届くことを確認 + - ビルド実行後、Mattermostに通知が届くことを確認 --- # まとめ -- JenkinsでCI/CDの基本フローを体験 -- 手動ジョブ作成、Gitリポジトリ連携、自動テスト、デプロイ、通知 +- Jenkins、Gitea、Mattermostを使ったCI/CDの基本フローを体験 +- 手動ジョブ作成、Giteaリポジトリ連携、自動テスト、デプロイ、通知 - CI/CDの自動化とそのメリットを理解 --- # お疲れ様でした! -- Jenkinsの基本操作を学べましたか? -- 継続的インテグレーションとデリバリーの流れを理解できましたか? - -Jenkinsを使ったCI/CDにぜひ挑戦してみてください! +CI/CDにぜひ挑戦してみてください! diff --git a/docker/Dockerfile.jenkins b/docker/Dockerfile.jenkins new file mode 100644 index 0000000..db2f149 --- /dev/null +++ b/docker/Dockerfile.jenkins @@ -0,0 +1,5 @@ +FROM jenkins/jenkins:lts + +USER root +RUN apt-get update && apt-get install -y python3 python3-pip +USER jenkins diff --git a/docker/compose.yml b/docker/compose.yml index b2f83f4..ee530e2 100644 --- a/docker/compose.yml +++ b/docker/compose.yml @@ -1,7 +1,10 @@ services: jenkins1: + build: + dockerfile: Dockerfile.jenkins image: jenkins/jenkins:lts container_name: jenkins1 + restart: always ports: - "8081:8080" volumes: @@ -10,12 +13,16 @@ services: environment: - JENKINS_USER=admin - JENKINS_PASS=password + - TZ=Asia/Tokyo networks: - jenkins_network jenkins2: + build: + dockerfile: Dockerfile.jenkins image: jenkins/jenkins:lts container_name: jenkins2 + restart: always ports: - "8082:8080" volumes: @@ -24,12 +31,16 @@ services: environment: - JENKINS_USER=admin - JENKINS_PASS=password + - TZ=Asia/Tokyo networks: - jenkins_network jenkins3: + build: + dockerfile: Dockerfile.jenkins image: jenkins/jenkins:lts container_name: jenkins3 + restart: always ports: - "8083:8080" volumes: @@ -38,12 +49,16 @@ services: environment: - JENKINS_USER=admin - JENKINS_PASS=password + - TZ=Asia/Tokyo networks: - jenkins_network jenkins4: + build: + dockerfile: Dockerfile.jenkins image: jenkins/jenkins:lts container_name: jenkins4 + restart: always ports: - "8084:8080" volumes: @@ -52,12 +67,16 @@ services: environment: - JENKINS_USER=admin - JENKINS_PASS=password + - TZ=Asia/Tokyo networks: - jenkins_network jenkins5: + build: + dockerfile: Dockerfile.jenkins image: jenkins/jenkins:lts container_name: jenkins5 + restart: always ports: - "8085:8080" volumes: @@ -66,6 +85,59 @@ services: environment: - JENKINS_USER=admin - JENKINS_PASS=password + - TZ=Asia/Tokyo + networks: + - jenkins_network + + gitea: + image: gitea/gitea:latest + container_name: gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - GITEA__database__DB_TYPE=sqlite3 + - GITEA__database__PATH=/data/gitea/gitea.db + - GITEA__server__ROOT_URL=http://192.168.36.39:3000/ + - GITEA__service__ALLOW_ONLY_EXTERNAL_REGISTRATION=false + - GITEA__service__DISABLE_REGISTRATION_EMAIL_CONFIRMATION=true + - GITEA__webhook__ALLOWED_HOST_LIST=192.168.36.39 + - TZ=Asia/Tokyo + ports: + - "3000:3000" + - "2222:22" + volumes: + - ./volume/gitea_data:/data + networks: + - jenkins_network + + mattermost: + image: mattermost/mattermost-team-edition:latest + container_name: mattermost + environment: + - MM_SQLSETTINGS_DRIVERNAME=mysql + - MM_SQLSETTINGS_DATASOURCE=mattermost:mattermost@tcp(mysql:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s + - MM_SERVICESETTINGS_SITEURL=http://192.168.36.39:4000 + - MM_SERVICESETTINGS_DEFAULTLOCALE=ja + - MM_EMAILSETTINGS_REQUIREEMAILVERIFICATION=false + - TZ=Asia/Tokyo + ports: + - "4000:8065" + volumes: + - ./volume/mattermost_data:/mattermost/data + networks: + - jenkins_network + + mysql: + image: mysql:8.0 + container_name: mysql + environment: + - MYSQL_ROOT_PASSWORD=password + - MYSQL_DATABASE=mattermost + - MYSQL_USER=mattermost + - MYSQL_PASSWORD=mattermost + - TZ=Asia/Tokyo + volumes: + - ./volume/mysql_data:/var/lib/mysql networks: - jenkins_network