[[422238]] 単一のアプリケーションと環境 複数のアプリケーションと環境 CI 継続的インテグレーションまず、コードベースを準備します。 https://github.com/DevOpsCICDCourse/microservicescicd/blob/main/microservice-demo-service-master.zip CI パイプラインのステップを整理してみましょう。 - 今回実装したコードリポジトリタイプは単一リポジトリ、つまり 1 つのリポジトリに複数のサービスモジュールコードが格納され、各サブディレクトリがサービスモジュールとなります。
- まず、継続的インテグレーション パイプラインは、現在のコミットがどのサービス コードであるかを正しく取得できる必要があります。
- サービスを決定し、サービス コードをダウンロードして、コンパイルとパッケージ化、単体テスト、コード スキャン、イメージの構築などの手順を実行します。
コミットサービス情報を取得するにはどうすればよいですか?ここでは、GitLab WebHook 関数と Jenkins ジョブ ビルド トリガーを使用してこれを実現します。 ワークフローは次のとおりです。Gitlab でコードを送信すると、GitLab Webhook を通じて Jenkins Scheduler ジョブがトリガーされ、送信されたコードによって生成されたフック データが POST モードで Jenkins ジョブに渡されます。この時点で、Generic Hook プラグインを使用してこの POST リクエストによって送信されたリクエスト本文情報を取得するように Jenkins ジョブを記述できます。これは JSON データです。ジョブの実行後、変更されたサービス モジュール情報を取得するために JSON でデータを解析するパイプラインを記述します。最後に、対応するサービスの CI ジョブが構築のためにトリガーされます。 CI スケジューラ ジョブこのジョブでは、Webhook を有効にしてトリガー トークン (一意性) を構成することだけが必要です。 hookurl を生成します: http://jenkins.idevops.site/generic-webhook-trigger/invoke?token=microservicecicd-scheduler-CI ジェンキンスファイル- パイプライン
- エージェント
-
- ステージ{
-
- ステージ( "GetData" ){
- ステップ{
- スクリプト {
- echo "${webHookData}"
-
- データ = readJSON テキスト: "${webHookData}"
-
- println(データ)
-
- env.branchName = data.ref - "refs/heads/"
- env.commitId = data.checkout_sha
- env.projectId = データ.プロジェクトID
- commits = data[ "コミット" ]
-
- println( "${env.branchName}" )
- println( "${env.commitID}" )
- println( "${env.projectId}" )
-
- //env.moduleName = "service01"
- 変更サービス = []
- (コミット コミット内){
- println(コミット.id)
-
- //追加した
- (追加 で コミット.added) {
- s =リストとして.split( "/" )を追加
- ( s.size ()> 1)の場合{
- (changeServices.indexOf(s[0]) == -1)の場合{
- サービスを変更します。追加(s[0])
- }
- }
- }
-
- //変更済み
- (分 コミット.modified) {
- s = m.split( "/" )をリストとして
- // println s
- // println s.size ()
- // s[0]を印刷する
- ( s.size ()> 1)の場合{
- // println changeServices.indexOf(s[0])
- (changeServices.indexOf(s[0]) == -1)の場合{
- サービスを変更します。追加(s[0])
- }
- }
- }
-
- //削除されました
- (rの場合 コミット.removed) {
- s = r.split( "/" )をリストとして
- 印刷する
- ( s.size ()> 1)の場合{
- (changeServices.indexOf(s[0]) == -1)の場合{
- サービスを変更します。追加(s[0])
- }
- }
- }
- }
-
- println(サービスの変更)
- //currentBuild.description = "トリガー ${eventType} ${changeServices}による
- }
- }
- }
-
- ステージ( 'DefineService' ){
- 手順 {
- スクリプト{
- println(サービスの変更)
- //サービス構築順序制御
- サービス = [ 'service02' , 'service01' ]
- (サービス内のサービス){
- (changeServices.indexOf(サービス) != -1)の場合{
- ジョブ名 = 'microservicecicd-' +サービス+ '-service-CI'
- ビルドジョブ: jobName、待機: false 、パラメータ: [string( name : 'branchName' 、値: "${env.branchName}" )、
- 文字列(名前: 'commitId' 、値: "${env.commitId}" )、
- 文字列(名前: 'projectId' 、値: "${env.projectId}" )]
- }
- }
- }
- }
- }
- }
- }
GitLab WebHookの設定Webhook を有効にし、hookurl を設定します: http://jenkins.idevops.site/generic-webhook-trigger/invoke?token=microservicecicd-scheduler-CI CIパイプライン-CI操作各マイクロサービスは、ブランチ名、コミット ID、プロジェクト ID の 3 つの文字列パラメータを持つ CI ジョブを作成します。 ジェンキンスファイル- 文字列 branchName = "${env.branchName}"
- 文字列 moduleName = "${JOB_NAME}" .split( "/" )[1].split( "-" )[1]
- 文字列 srcUrl = "http://gitlab.idevops.site/microservicecicd/microservicecicd-demo-service.git"
- 文字列 commitId = "${env.commitId}"
- 文字列 projectId = "${env.projectId}"
-
- パイプライン
- エージェント { ノード { ラベル"build" } }
-
- ステージ {
- ステージ( 'GetCode' ){
- 手順 {
- スクリプト {
- チェックアウト([$class: 'GitSCM' ,
- ブランチ: [[名前: "${branchName}" ]],
- doGenerateSubmoduleConfigurations: false 、
- 拡張機能: [[$class: 'SparseCheckoutPaths' ,
- sparseCheckoutPaths: [[パス: "${moduleName}" ],[パス: 'Dockerfile' ]]]],
- サブモジュール構成: [],
- userRemoteConfigs: [[credentialsId: 'gitlab-admin-user' ,
- URL: "${srcUrl}" ]]])
- }
-
- }
- }
-
- ステージ( "ビルド&テスト" ){
- ステップ{
- スクリプト{
- echo "ビルド..........."
-
- sh "" "
- cd ${モジュール名}
- mvn クリーンパッケージ
-
- 「」 「 」
- }
- }
- 役職 {
- いつも {
- junit "${moduleName}/target/surefire-reports/*.xml"
- }
- }
- }
-
- ステージ( "SonarScan" ){
- ステップ{
- スクリプト{
-
- def sonarDate = sh returnStdout: true 、スクリプト: 'date +%Y%m%d%H%M%S'
- sonarDate = sonarDate - "\n"
-
- withCredentials([文字列(credentialsId: 'sonar-admin-user' 、変数: 'sonartoken' )、
- 文字列(資格情報ID: 'gitlab-user-token' 、変数: 'gitlabtoken' )]) {
- //ブロック
- sh "" "
- cd ${モジュール名}
- ソナースキャナー \
- -Dsonar.projectKey=${ジョブ名} \
- -Dsonar.projectName=${ジョブ名} \
- -Dsonar.projectVersion=${sonarDate} \
- -Dsonar.ws.タイムアウト=30 \
- -Dsonar.projectDescription= "xxxxxxx" \
- -Dsonar.links.homepage=http://www.baidu.com \
- -Dsonar.sources=src \
- -Dsonar.sourceEncoding=UTF-8 \
- -Dsonar.java.binaries=ターゲット/クラス\
- -Dsonar.java.test.binaries=ターゲット/テストクラス\
- -Dsonar.java.surefire.report=ターゲット/surefire-reports \
- -Dsonar.host.url= "http://sonar.idevops.site" \
- -Dsonar.login=${sonartoken} \
- -Dsonar.gitlab.commit_sha=${コミットID} \
- -Dsonar.gitlab.ref_name=${ブランチ名} \
- -Dsonar.gitlab.project_id=${プロジェクトID} \
- -Dsonar.dynamicAnalysis=レポートの再利用\
- -Dsonar.gitlab.failure_notification_mode=コミット-ステータス \
- -Dsonar.gitlab.url=http://gitlab.idevops.site \
- -Dsonar.gitlab.user_token=${gitlabtoken} \
- -Dsonar.gitlab.api_version=v4
-
- 「」 「 」
-
- }
-
- }
- }
- }
-
- ステージ( "BuildImage" ){
- ステップ{
- スクリプト{
-
- withCredentials([usernamePassword(credentialsId: 'aliyun-registry-admin' 、passwordVariable: 'password' 、usernameVariable: 'username' )]) {
-
- env.nowDate = sh returnStdout: true 、スクリプト: 'date +%Y%m%d%H%M%S'
- env.nowDate = env.nowDate - "\n"
-
- env.releaseVersion = "${env.branchName}"
- env.imageTag = "${releaseVersion}-${nowDate}-${commitId}"
- env.dockerImage = "registry.cn-beijing.aliyuncs.com/microservicecicd/microservicecicd-${moduleName}-service:${env.imageTag}"
- env.jarName = "${モジュール名}-${ブランチ名}-${コミットID}"
- sh "" "
- docker login -u ${ユーザー名} -p ${パスワード} registry.cn-beijing.aliyuncs.com
- cd ${moduleName} && docker build -t ${dockerImage} -f ../Dockerfile
- 睡眠1
- docker プッシュ ${dockerImage}
- 睡眠1
- docker rmi ${dockerImage}
- 「」 「 」
- }
-
-
- }
- }
- }
-
-
- }
- }
GitOps-CI 拡張機能元の CI ジョブの手順に基づいて、環境を更新する手順が追加されます。 GitOps プラクティスでは、現在の基本環境デプロイメント ファイルを Git リポジトリに保存します。 CI ジョブがイメージのアップロードを完了すると、環境デプロイメント ファイル内のイメージ タグ情報も更新されます。 (そのため、まず環境ファイルを取得して更新する必要があります) - ステージ( "PushFile" ){
- //いつ{
- // 式 { "${env.branchName}" . ( "RELEASE-" )を含む}
- // }
- ステップ{
- スクリプト{
- if ( "${env.branchName}" . contains ( "RELEASE-" )){
- println( "ブランチ名 = ブランチ名" )
- env.branchName = "マスター"
-
- }それ以外{
- env.branchName = "機能"
- }
-
- (i = 0; i < 3; i++)の場合{
- //バージョンライブラリファイルをダウンロードする
- 応答 = GetRepoFile(40, "${moduleName}%2fvalues.yaml" , "${env.branchName}" )
- //println(応答)
-
- //ファイル内の内容を置き換える
- yamlData = readYaml テキスト: "" "${response}" ""
-
- println(yamlData.image.version)
- println( yamlData.image.commit )
- yamlData.image.version = "${releaseVersion}-${env.nowDate}"
- yamlData.image.commit = "${commitId}"
-
- yamlData.toString() を println します。
-
- sh "rm -fr test.yaml"
- writeYaml 文字セット: 'UTF-8' 、データ: yamlData、ファイル: 'test.yaml'
- newYaml = sh returnStdout: true 、スクリプト: 'cat test.yaml'
-
- println(新しいYaml)
- //gitlabファイルの内容を更新
- base64Content = newYaml.bytes.encodeBase64().toString()
-
- // 並行して問題が発生し、更新によって同時にエラーが報告されます
- 試す {
- リポジトリファイルを更新します(40、 "${moduleName}%2fvalues.yaml" 、base64Content、 "${env.branchName}" )
- 壊す;
- } キャッチ(e){
- sh 「睡眠2」
- 続く;
- }
- }
- }
- }
- }
-
- //HTTPリクエストをカプセル化する
- def HttpReq(reqType,reqUrl,reqBody){
- gitServer を"http://gitlab.idevops.site/api/v4"に設定します
- withCredentials([string(credentialsId: 'gitlab-token' , 変数: 'gitlabToken' )]) {
- 結果 = httpRequest customHeaders: [[maskValue: true 、名前: 'PRIVATE-TOKEN' 、値: "${gitlabToken}" ]],
- httpMode: 要求タイプ、
- コンテンツタイプ: "APPLICATION_JSON" 、
- コンソールログレスポンスボディ: true 、
- SSLエラーを無視: true 、
- リクエストボディ: reqBody、
- url: "${gitServer}/${reqUrl}"
- // 静か:真
- }
- 結果を返す
- }
-
-
- //ファイルの内容を取得する
- def GetRepoFile(プロジェクトID,ファイルパス,ブランチ名){
- apiUrl = "projects/${projectId}/repository/files/${filePath}/raw?ref=${branchName}"
- レスポンス = HttpReq( 'GET' ,apiUrl, '' )
- レスポンスを返す。
- }
-
- //ファイルの内容を更新する
- def UpdateRepoFile(プロジェクトID、ファイルパス、ファイルコンテンツ、ブランチ名){
- apiUrl = "プロジェクト/${プロジェクトID}/リポジトリ/ファイル/${ファイルパス}"
- reqBody = "" "{" branch ": " ${branchName} "," encoding ":" base64 ", " content ": " ${fileContent} ", " commit_message ": "新しいファイルを更新"}" ""
- レスポンス = HttpReq( 'PUT' ,apiUrl,reqBody)
- println(応答)
-
- }
画像 GitOps-CD セクションCD スケジューラ ジョブこのジョブは、CI スケジューラ ジョブと同様に、実際に GitLab の webhook リクエストを受信します。違いは、この CD スケジューラ ジョブが環境リポジトリ内のコード変更を受信するために使用されることです。 Webhook を有効にし、トリガー トークンを構成します。 hookurl を生成します: http://jenkins.idevops.site/generic-webhook-trigger/invoke?token=microservicecicd-scheduler-CD ジェンキンスファイル- パイプライン
- エージェント
-
- ステージ {
- ステージ( 'GetCommitService' ){
- 手順 {
- スクリプト{
- 「こんにちは世界」をエコーします
- echo "${WebHookData}"
-
- // Git 情報
- webhookdata = readJSON テキスト: "" "${WebHookData}" ""
- イベントタイプ = webhookdata[ "オブジェクトの種類" ]
- commits = webhookdata[ "commits" ]
- branchName = webhookdata[ "ref" ] - "refs/heads/"
- projectID = webhookdata[ "プロジェクトID" ]
- コミットID = webhookdata[ "checkout_sha" ]
-
-
- 変更サービス = []
- (コミット コミット内){
- println(コミット.id)
-
- //追加した
- (追加 で コミット.added) {
- s =リストとして.split( "/" )を追加
- ( s.size ()> 1)の場合{
- (changeServices.indexOf(s[0]) == -1)の場合{
- サービスを変更します。追加(s[0])
- }
- }
- }
-
- //変更済み
- (分 コミット.modified) {
- s = m.split( "/" )をリストとして
- // println s
- // println s.size ()
- // s[0]を印刷する
- ( s.size ()> 1)の場合{
- // println changeServices.indexOf(s[0])
- (changeServices.indexOf(s[0]) == -1)の場合{
- サービスを変更します。追加(s[0])
- }
- }
- }
-
- //削除されました
- (rの場合 コミット.removed) {
- s = r.split( "/" )をリストとして
- 印刷する
- ( s.size ()> 1)の場合{
- (changeServices.indexOf(s[0]) == -1)の場合{
- サービスを変更します。追加(s[0])
- }
- }
- }
- }
-
- println(サービスの変更)
- currentBuild.description = " ${eventType} ${changeServices} によってトリガー "
- }
- }
- }
-
- ステージ( 'DefineService' ){
- 手順 {
- スクリプト{
- println(サービスの変更)
- //サービス構築順序制御
- サービス = [ 'service02' , 'service01' ]
- (サービス内のサービス){
- (changeServices.indexOf(サービス) != -1)の場合{
- ジョブ名 = 'microservicecicd-' +サービス+ '-service-CD'
- ビルドジョブ: jobName、待機: false 、パラメーター: [string( name : 'branchName' 、値: "${branchName}" )]
- }
- }
- }
- }
- }
- }
- }
環境ライブラリ構成ウェブフックWebhook を有効にし、hookurl を設定します: http://jenkins.idevops.site/generic-webhook-trigger/invoke?token=microservicecicd-scheduler-CD CD製造ライン-CD操作ジェンキンスファイル- 文字列 serviceName = "${JOB_NAME}" .split( "-" )[1]
- 文字列 nameSpace = "${JOB_NAME}" .split( "-" )[0].split( "/" )[-1]
-
-
- //パイプライン
- パイプライン{
- エージェント { ノード { ラベル"k8s" }}
-
- ステージ{
-
- ステージ( "GetCode" ){
- ステップ{
- スクリプト{
- println( "${branchName}" )
- println( "${env.branchName}" . ( "RELEASE-" )が含まれています)
- println "コードを取得"
- チェックアウト([$class: 'GitSCM' , ブランチ: [[ name : "${env.branchName}" ]],
- doGenerateSubmoduleConfigurations: false 、
- 拡張機能: [[$class: 'SparseCheckoutPaths' ,
- sparseCheckoutPaths: [[パス: "${serviceName}" ]]]],
- サブモジュール構成: [],
- userRemoteConfigs: [[credentialsId: 'gitlab-admin-user' 、url: "http://gitlab.idevops.site/microservicecicd/microservicecicd-env.git" ]]])
- }
- }
- }
-
- ステージ( "HelmDeploy" ){
- ステップ{
- スクリプト{
- sh "" "
- kubectl はns "${nameSpace}-uat"を作成します||エコー偽
-
- helm インストール"${serviceName}"
-
- helm list
- helm 履歴"${serviceName}"
-
- 「」 「 」
- }
- }
- }
- }
- }
この記事はWeChatのパブリックアカウント「DevOps Cloud Academy」から転載したものです。 |