Bagaimana saya bisa menguji perubahan yang dilakukan pada Jenkinsfile secara lokal?

210

Saat menulis pipa jenkins, tampaknya sangat merepotkan untuk melakukan setiap perubahan baru untuk melihat apakah itu berfungsi.

Apakah ada cara untuk mengeksekusi ini secara lokal tanpa melakukan kode?

Sorin
sumber

Jawaban:

139

Anda tidak dapat menjalankan skrip Pipeline secara lokal, karena seluruh tujuannya adalah untuk skrip Jenkins. (Yang merupakan salah satu alasan mengapa yang terbaik adalah menjaga Jenkinsfilekode singkat dan terbatas Anda yang benar-benar berhubungan dengan fitur Jenkins; logika build Anda yang sebenarnya harus ditangani dengan proses eksternal atau alat bangun yang Anda panggil melalui satu baris shatau batlangkah.)

Jika Anda ingin menguji perubahan untuk Jenkinsfilehidup tapi tanpa melakukan itu, gunakan yang Replay fitur ditambahkan dalam 1.14

JENKINS-33925 melacak yang diinginkan untuk kerangka kerja pengujian otomatis.

Jesse Glick
sumber
Posting blog mengatakan ada tombol 'replay'. Ada ide dimana? Sepertinya saya tidak dapat menemukannya.
BoltzmannBrain
8
@BoltzmannBrain, buka halaman Jenkins dari pekerjaan build Anda. Di sisi kiri Anda akan melihat daftar build build sebelumnya. Saat Anda mengarahkan kursor pada ID build build (mis. "# 123") atau tanggal build build, panah ke bawah sedikit muncul. Mengkliknya akan membuka menu konteks yang memiliki opsi "Putar Ulang". Opsi ini juga tersedia di halaman build run.
Selamat Malam Nerd Pride
2
Concourse memungkinkan Anda untuk mengeksekusi skrip lokal Anda terhadap server target build, sehingga Anda dapat memvalidasi itu akan benar-benar bekerja pada server jauh juga sebelum melakukan perubahan Anda. concourse.ci/fly-cli.html . Fitur replay Jenkins agak analog dengan ini kecuali ia memiliki keterbatasan dan Anda harus membuat build terlebih dahulu untuk mengulangnya.
mdo123
2
Anda dapat melihat proyek ini yang bertujuan menyediakan apa yang Anda cari.
Romain
1
Lihatlah JenkinsPipelineUnit ( github.com/jenkinsci/JenkinsPipelineUnit )
user864279
78

Saya punya solusi yang berfungsi baik untuk saya. Ini terdiri dari jenkins lokal yang berjalan di buruh pelabuhan dan kait web git untuk memicu pipa di jenkins lokal di setiap komit. Anda tidak perlu lagi mendorong repositori github atau bitbucket Anda untuk menguji pipa.

Ini hanya diuji di lingkungan linux.

Cukup mudah untuk membuatnya bekerja walaupun instruksi ini agak panjang. Sebagian besar langkah ada di sana.

Ini yang kamu butuhkan

  • Docker terpasang dan berfungsi. Ini bukan bagian dari instruksi ini.
  • Seorang Jenkins berlari di buruh pelabuhan lokal. Dijelaskan caranya di bawah ini.
    • Hak yang tepat (kunci akses ssh) bagi pengguna buruh pelabuhan Jenkins lokal Anda untuk menarik dari repo git lokal Anda. Dijelaskan caranya di bawah ini.
    • Proyek pipa Jenkins yang menarik dari repositori git lokal Anda. Dijelaskan di bawah ini.
    • Pengguna git di Jenkins lokal Anda dengan hak minimal. Dijelaskan di bawah ini.
  • Proyek git dengan kait web pasca-komitmen yang memicu proyek pipa. Dijelaskan di bawah ini.

Ini adalah bagaimana Anda melakukannya

Jenkins Docker

Buat file bernama Dockerfile di tempat yang Anda pilih. Saya menempatkannya di /opt/docker/jenkins/Dockerfileisinya dengan ini:

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

Bangun gambar local_jenkins

Ini yang perlu Anda lakukan hanya sekali atau setelah Anda menambahkan sesuatu ke Dockerfile.

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

Mulai dan mulai ulang local_jenkins

Dari waktu ke waktu Anda ingin memulai dan memulai ulang jenkins dengan mudah. Misal setelah reboot mesin Anda. Untuk ini saya membuat alias yang saya masukkan ke .bash_aliasesdalam folder rumah saya.

