web-dev-qa-db-ja.com

Jenkinsfileに加えられた変更をローカルでテストする方法を教えてください。

ジェンキンスのパイプラインを書くとき、それがうまくいくかどうか見るためにそれぞれの新しい変更をコミットすることは非常に不便なようです。

コードをコミットせずにこれらをローカルで実行する方法はありますか?

139
sorin

その全目的はJenkinsをスクリプト化することであるため、Pipelineスクリプトをローカルで実行することはできません。 (Jenkinsfileを短くし、実際にJenkinsの機能を扱うコードに限定するのが最善の理由です。実際のビルドロジックは、1行のshまたはbatステップで呼び出す外部プロセスまたはビルドツールで処理する必要があります。)

ライブでJenkinsfileへの変更をテストしたいがをコミットせずににしたい場合は、 再生 機能 を使用してください。 1.14で追加

JENKINS-33925 は自動テストフレームワークへの要望を追跡します。

94
Jesse Glick

私にはうまくいく解決策があります。これは、dockerで実行されているローカルのjenkinsと、コミットごとにローカルのjenkinsでパイプラインを起動するgit Webフックで構成されています。パイプラインをテストするためにgithubまたはbitbucketリポジトリにプッシュする必要はもうありません。

これはLinux環境でのみテストされています。

この命令は少し長いですが、これを機能させるのはかなり簡単です。ほとんどのステップがあります。

これはあなたが必要なものです

  • Dockerがインストールされ 、動作しています。 これはこの命令の一部ではありません。
  • ローカルでdockerで走っているJenkins。 以下の説明をしました。
    • あなたの地元のJenkins dockerユーザがあなたの地元のgitリポジトリから引き出すための適切な権利(sshアクセスキー)。 下記の説明をしました。
    • あなたの地元のgitリポジトリから引き出すJenkinsパイプラインプロジェクト。 以下に説明します。
    • 最小限の権限を持つあなたの地元のJenkinsのgitユーザー。 以下に説明します。
  • パイプラインプロジェクトをトリガーするコミット後のWebフックを持つGitプロジェクト。 以下に説明します。

これがあなたのやり方です

ジェンキンスドッカー

選択の代わりにDockerfileというファイルを作成します。これを/opt/docker/jenkins/Dockerfileに配置します。

FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins

local_jenkinsの画像を作成する

これは一度だけ、またはDockerfileに何かを追加した後に行う必要があります。

$ docker build -t local_jenkins /opt/docker/jenkins/Dockerfile

local_jenkinsを起動して再起動します

時々、あなたは簡単にジェンキンズを始めて、再スタートしたいです。例えば。あなたのマシンの再起動後。このために私は自分のホームフォルダの.bash_aliasesに入れるエイリアスを作りました。

$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases  # To make it work

/opt/docker/jenkins/jenkins_homeフォルダが存在し、あなたにユーザに読み書きの権限があることを確認してください。

Jenkinsを起動または再起動するには、次のように入力してください。

$ localjenkinsrestart

ローカルのjenkinsで行ったことはすべて/ opt/docker/jenkins/jenkins_homeフォルダに保存され、再起動後も保持されます。

あなたのdocker jenkinsにsshアクセスキーを作成してください

これはこれが機能するために非常に重要な部分です。まず、dockerコンテナを起動してbashシェルを作成します。

$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash

これでdockerコンテナに入りました。これはあなたの端末のjenkins@e7b23bad10aa:/$のようなもので見ることができます。 @の後のハッシュは確かに異なります。

キーを作成する

jenkins@e7b23bad10aa:/$ ssh-keygen

プロンプトが表示されるまで、すべての質問に対してEnterキーを押します

鍵をコンピューターにコピーしてください。港湾労働者のコンテナの中からあなたのコンピュータはあなたが疑問に思うべき172.17.0.1です。

jenkins@e7b23bad10aa:/$ ssh-copy-id [email protected]

user =あなたのユーザ名、172.17.0.1はdockerコンテナ内からあなたのコンピュータへのIPアドレスです。

この時点でパスワードを入力する必要があります。

それではdockerコンテナ内から自分のコンピュータに移動してループを完成させてみましょう。

jenkins@e7b23bad10aa:/$ ssh [email protected]

今回はパスワードを入力する必要はありません。もしそうなら、何かがうまくいかなかったので、もう一度やり直さなければなりません。

これで、コンピュータのホームフォルダに入ります。 lsを試してみてください。

抜け出す必要があるsshシェルのチェーンがあるのでここで止めないでください。

$ exit
jenkins@e7b23bad10aa:/$ exit

右!今、私たちは戻ってきて続行する準備が整いました。

あなたのJenkinsをインストールしてください

あなたのブラウザの中のあなたの地元のJenkinsは http:// localhost:8787 で見つかるでしょう。

あなたが最初にあなたのブラウザをあなたの地元のジェンキンスに向ける時、あなたはインストールウィザードで貪欲になるでしょう。デフォルトは問題ありませんが、セットアップ中に必ずパイプラインプラグインをインストールしてください。

