כותב תוסף ג'נקינס

1. סקירה כללית

Jenkins הוא שרת אינטגרציה רציף עם קוד פתוח, המאפשר ליצור יצירת תוספים מותאמת אישית למשימה / סביבה מסוימת.

במאמר זה נעבור את כל התהליך של יצירת הרחבה המוסיפה סטטיסטיקה לפלט הבנייה, כלומר מספר הכיתות ושורות הקוד.

2. התקנה

הדבר הראשון שצריך לעשות הוא להקים את הפרויקט. למרבה המזל, ג'נקינס מספק ארכיטיפים נוחים של Maven בשביל זה.

פשוט הפעל את הפקודה למטה מתוך מעטפת:

ארכיטיפ mvn: ליצור -Dfilter = io.jenkins.archetypes: תוסף

נקבל את הפלט הבא:

[INFO] יצירת פרויקט במצב אינטראקטיבי [INFO] לא מוגדר ארכיטיפ. שימוש ב- maven-archetype-quickstart (org.apache.maven.archetypes: maven-archetype-quickstart: 1.0) בחר archetype: 1: remote -> io.jenkins.archetypes: ריק תוסף (שלד של תוסף Jenkins עם POM ו- עץ מקור ריק.) 2: מרחוק -> io.jenkins.archetypes: global-configuration-plugin (שלד של תוסף Jenkins עם POM ודוגמה של תצורה גלובלית.) 3: remote -> io.jenkins.archetypes : תוסף שלום-עולם (שלד של תוסף Jenkins עם POM ושלב בניית דוגמה).

כעת בחר באפשרות הראשונה והגדר קבוצה / חפץ / חבילה במצב אינטראקטיבי. לאחר מכן, יש צורך לחדד את ה- pom.xml - מכיוון שהוא מכיל ערכים כגון תוסף TODO.

3. עיצוב תוספים של ג'נקינס

3.1. נקודות הארכה

ג'נקינס מספק מספר נקודות הרחבה. אלה ממשקים או שיעורים מופשטים המגדירים חוזים למקרי שימוש מסוימים ומאפשרים ליישם תוספים אחרים.

לדוגמא, כל מבנה מורכב ממספר שלבים, למשל. "קופה מ- VCS", "לְלַקֵט", "מִבְחָן","להרכיב", וכו 'ג'נקינס מגדיר hudson.tasks.BuildStep נקודת סיומת, כדי שנוכל ליישם אותה כדי לספק שלב מותאם אישית שניתן להגדיר.

דוגמא נוספת היא hudson.tasks.BuildWrapper - זה מאפשר לנו להגדיר פעולות לפני / לאחר ההודעה.

יש לנו גם תוסף הרחבת דוא"ל שאינו ליבה המגדיר את hudson.plugins.emailext.plugins.RecipientProvider נקודת סיומת, המאפשרת לספק למקבלי דוא"ל. דוגמה ליישום זמינה כאן: hudson.plugins.emailext.plugins.recipients.UpstreamComitterRecipientProvider.

הערה: קיימת גישה מדור קודם שבה צריך להרחיב את מחלקת התוספים הודסון. פלוגין. למרות זאת, כעת מומלץ להשתמש בנקודות הארכה במקום.

3.2. אתחול התוסף

יש צורך לספר לג'נקינס על ההרחבה שלנו וכיצד יש לייצר אותה.

ראשית, אנו מגדירים מחלקה פנימית סטטית בתוך התוסף ומסמנים אותו באמצעות ה- הדסון. הרחבה ביאור:

class MyPlugin מרחיב את BuildWrapper {@Extension מחלקה סטטית ציבורית DescriptorImpl מרחיב את BuildWrapperDescriptor {@Override בוליאני ציבורי isApplicable (AbstractProject פריט) {return true; } @Override מחרוזת ציבורית getDisplayName () {להחזיר "שם להצגה בממשק המשתמש"; }}}

שנית, עלינו להגדיר קונסטרוקטור שישמש לייצוב האובייקט של התוסף ולסמן אותו על ידי ה- org.kohsuke.stapler.DataBoundConstructor ביאור.

אפשר להשתמש בפרמטרים עבור זה. הם מוצגים בממשק המשתמש ומועברים באופן אוטומטי על ידי ג'נקינס.

לְמָשָׁל. שקול את התוסף Maven:

@DataBoundConstructor public Maven (יעדי מחרוזת, שם מחרוזת, מחרוזת pom, מאפייני מחרוזת, מחרוזת jvm אפשרויות, שימוש בוליאני פרטי מאגר, הגדרות ספק ספק, GlobalSettingsProvider globalSettings, בוליאני injectBuildVariables) {...}

הוא ממופה לממשק המשתמש הבא:

אפשר גם להשתמש org.kohsuke.stapler.DataBoundSetter ביאור עם סטרים.

4. יישום תוסף