$ 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

Pastikan /opt/docker/jenkins/jenkins_homefolder ada dan Anda memiliki hak pengguna untuk membaca dan menulis.

Untuk memulai atau memulai ulang jenkins Anda cukup ketik:

$ localjenkinsrestart

Semua yang Anda lakukan di jenkins lokal Anda akan disimpan di folder / opt / docker / jenkins / jenkins_home dan disimpan di antara restart.

Buat kunci akses ssh di jenkins buruh pelabuhan Anda

Ini adalah bagian yang sangat penting untuk bekerja. Pertama kita mulai wadah buruh pelabuhan dan membuat bash shell untuk itu:

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

Anda sekarang telah memasuki wadah buruh pelabuhan, ini bisa Anda lihat dengan sesuatu seperti jenkins@e7b23bad10aa:/$di terminal Anda. Hash setelah @ pasti akan berbeda.

Buat kuncinya

jenkins@e7b23bad10aa:/$ ssh-keygen

Tekan enter pada semua pertanyaan sampai Anda mendapatkan konfirmasi kembali

Salin kunci ke komputer Anda. Dari dalam wadah buruh pelabuhan komputer Anda 172.17.0.1 jika Anda bertanya-tanya.

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

user = nama pengguna Anda dan 172.17.0.1 adalah alamat ip ke komputer Anda dari dalam wadah buruh pelabuhan.

Anda harus mengetikkan kata sandi pada saat ini.

Sekarang mari kita coba selesaikan loop dengan ssh-ing ke komputer Anda dari dalam wadah buruh pelabuhan.

jenkins@e7b23bad10aa:/$ ssh [email protected]

Kali ini Anda tidak perlu memasukkan kata sandi. Jika ya, ada yang salah dan Anda harus mencoba lagi.

Anda sekarang akan berada di folder home komputer Anda. Coba lsdan lihat.

Jangan berhenti di sini karena kami memiliki rantai kerang ssh yang harus dikeluarkan.

$ exit
jenkins@e7b23bad10aa:/$ exit

Baik! Sekarang kami kembali dan siap untuk melanjutkan.

Instal Jenkins Anda

Anda akan menemukan Jenkins lokal di peramban Anda di http: // localhost: 8787 .

Pertama kali Anda mengarahkan browser Anda ke Jenkins lokal Anda, Anda akan dimaafkan dengan Instalasi Wizard. Standarnya baik-baik saja, pastikan Anda menginstal plugin pipeline selama pengaturan.

Siapkan jenkins Anda

Sangat penting bahwa Anda mengaktifkan keamanan berbasis matriks di http: // localhost: 8787 / configureSecurity dan beri diri Anda semua hak dengan menambahkan diri Anda ke matriks dan centang semua kotak. (Ada ikon centang-semua-kotak di paling kanan)

  • Pilih Jenkins’ own user databasesebagai Wilayah Keamanan
  • Pilih Matrix-based securitydi bagian Otorisasi
  • Tulis nama pengguna Anda di bidang User/group to add:dan klik [ Add ]tombol
  • Pada tabel di atas nama pengguna Anda akan muncul dengan ikon orang di sebelahnya. Jika terlewati, Anda salah mengetik nama pengguna.
  • Pergi ke ujung kanan tabel dan klik pada tombol centang-semua-atau secara manual centang semua kotak di baris Anda.
  • Harap verifikasi bahwa kotak centang Prevent Cross Site Request Forgery exploitstidak dicentang. (Karena Jenkins ini hanya dapat dijangkau dari komputer Anda, ini bukan masalah besar)
  • Klik [ Save ]dan logout dari Jenkins dan masuk lagi hanya untuk memastikan itu berhasil. Jika tidak, Anda harus memulai dari awal dan mengosongkan /opt/docker/jenkins/jenkins_homefolder sebelum memulai kembali

Tambahkan pengguna git

Kita perlu mengizinkan git hook kita untuk login ke Jenkins lokal kita dengan hak minimal. Hanya melihat dan membangun pekerjaan sudah cukup. Karena itu kami membuat pengguna yang dipanggil gitdengan kata sandi login.

Arahkan browser Anda ke http: // localhost: 8787 / securityRealm / addUser dan tambahkan gitsebagai nama pengguna dan loginkata sandi. Klik pada [ Create User ].

Tambahkan hak kepada pengguna git