あなたのジェンキンスをセットアップしてください

マトリックスベースのセキュリティを http:// localhost:8787/configureSecurity でアクティブにすることは非常に重要です andマトリックスに自分自身を追加してすべてのボックスにチェックマークを付けることで、すべての権利を自分に付与します。 (一番右にティックオールボックスのアイコンがあります)

  • セキュリティレルムとしてJenkins’ own user databaseを選択します
  • 承認セクションでMatrix-based securityを選択します
  • User/group to add:フィールドにあなたのユーザー名を書き、[ Add ]ボタンをクリックしてください。
  • 上の表では、あなたのユーザ名はその隣に人のアイコンが現れます。 それがクロスオーバーされている場合、あなたはあなたのユーザ名を間違ってタイプしました。
  • テーブルの右端に移動して全選択ボタンをクリックするか、行内のすべてのボックスを手動で選択します。
  • チェックボックスPrevent Cross Site Request Forgery exploitsがチェックされていないことを確認してください。 (このJenkinsはあなたのコンピュータからしか到達できないので、これはそれほど大きな問題ではありません)
  • [ Save ]をクリックしてJenkinsからログアウトし、もう一度ログインしてそれが機能することを確認します。 再起動する前に最初からやり直して/opt/docker/jenkins/jenkins_homeフォルダを空にする必要がない場合は

gitユーザーを追加します

私たちは、最小限の権限でgitフックが地元のJenkinsにログインできるようにする必要があります。仕事を見て、建てるだけで十分です。そのため、パスワードgitを持つloginというユーザーを作成します。

ブラウザで http:// localhost:8787/securityRealm/addUser に移動し、ユーザー名としてgit、パスワードとしてloginを追加します。 [ Create User ]をクリックしてください。

gitユーザーに権限を追加します

ブラウザの http:// localhost:8787/configureSecurity ページに移動します。 gitユーザーを行列に追加します。

  • フィールドUser/group to add:gitを入力し、[ Add ]をクリックしてください。

今度は、gitユーザーに対する最低限の権限についてボックスをチェックします。これらだけが必要です:

  • 全体:読む
  • 仕事:ビルド
  • 仕事:発見
  • 仕事:読む

Prevent Cross Site Request Forgery exploitsチェックボックスがオフになっていることを確認し、[ Save ]をクリックしてください。

パイプラインプロジェクトを作成する

ユーザー名がuserで、その中にJenkinsfileが含まれるgit対応プロジェクトはprojectと呼ばれ、/home/user/projects/projectにあるとします

あなたの http:// localhost:8787 にJenkinsが新しいパイプラインプロジェクトを追加しました。参考のためにhookpipelineと名付けました。

  • JenkinsメニューのNew Itemをクリックしてください。
  • プロジェクトにhookpipelineという名前を付けます
  • Pipelineをクリック
  • [ OK ]をクリック
  • Build TriggersセクションのチェックボックスPoll SCMにチェックを入れます。スケジュールを空のままにします。
  • [パイプライン]セクションの[:]
    • Pipeline script from SCMを選択
    • Repository URLフィールドに[email protected]:projects/project/.gitと入力します。
    • Script PathフィールドにJenkinsfileと入力します。
  • フックパイプラインプロジェクトを保存する
  • フックパイプラインを手動で1回作成します。これは、Poll SCMが機能し始めるために必要です。

Gitフックを作成する

/home/user/projects/project/.git/hooksフォルダーに移動して、これを含むpost-commitというファイルを作成します。

#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'

curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"

このファイルを実行可能にします。

$ chmod +x /home/user/projects/project/.git/hooks/post-commit

コミット後フックをテストします。

$ /home/user/projects/project/.git/hooks/post-commit

フックパイプラインプロジェクトがトリガーされたかどうかをJenkinsで確認してください。

最後にプロジェクトに任意の変更を加え、その変更を追加してコミットします。これであなたの地元のJenkinsのパイプラインが起動します。

幸せな日々!

46
javabeangrinder

TL; DR

ロングバージョン
Jenkins Pipelineテストはますます困難になっています。ユーザーが新しいJenkins Pipelineを公開したものに限定されていた従来の宣言型ジョブ構成アプローチとは異なり、宣言型部分を独自のものと混在させるビルドプロセス用の本格的なプログラミング言語です。コード。優れた開発者として、この種のコードに対しても単体テストをいくつか行いたいと思います。

Jenkins Pipelinesを開発するときに従うべき3つのステップがあります。 ステップ1.は、ユースケースの80%をカバーするはずです。

  1. 構築スクリプト(Maven、Gradle、Gulpなど)でできるだけ多くのことをしてください。それからあなたのパイプラインのスクリプトは正しい順番で構築タスクを呼び出すだけです。ビルドパイプラインはビルドタスクを調整して実行するだけですが、特別なテストを必要とする大きなロジックはありません。
  2. 前の規則を完全に適用できない場合は、 Pipeline Sharedライブラリ に移動して、独自のロジックを独自に開発およびテストし、それらを統合することができます。パイプライン.
  3. 上記のすべてが失敗した場合は、最近(2017年3月に)登場したライブラリのいずれかを試すことができます。 Jenkins Pipeline Unitテストフレームワーク または pipelineUnit (例)。 2018年以来、 Jenkinsfile Runner もあります。これは、コマンドラインツールからJenkinsパイプラインを実行するためのパッケージです。