בכוונתנו לאסוף נתונים סטטיסטיים בסיסיים של הפרויקט במהלך בנייה, אז, hudson.tasks.BuildWrapper זו הדרך הנכונה ללכת לכאן.

בואו נבצע את זה:

class ProjectStatsBuildWrapper מרחיב את BuildWrapper {@DataBoundConstructor הציבור ProjectStatsBuildWrapper () {} @Override סביבה ציבורית setUp (AbstractBuild build, משגר משגר, מאזין BuildListener) {} @Extension public static class DescriptorImpl מרחיב את BuildWrapperDescriptorable @ @ נָכוֹן; } @Nonnull @ Override מחרוזת ציבורית getDisplayName () {return "בנה סטטיסטיקה של פרויקט במהלך הבנייה"; }}}

אוקי, עכשיו אנחנו צריכים ליישם את הפונקציונליות בפועל.

בואו נגדיר מחלקת תחום לסטטיסטיקה של הפרויקט:

מחלקה ProjectStats {שיעורים פרטיים int. מספר; שורות פרטיות פרטיות מספר; // קונסטרוקטורים / גטרים סטנדרטיים}

וכתוב את הקוד הבונה את הנתונים:

ProjectStats פרטי buildStats (שורש FilePath) זורק IOException, InterruptedException {int classesNumber = 0; int linesNumber = 0; מחסנית toProcess = מחסנית חדשה (); toProcess.push (שורש); בעוד (! toProcess.isEmpty ()) {נתיב FilePath = toProcess.pop (); אם (path.isDirectory ()) {toProcess.addAll (path.list ()); } אחרת אם (path.getName (). endsWith (". java")) {classesNumber ++; linesNumber + = countLines (path); }} להחזיר ProjectStats חדשים (classesNumber, linesNumber); }

לבסוף, עלינו להציג את הנתונים הסטטיסטיים למשתמשי הקצה. בואו ניצור תבנית HTML לשם כך:

    $ PROJECT_NAME $ פרויקט $ PROJECT_NAME $: 
מספר הכיתותמספר קווים
$ CLASSES_NUMBER $$ LINES_NUMBER $

ואכלס אותו במהלך הבנייה:

מחלקה ציבורית ProjectStatsBuildWrapper מרחיב את BuildWrapper {@ Override סביבה ציבורית setUp (AbstractBuild build, משגר משגר, BuildListener מאזין) {להחזיר סביבה חדשה () {@Override דמעה בוליאנית ציבורית (AbstractBuild build, מאזין BuildListener) זורק IOException, InterruptedException = ProjectStats build.getWorkspace ()); דוח מחרוזת = createReport (build.getProject (). GetDisplayName (), סטטיסטיקות); ArtifactsDir = build.getArtifactsDir (); נתיב מחרוזת = artifactsDir.getCanonicalPath () + REPORT_TEMPLATE_PATH; קובץ reportFile = קובץ חדש ("נתיב"); // כתוב את טקסט הדוח לקובץ הדוח}}; }}

5. שימוש

הגיע הזמן לשלב את כל מה שיצרנו עד כה - ולראות אותו בפעולה.

ההנחה היא שג'נקינס פועל בסביבה המקומית. אנא עיין בפרטי ההתקנה אחרת.

5.1. הוסף את התוסף ל- Jenkins

עכשיו, בואו נבנה את התוסף שלנו:

להתקין mvn

זה ייצור * .hpi קובץ ב- יַעַד מַדרִיך. עלינו להעתיק אותו לספריית התוספים של ג'נקינס (~ / .jenkins / תוסף כברירת מחדל):

cp ./target/jenkins-hello-world.hpi ~ / .jenkins / plugins /

לבסוף, בואו נפעיל מחדש את השרת ונוודא כי התוסף מוחל:

  1. פתח את לוח המחוונים של CI בכתובת // localhost: 8080
  2. נווט אל נהל את ג'נקינס | נהל תוספים | מוּתקָן
  3. מצא את התוסף שלנו

5.2. הגדר את התפקיד של ג'נקינס

בואו ניצור משימה חדשה עבור פרויקט Apache commons-lang בעל קוד פתוח ונתאר את הנתיב לריבו של Git שם:

עלינו גם לאפשר את התוסף שלנו לשם כך:

5.3. בדוק את התוצאות

כולנו מסודרים עכשיו, בואו לבדוק איך זה עובד.

אנו יכולים לבנות את הפרויקט ולנווט לתוצאות. אנו יכולים לראות כי א stats.html הקובץ זמין כאן:

בואו נפתח את זה:

זה מה שציפינו - מחלקה אחת הכוללת שלוש שורות קוד.

6. מסקנה

במדריך זה, יצרנו ג'נקינס תוסף מאפס והבטיח שהוא יעבוד.

באופן טבעי, לא כיסינו את כל ההיבטים של פיתוח הרחבות ה- CI, אלא סיפקנו סקירה בסיסית, רעיונות עיצוב והגדרה ראשונית.

וכמו תמיד, ניתן למצוא את קוד המקור ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found