Buka halaman http: // localhost: 8787 / configureSecurity di browser Anda. Tambahkan pengguna git ke matriks:

  • Tulis gitdi kolom User/group to add:dan klik[ Add ]

Sekarang saatnya untuk mencentang kotak untuk hak minimal untuk pengguna git. Hanya ini yang dibutuhkan:

  • keseluruhan: baca
  • pekerjaan: membangun
  • pekerjaan: temukan
  • pekerjaan: baca

Pastikan Prevent Cross Site Request Forgery exploitskotak centang tidak dicentang dan klik[ Save ]

Buat proyek pipa

Kami menganggap kami memiliki nama pengguna userdan proyek yang diaktifkan git kami dengan Jenkinsfiledi dalamnya disebut projectdan terletak di/home/user/projects/project

Di http Anda : // localhost: 8787 Jenkins menambahkan proyek pipa baru. Saya menamainya hookpipeline untuk referensi.

  • Klik New Itemdi menu Jenkins
  • Beri nama proyek hookpipeline
  • Klik pada Pipeline
  • Klik [ OK ]
  • Centang kotak Poll SCMdi bagian Build Triggers. Biarkan Jadwal kosong.
  • Di bagian Pipa:
    • Pilih Pipeline script from SCM
    • di Repository URLisian enter[email protected]:projects/project/.git
    • di Script Pathisian enterJenkinsfile
  • Simpan proyek hookpipeline
  • Bangun hookpipeline secara manual sekali, ini diperlukan agar Poll SCM untuk mulai bekerja.

Buat kait git

Buka /home/user/projects/project/.git/hooksfolder dan buat file bernama post-commityang berisi ini:

#!/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"

Jadikan file ini dapat dieksekusi:

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

Uji kait pasca-komitmen:

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

Periksa di Jenkins jika proyek hookpipeline Anda dipicu.

Terakhir, buat beberapa perubahan sewenang-wenang untuk proyek Anda, tambahkan perubahan dan lakukan komit. Ini sekarang akan memicu pipa di Jenkins lokal Anda.

Hari hari menyenangkan!

javabeangrinder
sumber
Saya harus mengganti docker build -t local_jenkins /opt/docker/jenkins/Dockerfiledengan docker build -t local_jenkins /opt/docker/jenkinskarena Docker mengeluh tentang "tidak dapat menyiapkan konteks: konteks harus menjadi direktori".
Etienne Neveu
1
Saya mendapatkan kesalahan ini di Mac. Dapatkah seseorang tolong bantu saya dalam hal ini? >> ERROR: ssh: sambungkan ke host port 172.17.0.1 22: Sambungan ditolak -
Manoj Shrestha
@ManojShrestha: IP 172.17.0.1 adalah ip default untuk mesin yang menjalankan wadah buruh pelabuhan. Anda dapat menggunakan mesin Anda (MAC: s) sebagai gantinya.
javabeangrinder
@ManojShrestha: Anda juga dapat mencoba mencari tahu gateway IP dari pengaturan Anda seperti ini: $ docker inspect jenkins | grep Gateway
javabeangrinder
2
Jika host buruh pelabuhan Anda diinstal pada macOS dan Anda ingin ssh masuk dari dalam wadah buruh pelabuhan maka Anda harus ssh [email protected] menggunakan alamat IP. Pastikan juga Anda mengaktifkan fitur Remote Login dari System Preferences -> Menu Folder Bersama
Paolo Angioletti
61

TL; DR

Versi Panjang
Tes Jenkins Pipeline menjadi semakin menyakitkan. Berbeda dengan pendekatan konfigurasi pekerjaan deklaratif klasik di mana pengguna terbatas pada apa yang UI tampilkan, Jenkins Pipeline baru adalah bahasa pemrograman yang lengkap untuk proses pembangunan di mana Anda mencampur bagian deklaratif dengan kode Anda sendiri. Sebagai pengembang yang baik kami juga ingin memiliki beberapa unit test untuk kode semacam ini.

