Tutorial ini ditujukan untuk pengembang yang ingin mengembangkan plugin untuk Jenkins dengan Python.

Bagaimana memulai

  1. Pertama kali membaca Memperluas dokumen Jenkins . Semua yang ada di bagian Mengembangkan Plugin berlaku juga untuk Pengembangan Python.
  2. Instal alat JDK 7 dan Maven terbaru. Hanya itu yang Anda butuhkan untuk pengembangan plugin Python (bersama dengan editor atau IDE favorit Anda tentunya).
  3. Lihat Plugin Python yang Ada atau buat plugin baru dengan alat PPSM (Anda memerlukan Python 3 untuk ini) untuk inisiasi cepat.
  4. Baca bagian berikut.

Bagaimana cara kerjanya

Tujuan dari proyek jenkins.py bukanlah untuk menyediakan pengembangan plugin Python murni, tetapi untuk memungkinkan penerapan setiap metode ekstensi atau deskriptornya dengan Python. Artinya, setidaknya harus ada satu kelas Java di setiap plugin Python, tetapi tanpa fungsionalitas sama sekali. Eksekusi metode didelegasikan ke fungsi dalam skrip Python terlampir.

Ada plugin perpustakaan runtime yang disebut python-wrapper yang menyediakan pembungkus untuk setiap titik ekstensi dan keterangan dalam sistem Jenkins. Pembungkus ini memiliki akhiran PW (misalnya untuk Pemberitahu itu adalah NotifierPW ) dan mereka berada dalam paket jenkins.python.expoint. (pembungkus untuk ekstensi poin) dan jenkins.python.descriptor. (pembungkus deskriptor).

Jika @ Ekstensi Anda atau deskriptornya yang diwarisi dari kelas pembungkus daripada yang asli, Anda dapat menggunakan kemampuan untuk mengimplementasikan metode dalam skrip Python terkait. Misalnya jika Anda menerapkan beberapa ekstensi Recorder dan itu disebut MyRecorder dan kelas ini mewarisi dari RecorderPW , harus ada skrip Python yang dilampirkan dengan nama my_recorder.py yang mungkin berisi atau tidak implementasi dari Metode perekam .

Penggunaan plugin python-wrapper Jython 2.5.3 untuk menjalankan skrip Python terkait.

Konvensi nama Java dan Python

Ada perbedaan antara konvensi nama Java dan Python. Fakta ini menyangkut nama file serta nama metode / fungsi.
Misalnya: jika kelas @Extension Anda disebut MyClass dan mewarisi metode someMethod () dari titik ekstensi, harus ada skrip Python yang disebut my_class.py dan itu mungkin berisi fungsi some_method () .

Eksekusi Python manual delegasi

Semua publik dan metode yang dilindungi dari titik ekstensi dan kelas induknya secara otomatis ditemukan dalam skrip Python dan digunakan. Namun, mungkin ada lebih banyak metode di kelas @Extension yang eksekusinya harus didelegasikan ke skrip Python secara manual. Itu bisa dilakukan dengan metode execPython *:

 publik  ReturnType  someMethod ( ArgType1  arg1,  ArgType2  arg2) {     kembali ( ReturnType ) execPython (  " metode_beberapa  " , arg1, arg2); }  publik  int  someOtherMethod ( ArgType1  arg1) {     kembali execPythonInt (  " some_other_method  " , arg1); } 

Delegasi manual ini berkaitan dengan metode berikut:

  • Metode penjepret (lakukan dan dapatkan metode yang dipanggil sesuai permintaan oleh UI)
  • Konstruktor
  • Metode antarmuka (jika ekstensi Anda atau kelas induknya (titik ekstensi) mengimplementasikan beberapa antarmuka, tetapi tidak menerapkan metode antarmuka)

Anda harus menggunakan DataConvertor jika beberapa argumen metode memiliki tipe dasar:

 impor  jenkins.python.DataConvertor ;  ...  publik  ReturnType  someMethod ( ArgType1  arg1,  boolean  arg2) {     kembali ( ReturnType ) execPython (  " metode_beberapa  " , arg1,  DataConvertor  .  fromBool (arg2)); } 

    Metode abstrak

Jika ada beberapa metode abstrak di titik ekstensi asli dan Anda lupa untuk mengimplementasikannya baik di Python atau Java, Kesalahan runtime PythonWrapperError akan terjadi (dengan pesan yang dapat dimengerti). Ini berbeda dengan pemrograman Java, di mana implementasi metode abstrak diperiksa dalam waktu kompilasi.

Spesifikasi proyek plugin Python

Ada beberapa perbedaan dalam proyek plugin Python dari yang ditulis murni di Java:

  1. Anda harus menandai ketergantungan plugin python-wrapper di plugin Anda pom.xml :