pipelineUnit GitHubレポジトリには、 Jenkins Pipeline Unitテストフレームワークの使用方法に関するSpockの例がいくつか含まれています

41
Vadimo

書いている時点で(2017年7月末)Blue Ocean プラグインであなたはチェックすることができます宣言型パイプラインの構文は、ビジュアルパイプラインエディタで直接指定できます。エディターは、githubプロジェクトに対してのみ「configure」をクリックしたときにBlue Ocean UIから機能します(これは既知の問題であり、gitなどでも機能するように機能しています) 。

しかし、 この質問 で説明されているように、あなたはブラウズするエディタを開くことができます:

[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/

次に、ページ中央をクリックしてCtrl+Sを押すと、テキストエリアが開き、そこでパイプライン宣言スクリプトを貼り付けることができます。あなたが更新をクリックするとき、構文エラーがあれば、エディタはあなたに構文エラーがどこにあるか知らせます。このスクリーンショットのように:

As a quick test I wrongly typed "stepps" instead of "steps"

構文エラーがない場合は、テキストエリアが閉じて、ページにパイプラインが視覚化されます。それが何も保存しないことを心配しないでください(それがgithubプロジェクトであるならば、それはJenkinsファイルの変更をコミットするでしょう)。

私はJenkinsに不慣れで、これは非常に役に立ちます。これがないと、Jenkinsファイルを正常に機能するまで何度もコミットする必要がありました(非常に面倒です)。お役に立てれば。乾杯。

12
firepol

Jenkinsには「再生」機能があり、ソースを更新することなくジョブをすばやく再生できます。

Replay feature

10
AhmedDrira

パーティーには少し時間がかかりますが、それが私がjennyという、いくつかの中核的なJenkinsfileステップの小さな再実装を書いた理由です。 ( https://github.com/bmustiata/jenny

5
bogdan.mustiata

私が知っている限りでは、この Pipeline Plugin は新しいJenkinsファイルのメカニズムの「エンジン」です。

Jenkinsファイルにコピーするときに必要な追加の手順があるかどうかはわかりませんが、構文などはまったく同じです。

編集: "エンジン"の参照を見つけ、 this 機能の説明、最後の段落、最初のエントリを確認してください。

4
Dominik Gebhart

私の開発環境では、適切なGroovyエディタが欠けていますが、大量のJenkinsfileの問題は単純な構文エラーが原因です。この問題に取り組むために、JenkinsファイルをあなたのJenkinsインスタンスに対して検証することができます($JENKINS_HTTP_URLで実行)。

curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate

上記のコマンドは、 https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(またはlinting)-a-Declarative-から若干変更されたバージョンです。 Jenkinsファイルからコマンドライン

4
Juuso Ohtonen

他の人がすでに述べたリプレイ機能は別として(その有用性については同じです)、私は以下のものも有用であることがわかりました:

  1. Pipelineコードを入力するか、Jenkinsファイルのレポジトリまたはブランチを指定して何かをすばやくテストできるテストPipelineジョブを作成します。より正確なテストのためには、prodに影響を与えずにすばやく変更を行いコミットすることができるあなた自身の分岐を指すMultibranch Pipelineを使用してください。 BRANCH_NAME envのようなものはMultibranchでのみ利用可能です。
  2. JenkinsfileはGroovyのコードであるため、基本的な構文を検証するために単に「groovy Jenkinsfile」でそれを呼び出してください。
1
Max Zheng

私はいくつかの更新を行うと迅速に実行するために、将来の再生を使用しています。

0
AhmedDrira

いくつかの制限はありますが、スクリプト化されたパイプラインでは、このソリューションを使用します。

  1. インラインGroovyスクリプトを使用したパイプライン・ジョブ:

node('master') {
    stage('Run!') {
                def script = load('...you job file...')
    }
}

  1. テスト用のJenkinsファイルは、lesfuretsと同じ構造を持ちます。

def execute() {
 ... main job code here ...
}
execute()
0
user3148458

あなたのSSHキーをあなたのJenkinsプロファイルに入れて、それから次のように 宣言型リンター を使ってください:

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

これはあなたのJenkinsファイルを静的に分析します。選択したエディタで、そのコマンドを自動的に実行するキーボードショートカットを定義します。私が使用しているVisual Studioのコードでは、Tasks> Configure Tasksの順に進み、次のJSONを使用してValidate Jenkinsfileコマンドを作成します。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Validate Jenkinsfile",
      "type": "Shell",
      "command": "ssh jenkins.hostname declarative-linter < ${file}"
    }
  ]
}
0