Ada tiga langkah yang harus Anda ikuti saat mengembangkan Jenkins Pipelines. The langkah 1. harus mencakup 80% dari kasus penggunaan.

  1. Lakukan sebanyak mungkin dalam membangun skrip (mis. Maven, Gradle, Gulp dll.). Kemudian dalam skrip pipeline Anda, panggil saja tugas build dengan urutan yang benar. Pipeline build hanya mengatur dan mengeksekusi task build tetapi tidak memiliki logika utama yang memerlukan pengujian khusus.
  2. Jika aturan sebelumnya tidak dapat diterapkan sepenuhnya, maka pindahlah ke perpustakaan Pipeline Shared di mana Anda dapat mengembangkan dan menguji logika kustom sendiri dan mengintegrasikannya ke dalam pipa.
  3. Jika semua hal di atas gagal, Anda dapat mencoba salah satu perpustakaan yang muncul baru-baru ini (Maret-2017). Kerangka pengujian Unit Pipa Jenkins atau PipelineUnit (contoh). Sejak 2018 ada juga Jenkinsfile Runner , paket untuk mengeksekusi pipa Jenkins dari alat baris perintah.

Contohnya

The pipelineUnit GitHub repo berisi beberapa contoh Spock tentang cara menggunakan Jenkins Pipeline Satuan pengujian kerangka kerja

Vadimo
sumber
1
Bisakah Anda juga memasukkan perbandingan singkat dari kedua perpustakaan itu?
Sorin
24

Jenkins memiliki fitur 'Putar Ulang', yang memungkinkan Anda memutar ulang pekerjaan dengan cepat tanpa memperbarui sumber:

Putar ulang fitur

AhmedDrira
sumber
1
Perhatikan bahwa itu muncul di halaman build, bukan halaman proyek atau cabang.
ArtOfWarfare
17

Pada saat penulisan (akhir Juli 2017) dengan plugin Blue Ocean, Anda dapat memeriksa sintaksis pipa deklaratif langsung di editor pipa visual . Editor, berfungsi dari Blue Ocean UI ketika Anda mengklik "configure" hanya untuk proyek-proyek github (ini adalah masalah yang diketahui dan mereka bekerja untuk membuatnya berfungsi juga di git dll).

Namun, seperti yang dijelaskan dalam pertanyaan ini, Anda dapat membuka penjelajahan editor ke:

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

Kemudian klik di tengah halaman, dan tekan Ctrl+S, ini akan membuka textarea di mana Anda dapat menempelkan skrip deklaratif pipeline. Ketika Anda mengklik Perbarui , jika ada kesalahan sintaks, editor akan memberi tahu Anda di mana kesalahan sintaks. Seperti di tangkapan layar ini:

Sebagai tes cepat saya salah mengetik "stepps" bukannya "step"

Jika tidak ada kesalahan sintaks, textarea akan ditutup dan halaman akan memvisualisasikan pipa Anda. Jangan khawatir itu tidak akan menyelamatkan apa pun (jika ini adalah proyek github, itu akan melakukan perubahan Jenkinsfile).

Saya baru di Jenkins dan ini cukup membantu, tanpa ini saya harus melakukan Jenkinsfile berkali-kali, sampai berhasil (sangat menjengkelkan!). Semoga ini membantu. Bersulang.

firepol
sumber
2
Itu karena pada 2017, Jenkins masih ditujukan untuk mengatasi masalah insinyur perangkat lunak titik-dan-klik;) .... Setidaknya Atom memiliki serat Groovy yang layak. Hanya Groovy tetapi membantu.
Sorin
Editor dengan highlight sintaks juga merupakan bagian dari UI jenkins klasik.
Vadimo
6

Agak terlambat ke pesta, tapi itu sebabnya saya menulis jenny, implementasi kecil dari beberapa langkah inti Jenkins. ( https://github.com/bmustiata/jenny )

bogdan.mustiata
sumber
Jangan tersinggung, tetapi kecuali jika Anda terus-menerus memperbarui barang-barang Anda itu akan sangat tidak berguna karena sintaksis pipa terus-menerus berubah seperti yang terlihat saat ini.
krad
Belum diambil. Dari apa yang saya lihat sejauh ini, sintaksis pipeline, cukup standar untuk langkah-langkah dasar pipeline ( jenkins.io/doc/pipeline/steps/workflow-basic-steps ). Saya menggunakannya untuk ~ 2 tahun sekarang, tanpa mengalami perubahan yang tidak kompatibel ke belakang. Plugin Jenkins tidak boleh digunakan imho, dan perubahan API dapat diabstraksi menggunakan perintah khusus di pustaka bersama, di mana Anda akan memiliki jaminan API. Jika Anda berbicara tentang sintaks deklaratif, itu mungkin benar. Saya hanya menggunakan API terprogram di jaringan pipa saya, dan itulah yang didukung Jenny. Rock solid :)
bogdan.mustiata
5