… org.jenkins-ci.plugins python-wrapper 1.0.3 … “

  1. Anda harus menandai semua file .py sebagai file sumber daya di plugin Anda pom.xml :

… src / main / *. py … “

  1. Jangan lupa untuk menentukan semua direktori sumber daya lain yang Anda gunakan (seperti sumber daya atau aplikasi web ):

… src / main / resource Salah … “

  1. Seperti disebutkan sebelumnya, kelas @Extension dan deskriptornya mewarisi dari wrappers ( PW ) sebagai ganti titik ekstensi dan deskriptor asli.

  2. Anda harus menempatkan semua skrip Python ke src / main / python direktori proyek.

Jenis pengembalian fungsi Python

Ada sedikit perbedaan antara tipe dasar Python dan Java. Berikut adalah tabel dengan tipe Python yang sesuai untuk semua tipe Java. Beberapa pasangan lebih jelas dari yang lain. Setiap fungsi Python yang menimpa beberapa metode titik ekstensi harus mengembalikan nilai dalam jenis yang sesuai.

Jenis Java Jenis Python
boolean bool
dua kali lipat mengapung
mengapung mengapung
panjang panjang
int int
pendek int
byte int
arang str (karakter pertama berlaku)
[] array.array
Tali str
Obyek obyek

Variabel global ‘ekstensi’

Dalam setiap skrip Python terkait, secara otomatis ada ekstensi variabel global yang menunjuk ke objek induk Java. Anda dapat menggunakannya untuk memanggil metode super atau untuk mengatur / mendapatkan bidang.

Menggunakan fungsi init_plugin ()

Anda dapat mendefinisikan init_plugin () dalam skrip Python terkait. Fungsi ini disebut setelah perpanjangan variabel ditetapkan, tetapi sebelum fungsi lainnya adalah dipanggil.

Memanggil metode super

Jika Anda harus memanggil metode super titik ekstensi asli atau deskriptor karena suatu alasan, Anda dapat melakukannya dengan metode super khusus. Misalnya. jika titik ekstensi asli mendefinisikan someMethod () , Anda dapat memanggilnya dengan extension.superSomeMethod () . Ini dirancang karena solusi dari panggilan refleksi Java yang buruk.

Menggunakan objek Java untuk serialisasi data

Jika Anda perlu menyimpan beberapa data, gunakan untuk itu kelas Java Anda atau kemungkinan besar deskriptornya. Cukup buat bidang publik di kelas Java dan akses dengan ekstensi variabel. Deskriptor memiliki save () dan beban () metode untuk kontrol persistensi data. Beberapa kelas ekstensi seperti pembangun disimpan secara otomatis. Anda mungkin memerlukan bidang lain untuk penggalian data dari UI (disetel oleh @DataBoundConstructor Stapler). Lihat Plugin Python yang Ada untuk mendapatkan inspirasi.

FAQ

  • T: Dapatkah saya menggabungkan implementasi Java dan Python?
    J: Tentu, Anda dapat mengimplementasikan beberapa metode dengan Python dan metode lainnya di Java. Ingatlah bahwa implementasi Java menggantikan implementasi Python.

  • T: Modul apa yang dapat saya impor dalam skrip Python terkait?
    J: Anda dapat mengimpor modul Jython standar . Anda juga dapat mengimpor skrip dan pustaka Python lain dari proyek Anda src / main / python . Anda bahkan dapat mengimpor semua Paket dan kelas Jenkins dan bekerja dengannya seperti objek Python normal.

  • T: Bagaimana cara mengemas, menguji, dan melepaskan plugin Python saya?
    J: Cukup gunakan Maven untuk itu:

       #  paket  paket mvn   #  menjalankan dan menguji  mvn hpi: jalankan   #  rilis  rilis mvn: persiapkan rilis: lakukan 

Masalah Dikenal

  • Jenis plugin terminal tidak terlihat dalam skrip Python.
    Alasannya adalah skrip Python dieksekusi oleh plugin induk, python-wrapper, yang tidak dapat melihat jenis plugin terminal. Ini mungkin akan diselesaikan di masa mendatang. Jika Anda perlu membuat instance kelas ekstensi dalam skrip Python, Anda dapat mengatasinya dengan memanggil tipe standar () pada sebuah ekstensi objek dan deskriptornya di init_plugin () fungsi:

      def   init_plugin  ():     global Kelasku     global  MyClassDescriptor      Kelasku = Tipe  (perpanjangan)      MyClassDescriptor  = Tipe  (perpanjangan.  getDescriptor  ()) 

Read More

LEAVE A REPLY

Please enter your comment!
Please enter your name here

*

code