シーン
- コードをGitに送信するときにトリガーするようにJenkinsタスクを構成できますが、コードを送信するたびにトリガーする必要がなく、必要なときにのみ実行される場合があります。
- Jenkinsページでタスクを手動で実行するだけでなく、JenkinsウェブサイトへのHTTPリクエストを開始して、指定されたタスクの実行をトリガーすることもできます。この記事では、実際にはHttpリクエストを通じて複数のJenkinsタスクの実行をトリガーします。
概観
パイプラインタイプのJenkinsタスクの場合、一般的にリモートトリガーをサポートするためにGeneric Webhook Triggerプラグインが使用されます。使用中は、次の3つの点に注意する必要があります。
- JenkinタスクがリモートでトリガーされたときにリクエストされたURLを書き込む方法。
- HTTPリクエストパラメータ、パイプラインスクリプトのパラメータとして使用する方法。
- JenkinsタスクAがあるとします。ある時点で、このタスクをトリガーする10のリクエストが同時に到着します。Jenkinsはどのように処理しますか?(後でこの問題に焦点を当てます)
上記の問題に対応して、実際に戦いましょう。
- Jenkinsサービスへのhttpリクエストを開始します。
- リクエストパラメータは、Githubコードリポジトリのアドレスとブランチ名です。
- このリクエストを受け取った後、Jenkinsはパイプラインタスクを実行します。
- タスクは、指定されたGithubリポジトリのコードをダウンロードすることです。プロセスは次の図に示されています。
環境情報
- オペレーティングシステム:CentOS 7.7
- ジェンキンス:2.190.3
- Generic Webhook Triggerプラグイン:1.66
Jenkinsの導入については、「Helmの導入とJenkinsの体験」の記事を参照してください。
実際の戦闘
- 以下に示すように、まずプラグインをインストールし、プラグイン管理ページに入ります。
- プラグインをインストールする手順を下の図に示します。赤いボックスの順序に従ってください:
- しばらくすると、下の図に示すように、プラグインがオンラインで正常にインストールされ、パイプラインタスクを作成してみます。
- remote-testという名前の新しいパイプラインタスクを作成します。
- 下の赤いボックスに示すように、設定ページに入ります。GenericWebhook Triggerオプションが表示されます。
- Generic Webhook Triggerがチェックされると、ページが変更されます。下の図に示すように、赤いボックスで、まずtokenの値をtoken-remote-testに設定し、httpリクエストのtokenパラメータの値がtoken-remote-testと等しい場合、現在のタスクをトリガーします。
- 次に、以下の赤いボックスに示すように、要求パラメーターを設定し、固定参照パラメーター(プラグインによって使用されるため、入力する必要があります)を入力し、次に、repositoryURLとbranchを設定します。つまり、Githubコードウェアハウスのアドレスとブランチ名、つまりhttpリクエスト内のrepositoryURLおよびブランチパラメータは、後続のパイプラインスクリプトに渡すことができます。
- 次に、パイプラインスクリプトを記述できます。
pipeline {
agent any
triggers {
GenericTrigger(
genericVariables: [
[key: 'ref', value: '$.ref'],
[key: 'repositoryURL', value: '$.repositoryURL'],
[key: 'branch', value: '$.branch']
],
token: 'token-remote-test' ,
causeString: '$ref' ,
printContributedVariables: true,
printPostContent: true
)
}
stages {
stage('show-param') {
steps {
echo 'token参数:$token'
echo '代码仓库:$repositoryURL'
echo '代码分支:$branch'
}
}
stage('down-sourcecode') {
steps {
echo '开始下载源码'
checkout([$class: 'GitSCM',
branches: [[name: '*/$branch']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[url: '$repositoryURL']]])
}
}
}
}
上記のスクリプトには、次の重要なポイントがあります。
a。トリガーのパラメーター、GenericTriggerおよびgenericVariablesは固定されています。上記の例に従って記述してください。
b。printContributedVariablesおよびprintPostContentがtrueであり、タスクの実行時に要求パラメーターの内容を出力します。
c。ここには2つのステージがあり、show-paramを実行すると、すべてのhttpリクエストパラメータが出力されます。
d。チェックアウトは、Githubリポジトリのコードをダウンロードするためにパイプラインによって提供されるAPIです。branchesパラメータの値はhttpリクエストパラメータブランチを使用し、userRemoteConfigs.urlパラメータの値はhttpリクエストパラメータrepositoryURLを使用します
- 下の赤いボックスに上記のパイプラインスクリプトを記述し、下部にある[ 保存 ]ボタンをクリックして保存します。
- タスクの構成が完了したら、Postmanを使用してJenkinsへのリクエストを開始し、JenkinsタスクがHttpリクエストによってトリガーされることを確認します。
確認する
- 私のJenkins Webサイトのアドレスはhttp://192.168.133.149:32049であるため、タスクをトリガーするためのリクエストアドレスはhttp://192.168.133.149:32049/generic-webhook-trigger/invoke?token=token-remoteです。-test、トークンパラメータの値とタスク設定のトークン値は同じでなければならないことに注意してください。
- Postmanの設定を下の図に示します。番号順に設定してください。repositoryURLパラメータの値はhttps://github.com/zq2599/jenkinsdemo.gitです。これは、Githubに置いたJavaプロジェクトであり、正常にダウンロードできます。 :
- 構成が完了したら、[ 送信 ]ボタンをクリックしてリクエストを送信します。通常の状況で受信される戻りコードは、以下の赤いボックスに示すように200です。200でない場合(たとえば、404)、Jenkinsタスクのパラメーター設定を確認してください(たとえば、トークンに一貫性がない)。
- Jenkinsページに戻り、ログを表示します。以下に示す赤いボックスに、リクエストパラメータが出力されます。
- Githubソースコードが正常にダウンロードされたことを確認します。
- この時点で、HttpによってトリガーされたJenkinsパイプラインの実際の戦闘が完了しました。プログラムやスクリプトなどのさまざまな手段を通じて、さまざまなニーズに応じてJenkinsタスクをトリガーし、さまざまなパラメーターをタスクに渡すことができます。
並行性の問題
Jenkinsタスクのリモートトリガーは柔軟性があり便利ですが、同時リクエストを処理するときに問題が発生します。同時に10個のリクエストが到着し、1つだけが実行されます。この問題の詳細と解決策は、次の記事「Jenkinsパイプラインタスクの同時トリガーのリモートトリガー」にあります。 「取り扱い」の詳細な議論。
ソースコードのダウンロード
私のGithubアドレスは次のとおりです。
名前 | リンク | 備考 |
---|---|---|
プロジェクトホームページ | https://github.com/zq2599/blog_demos | GitHub上のプロジェクトのホームページ |
gitリポジトリアドレス(https) | https://github.com/zq2599/blog_demos.git | プロジェクトのソースコード、httpsプロトコルの倉庫アドレス |
gitリポジトリアドレス(ssh) | [email protected]:zq2599 / blog_demos.git | プロジェクトのソースコード、sshプロトコルの倉庫アドレス |
その中に複数のプロジェクトがあります。以下の赤いボックスに示すように、jenkinsremotedemoを使用してください。これはJavaプロジェクトで、内部のリモートテストファイルはこの記事で使用されているパイプラインスクリプトです。このプロジェクトのJavaコード(App.java)はJenkinsに送信できます。複数のリモートトリガーリクエストを同時に開始します。