Sejauh yang saya tahu Plugin Pipeline ini adalah "Mesin" dari mekanika Jenkinsfile baru, jadi saya cukup yakin Anda bisa menggunakan ini untuk menguji skrip Anda secara lokal.

Saya tidak yakin apakah ada langkah-langkah tambahan yang diperlukan ketika Anda menyalinnya ke Jenkinsfile, namun sintaks dll harus persis sama.

Sunting: Ditemukan referensi pada "mesin", periksa deskripsi fitur ini , paragraf terakhir, entri pertama.

Dominik Gebhart
sumber
5

Dalam pengaturan pengembangan saya - hilang editor Groovy yang tepat - banyak masalah Jenkinsfile berasal dari kesalahan sintaksis sederhana . Untuk mengatasi masalah ini, Anda dapat memvalidasi Jenkinsfile terhadap instance Jenkins Anda (berjalan pada $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

Perintah di atas adalah versi yang sedikit dimodifikasi dari https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line

Juuso Ohtonen
sumber
4
Ini hanya hal yang saya cari - sayangnya hanya bekerja untuk pipa deklaratif dan bukan pipa skrip :(
thom_nic
2

Selain dari fitur Putar Ulang yang telah disebutkan orang lain (selain kegunaannya!), Saya juga menemukan yang berikut berguna:

  1. Buat pekerjaan uji Pipeline di mana Anda bisa mengetikkan kode Pipeline atau arahkan ke repo / cabang Jenkinsfile Anda untuk dengan cepat menguji sesuatu. Untuk pengujian yang lebih akurat, gunakan Multibranch Pipeline yang menunjuk ke garpu Anda sendiri di mana Anda dapat dengan cepat melakukan perubahan dan komit tanpa mempengaruhi prod. Hal-hal seperti BRANCH_NAME env hanya tersedia di Multibranch.
  2. Karena Jenkinsfile adalah kode Groovy, cukup panggilnya dengan "groovy Jenkinsfile" untuk memvalidasi sintaks dasar.
Max Zheng
sumber
Menggunakan pekerjaan terpisah yang dapat Anda sembunyikan dan tidak membingungkan pengguna adalah salah satu hal terpenting. Saya mengedit file Jenkins dengan IntelliJ. Cukup bagus dalam menunjukkan kesalahan sintaksis. Namun, tombol jawab adalah kuncinya. Saya membuat cabang dengan menjalankan perubahan dasar itu - biasanya berjalan agak salah. Saya kemudian mengedit Jenkinsfile dan menyalin dan menempelnya ke jendela Putar Ulang, dan jalankan lagi - saya ulangi ini sampai berfungsi OK dan kemudian komit versi yang berfungsi.
johnfo
2

Masukkan kunci SSH Anda ke profil Jenkins Anda, lalu gunakan linter deklaratif sebagai berikut:

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

Ini akan melakukan analisis statis pada Jenkinsfile Anda. Di editor pilihan Anda, tentukan pintasan keyboard yang menjalankan perintah itu secara otomatis. Dalam Visual Studio Code, yang merupakan apa yang saya gunakan, pergi ke Tugas> Konfigurasikan Tugas, kemudian gunakan JSON berikut untuk membuat perintah Validasi Jenkinsfile :

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

saya menggunakan replay future, untuk melakukan beberapa pembaruan dan berjalan cepat.

AhmedDrira
sumber
1
Bisakah Anda memberikan lebih banyak info tentang bagaimana Anda membuat ini bekerja?
kosnik
1
Saya menggunakan Bit-ember sebagai manajer sumber, maka saya telah membuat proyek di Jenkins berharap menemukan repositori saya secara otomatis, saya merekomendasikan posting ini. Setelah setiap kali menekan repo saya, Jenkins akan secara otomatis memutar file Jenkins saya dan jika gagal, pada menu sebelah kiri ada tombol yang disebut Replay, ==> tombol ini buka editor yang berisi file Jenkins Anda, Anda dapat mengeditnya dan memutar ulang pekerjaan itu ,
AhmedDrira
0

Dengan beberapa keterbatasan dan untuk jaringan pipa scripted saya menggunakan solusi ini:

  1. Pekerjaan pipeline dengan skrip groovy inline:

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

  1. Jenkinsfile untuk pengujian memiliki struktur yang sama seperti untuk lesfurets:

def execute() {
 ... main job code here ...
}
execute()
pengguna3148458
sumber