"אירועים" – EventEmitter בNodeJS על קצה המזלג

EventEmitter הוא מודל בילט אין בNodeJS, הוא מאפשר "האזנה" לאירועים ו"שידור" שאירוע קיים קרה לכל ה"מאזינים".

לדוגמה, נוכל להאזין לאירוע בשם "NEW_USER_REGISTER" שישודר בכל פעם שמשתמש חדש נירשם למערכת שלנו, במקביל נוכל "להאזין" לאירוע מכל מקום שנירצה. בכל פעם שהאירוע יתקיים – נוכל להריץ פונקציות בצורה אוטומטית.

const EventEmitter = require('events');
const ourEmitter = new EventEmitter();

//נאזין לאירוע NEW_USER_REGISTER
//בכל פעם שהאירוע ישודר, הפונקציה הנל תרוץ
ourEmitter.on('NEW_USER_REGISTER'), () => {
 console.log('משתמש חדש נירשם למערכת');
}

//ניתן להאזין לאירוע ביותר ממקום אחד
ourEmitter.on('NEW_USER_REGISTER'), () => {
 console.log('שלח אימייל ברוך הבא');
}

//על מנת לשדר אירוע נריץ את הפקודה הבאה
ourEmitter.emit('NEW_USER_REGISTER');

הEventEmitter עוזר כאשר אנו צריכים לעדכן מודלים אחרים שאירוע מסויים קרה והוא שימושי מאוד, חשוב להכיר אותו!

שימו לב, אם האירוע "ישודר" לפני שאנו נאזין לו – מה שמאזין לו לא יידע שהאירוע קרה, לכן – קודם כל צריך להאזין ורק לאחר מכן לשדר.

תבניות אסינכרוניות בNodeJS – על קצה המזלג

תבניות אסינכרוניות בNodeJS,
SyncPattern, Async Error CallBack, The Promise Pattern – Async-Await

Sync Pattern

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

const fs = require('fs');
let fileName = 'logs.txt';
const fileData = fs.readFileSync(fileName);

console.log('File content is', fileData);

console.log('Sync Test');

בקוד הנל, אנו קוראים את כל התוכן של הקובץ, לאחר שקראנו אותו אנו מדפיסים את התוכן שלו. ולאחר מכן מדפיסים 'Sync Test'. בקוד הסינכרוני הנל קודם יודפס תוכן הקובץ ורק לאחר מכן יודפס 'Sync Test'. חשוב להדגיש: הקוד הנל לא עובר דרך הEvent Loop של NodeJS.


Async Error CallBack

בדוגמה הבאה, נכתוב קוד אסינכרוני בNodeJS בגישת CallBack. הקוד הנל יעבור דרך הEvent Loop ויתבצע בצורה אסינכרונית.

const fs = require('fs');

let fileName = 'logs.txt';
fs.readFile(fileName, function cback(err,data) {
 console.log('File content is', data);
});

console.log('Async Test');

בקוד הנל, אנו משתמשים במתודה readFile שהיא מתודה אסינכרונית אשר עושה שימוש בEventLoop.
אנו לא נוכל לגשת לתוכן הקובץ ישירות אחרי קריאה לפונקציה הזאת – כיוון שהוא עדיין לא זמין, וזאת הסיבה שאנו צריכים להשתמש בפונקצית CallBack – במקרה שלנו cback שמקבלת 2 פרמטרים. הפרמטר הראשון err (לשגיאות) והפרמטר השני data – התוכן של הקובץ.

לאחר שקריאת הקובץ תסתיים, מתבצעת קריאה לפונקצית הCallBack שלנו ורק בה יש לנו גישה לתוכן של הקובץ (Event Loop)

  1. קריאת הקובץ
  2. הדפסת Async Test
  3. הדפסת תוכן הקובץ על ידי פונקציית הCallBack
    כאשר למעשה הEvent Loop רץ רק פעמיים, בפעם הראשונה קריאת הקובץ + הדפסת הAsync Test ובפעם השנייה הרצת פונקצית הCallBack שלנו.

    שימו לב, שכיון שמדובר בכתיבה אסינכרונית, שורת הAsync Test שלנו תופיע לפני שורות התוכן של הקובץ שלנו.

חשוב לשים לב שפונקצית הCallBack שלנו תמיד תקבל בפרמטר הראשון את משתנה הerr, אם תחול שגיאה בקוד פרמטר הerr שלנו יהיה אוביקט מסוג error ובמידה ולא תתרחש שגיאה הערך של הפרמטר err יהיה null.

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

const fs = require('fs');

let fileName = 'logs.txt';
let newFileName = 'newlog.txt';
fs.readFile(fileName, function cback(err,data) {
 fs.writeFile(newFileName, data, function cback2(err) {
  //yada yada
 });
});

console.log('Async Test');

שימו לב, איך 2 הפונקציות הנל משורשרות, עכשיו דמיינו לכם קוד אסיכרוני כזה שעושה 5 ויותר פעולות..
פיתרון לבעיתיות הזו נמצא בתבנית אסינכרונית אחרת בשם Promise Pattern


The Promise Pattern, Async – Await

Nodejs מגיע עם כלי שמאפשר לעשות "להמיר" לpromise כל פונקציה אסינכרונית שהיא בילט אין.

const fs = require('fs');
const util = require('util');

const readLogFile = util.promisify('fs.readFile');

async function readLogFile(fileName) {
 const logFileData = await readFile(fileName);
 console.log('Log Data is', logFileData);
}

readLogFile('logs.txt');

console.log('Promise Async Test');

בדוגמה זו אנו משתמשים בpromisify כדי להשתמש בפונקציה readFile (שהיא פונקציה אסינכרונית בילט אין) – בצורה שמחזירה Promise. אנו יכולים להמיר כל פונקציה אסינכרונית שכתובה בצורת CallBack לצורה שמחזירה Promise.
הערת אגב: למודל FS יש כבר פונקציות Promise מובנות, להלן:

const readFile = util.promisify(fs.readFile);

בדוגמה הקודמת כמובן לא השתמשנו בהן ועשינו במקום זאת שימוש בutil.promisify.

ראו את הדוגמה הבאה בה אנו גם קוראים מקובץ וגם כותבים לקובץ עם Promise

const fs = require('fs').promises;

let fileName = 'logs.txt';
let newFileName = 'newlog.txt';

async function copyLog(filename, newFileName) {
 await logFileData = await fs.readFile(filename);
 await fs.writeFile(newFileName, logFileData);
}

copyLog('logs.txt','logs-copy.txt');
console.log('Async Test');

נכון שהקוד הרבה יותר ברור מהקוד הבא?

const fs = require('fs');

let fileName = 'logs.txt';
let newFileName = 'newlog.txt';
fs.readFile(fileName, function cback(err,data) {
 fs.writeFile(newFileName, data, function cback2(err) {
  //yada yada
 });
});

console.log('Async Test');


לסיכום: לטעמי האישי, Promises הן הרבה יותר נוחות לתחזוקה וגם לכתיבה מאשר CallBacks.


מצאתם טעות? הערות? שאלות? הסתדרתם? נתקעתם? כתבו לי בתגובות!

אפלקציית התשלומים הפופולארית paybox נפרצה??

זליגת מידע מאפלקצית התשלומים הפופולארית paybox

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


חשיפה ראשונה: עפ ההודעה לבורסה של בנק דיסקונט – נודע להם על הנושא כבר ב19.1.2020 אך הם הודיעו לבורסה רק ב29.1.2020 בטענה ש"נדרש זמן לנקיטת צעדי הכנה ומניעה נדרשים"
כמו כן, הם טוענים בהודעתם שהמניעה לדווח הוסרה בתאריך 28/01/2020בשעה17:30.

ואני שואל, אם התקלה סודרה תוך מספר שעות מדוע נדרש זמן לנקיטת צעדי הגנה ומניעה עד לתאריך 28/01/2020בשעה17:30?


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

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

Image may contain: text

בהודעה בפייסבוק החברה פירסמה:

לקוחות יקרים,
לפני הכל אנחנו רוצים לשוב ולהתנצל על אירוע דליפת המידע עליו דיווחנו לכם הבוקר.
מטבע הדברים, יש כרגע המון כניסות לאפליקציה כך שייתכן שתחוו איטיות או קשיי כניסה בשעות הקרובות.
כפי שסיפרנו לכם במייל ששלחנו הבוקר, המידע שנחשף אינו יכול לגרום לכם נזק כספי ולא כלל פרטים כגון סיסמה, מספר כרטיס אשראי (למעט 4 ספרות אחרונות) ומספר תעודת זהות.
אחרי בדיקה שערכנו, ובהמשך לשאלות שלכם, אנו מבקשים להבהיר כי המידע שנחשף הוא מידע חלקי המצוי באפליקציה כמו כינוי המשתמש שהזנתם, תאריך לידה, שמות קבוצות, העברות באפליקציה, מספרי טלפון ופרטים טכניים נוספים.
אנחנו יכולים לומר בוודאות שהאפליקציה מאובטחת לחלוטין לשימוש וכי כספכם מוגן.
אנחנו עושים הכל כדי לתת לכם את השירות הטוב ביותר.
נמשיך לפעול בשקיפות מלאה ונעדכן אתכם בכל מידע רלוונטי.
אנו זמינים לכל שאלה, במספר: 072-2799366
במייל: [email protected]
על פניו, הכיתוב "למעט 4 ספרות אחרונות" מרמז על כך ש4 הספרות האחרונות של מספרי האשראי נחשפו (לפחות כך אני מבין מתגובתם לשאלתי בנושא בפייסבוק) - דבר שמהווה סכנה אמיתית לדעתי, מתכון בטוח לניסיונות פישינג ועוד.
על פניו, הכיתוב "למעט 4 ספרות אחרונות" מרמז על כך ש4 הספרות האחרונות של מספרי האשראי נחשפו (לפחות כך אני מבין מתגובתם לשאלתי בנושא בפייסבוק) – דבר שמהווה סכנה אמיתית לדעתי, מתכון בטוח לניסיונות פישינג ועוד.

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

בחברה טוענים שלא מדובר במידע רגיש – וואו, כמה הם טועים לדעתי וכמה זה מראה לכאורה על חוסר הבנה באבטחת מידע לדעתי האישית

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


בנק דיסקונט (שפייבוקס בבעלותו), השיבו לפנייתי וכתבו

אביב שלום, בנק דיסקונט פרסם דוח לבורסה לני"ע והודעה לעיתונות. פייבוקס מסרה מידע מלא ושקוף ללקוחותיה, לא נוכל להוסיף מעבר לכך. מוקד פייבוקס זמין לכל שאלה בטלפון מספר 072-2799366 או בכתובת הדוא"ל: [email protected]. יום נעים

בנוסף, הבנק דיווח לבורסה על הנושא, אבל כאחד ששם לב לפרטים, לא יכלתי שלא לשים לב שהדיווח היה ב29.1, כאשר לבנק נודע על הנושא כבר בתאריך 19.1.2020.
טענתם:"דיווח שעוכב בהתאם לתקנה 36(ב): 3. אם הדיווח עוכב – הסיבה שבגינה עוכבה הגשתו: נדרש זמן לנקיטת צעדי הגנה ומניעה נדרשים."

ואני שואל, הרי אמרתם שהתקלה תוקנה תוך מספר שעות, אז מדוע נדרשו כל כך הרבה ימים לנקיטת צעדי הגנה ומניעה נדרשים? הרי בדיווח שלכם טענתם שהמניעה לדיווח הוסרה בתאריך28/01/2020בשעה17:30. בין ה19.1 ל28.1 ממש לא מדובר בתקלה של מספר שעות.
פניתי לבנק דיסקונט לקבל תגובה בנוגע לדיווח לבורסה, ואפרסם את התשובה שלהם כשאקבל אותה – אם אקבל.


שוחחתי עם מערך הסייבר הלאומי, הם מודעים לנושא וענו במהרה

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


שאלתי את PayBox את השאלות הבאות:
1. אילו פרטים אישיים של לקוחות נחשפו
2. אילו אמצעי אבטחה אתם נוקטים
3. האם אתם נעזרים בחברת אבטחת מידע חיצונית?
4. האם נחשפו הטרנזקציות אותם הלקוחות ביצעו?
5. האם יש לכם בחברה ממונה אבטחת מידע?
6. את אילו גורמים עדכנתם לגבי הפריצה?
7. האם אתם יודעים בדיוק או יש לכם השערה לגבי מתי התקיימה הפריצה? כמה זמן עבר ממועד הפריצה עצמה למועד שזיהיתם אותה?
8. האם הפריצה הייתה חד פעמית ככל הידוע לכם או שמדובר בפירצת אבטחה שהתוקפים ניצלו אותה במשך זמן ממושך?
9. לפני כמה זמן נודע לכם על הפריצה ולאחר כמה זמן עדכנתם את הלקוחות?


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

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

בהודעת בנק ישראל פורסם:

בנק ישראל עודכן לגבי אירוע דלף המידע באפליקציית התשלומים פייבוקס ועוקב מקרוב אחר ההתפתחויות. לצד הפעולות שנקט בנק דיסקונט, בנק ישראל, בהתייעצות עם מערך הסייבר הלאומי, הנחה את הבנק בדבר צעדים נוספים שעליו לנקוט. הרשות להגנת הפרטיות במשרד המשפטים עודכנה אף היא לגבי פרטי האירוע. מהניתוח שבידינו עולה כי אין חשש לפגיעה כספית ישירה בלקוחות האפליקציה כתוצאה מהמידע שנחשף. בנק ישראל ממשיך לבדוק את פרטי האירוע. לאור התגברות הפעילות הפיננסית באמצעים הדיגיטליים, וכפי שאמרנו בעבר, מומלץ שהציבור יהיה ערני כלפי ניסיונות הונאה (דוגמת פישינג- "דיוג") ויפעל על פי המלצות התגוננות שבנק ישראל פרסם זה מכבר בקישור המצורף: https://www.boi.org.il/he/BankingSupervision/Pages/digitalscams.aspx​ הפיקוח על הבנקים יבצע תחקיר מעמיק של האירוע, יסיק מסקנות, וינחה את הבנק ואת המערכת הבנקאית בהתאם.​

איגוד האינטרנט גם הוא מזהיר (BLOCK):

הודעה זו היא אמיתית, ואכן הגיעה מ-Paybox. לצערנו, מניסיון העבר עולה כי נוכלים "רוכבים על הגל", ומנצלים הודעות אלו על מנת לגנוב כסף ופרטים אישיים ממשתמשים. כיצד ניתן להיזהר? שימו לב – אם מבקשים מכם פרטי כרטיס אשראי, פרטים אישיים או סיסמא, ומתחזים לנציגי Paybox – ב-SMS, במייל או בטלפון – חשדו! זו כמעט בוודאות הונאה. אם אתם מתלבטים, התקשרו לשירות הלקוחות של Paybox ובדקו זאת. גם עמוד באינטרנט שמתחזה ל-Paybox עלול לצוץ. אם אתם נכנסים לאתר Paybox ודאו שמדובר באתר הרשמי (payboxapp.com).

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

תקנה 11(ד)(1) לתקנות הגנת הפרטיות (אבטחת מידע), תשע"ז-2017 (להלן: "התקנות") קובעת כי בעל מאגר מידע* שחלה עליו רמת אבטחה בינונית או גבוהה (כהגדרתן בתקנות) מחויב להודיע לרשות להגנת הפרטיות באופן מיידי על אירוע אבטחה חמור (כהגדרתו בתקנות), וכן ידווח לרשות על הצעדים שנקט בעקבות האירוע. ככלל, על הדיווח להיעשות תוך 24 שעות ממועד גילויו של אירוע האבטחה החמור, ובכל מקרה לא יאוחר מ – 72 שעות מאותו מועד.

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


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

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

התקנת DOCKER בJenkins

על מנת שJENKINS יוכל לעשות דפלוי לאפלקציות בקונטיינרים (Containerized app), אנו צריכים להתקין את DOCKER על השרת שעליו רץ הג'נקינס שלנו.

בשלב הראשון נתקין את DOCKER ונפעיל את השירות

sudo yum -y install docker
sudo systemctl start docker
sudo systemctl enable docker

לאחר מכן ניתן הרשאות לג'נקינס להשתמש בDOCKER , כדי לעשות זאת ניצור קבוצה לDOCKER ונוסיף את המשתמש של ג'נקינס לקבוצה.

sudo groupadd docker
sudo usermod -aG docker jenkins

נפעיל מחדש את השירות JENKINS ואת DOCKER

sudo systemctl restart jenkins
sudo systemctl restart docker

זהו, ככה פשוט.


לקריאה נוספת:
1. איך להתקין Jenkins בCentOS7
2. יצירת Jenkins Job פשוט שמושך קבצים מGIT
3. על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו
4. קצת על Jenkins Pipelines
5. התקנת DOCKER בJenkins

קצת על Jenkins Pipelines

Jenkins Piplines הם שילוב של פלאגינים של ג'נקינס שעוזרים לנו לממש Continuous Delivery בג'נקינס.

Pipline הוא תהליך אוטומטי שלוקח את קוד המקור שלנו דרך ה"Pipline" – עד לפרודקשין. בדרכ נממש בו לפחות 3 שלבים (STAGES),
Build, Test , Deploy.

קובץ הpipline נקרא Jenkinsfile ואנו שומרים אותו במערכת הSource Control שלנו ביחד עם קוד האפלקציה שלנו.

כדי ליצור Pipline חדש, כל שאנו צריכים לעשות הוא ליצור קובץ Jenkinsfile ולהוסיף אותו לGIT ריפו שלנו, לאחר מכן כשאנו יוצרים פרויקט ג'נקינס חדש – נבחר הפעם פרויקט מסוג Pipline או Multibranch Pipline.

דוגמה לpipline מסוג Declarative שלא עושה כלום מלבד ECHO של 3 השלבים (Stages):

pipeline {
    agent any 
    stages {
        stage('Build') { 
            steps {
                echo 'Building...' 
            }
        }
        stage('Test') { 
            steps {
                echo 'Testing...' 
            }
        }
        stage('Deploy') { 
            steps {
                echo 'Deploying!' 
            }
        }
    }
}

כל שלב או תהליך (STAGE) מכיל בתוכו "צעדים" (STEPS), לדוגמה צעד ראשון: להריץ פקודה מסויימת, צעד שני: להעתיק את הקבצים לשרת, צעד שלישי: לאתחל את APACHE.

לקריאה נוספת:
1. איך להתקין Jenkins בCentOS7
2. יצירת Jenkins Job פשוט שמושך קבצים מGIT
3. על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו
4. קצת על Jenkins Pipelines
5. התקנת DOCKER בJenkins

על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו

על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו


לקריאה נוספת:
1. איך להתקין Jenkins בCentOS7
2. יצירת Jenkins Job פשוט שמושך קבצים מGIT
3. על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו
4. קצת על Jenkins Pipelines
5. התקנת DOCKER בJenkins


WebHooks בגיטהאב מאפשרים לנו לקבל עדכון כאשר בוצע שינוי בקוד שלנו, בחיבור לJenkins נוכל להגדיר JOB שירוץ כאשר מתקבל עדכון כזה.
לשמחתנו, Jenkins יכול להגדיר עבורנו אוטומטית WebHooks בגיטאהב.

השלבים:

  1. יצירת Access Token בחשבון הגיטאהב שלנו עם הרשאות לקרוא ולכתוב לWebHooks + הוספת שרת גיטאהב לJenkins על מנת שינהל עבורנו WEBHOOKS בגיטאהב.
  2. יצירת Jenkins Job מתאים.
  3. הגדרת הWEBHOOK בגיט רפו שלנו.

יצירת Access Token

בתפריט ההגדרות של הגיטאהב שלכם (https://github.com/settings/profile) ליחצו בתפריט על "Developer Settings" – ואז על "Personal access tokens"
https://github.com/settings/tokens

לאחר מכן ליחצו על "Generate New Token".
בטופס שקיבלנו נמלא את הפרטים, בNOTE אני כתבתי "Jenkins Test" ובהרשאות יש לסמן "admin:repo_hook"

ואז נילחץ על הכפתור הירוק "Generate Token".

נעתיק את הAPI KEY שקיבלנו – אנו ניצטרך אותו כאשר נגדיר את הJOB בJenkins.
בתפריט הJenkins שלנו נלחץ על "Manage Jenkins"

ואז נלחץ על "Configure System"

נגלול למטה עד שנגיע ל"GitHub Servers" ונמלא את הפרטים.

נלחץ על "Add" שליד "Credentials" ובתפריט דרופדאון של הKIND נבחר SECRET KEY. בSECRET נדביק את הAPI KEY שקיבלנו. בID אני הזנתי github_key ובתיאור נזין מה שנוח לנו. במקרה שלי הזנתי GitHub Key

לאחר שסיימנו נלחץ על Add. ואז נסמן V ליד "Manage hooks". כמו כן בדרופ דאון של ה"Credentials" נסמן את הקי החדש שהוספנו שקראתי לו "GitHub Key"

נלחץ על הכפתור "Test Connection" כדי לוודא שהכל פועל כשורה, במיקרה שלי קיבלתי בחזרה: Credentials verified for user avivronen, rate limit: 4998

נלחץ על SAVE.

סיימנו את השלב הראשון, עכשיו שרת הJENKINS שלנו יכול לתקשר ישירות עם GITHUB וליצור ולנהל עבורנו WEBHOOKS.


שלב 2 – יצירת Jenkins Job

ניצור ג'וב חדש לפי השלבים שרשומים כאן, רק שהפעם, בגיטריפו נזין גיט ריפו שלנו שיש לנו הרשאות אליה, במיקרה שלי: "https://github.com/avivronen/php-docs-hello-world" (הריפו הזה זה פורק של הריפו שהשתמשנו בו במדריך הקודם) ובנוסף נסמן V ליד "GitHub hook trigger for GITScm polling". ונלחץ על SAVE.


שלב 3: הגדרת WEBHOOK בריפו שלנו.

נחזור לריפו שלנו בגיטאהב, נלחץ על SETTINGS, ואז נלחץ על Web hooks.
ושימו לב, שכבר עכשיו תוכלו לראות את הWEBHOOK שנוצר אוטומטית על ידי הJENKIN שלנו.
ברגע שתעשו COMMIT לריפו שלכם, הBUILD בגנקינס ירוץ אוטומטית. בהצלחה!


לקריאה נוספת:
1. איך להתקין Jenkins בCentOS7
2. יצירת Jenkins Job פשוט שמושך קבצים מGIT
3. על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו
4. קצת על Jenkins Pipelines
5. התקנת DOCKER בJenkins

יצירת Jenkins Job פשוט שמושך קבצים מGIT


לקריאה נוספת:
1. איך להתקין Jenkins בCentOS7
2. יצירת Jenkins Job פשוט שמושך קבצים מGIT
3. על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו
4. קצת על Jenkins Pipelines
5. התקנת DOCKER בJenkins


במקרה שלי, כדי שהJOB יוכל למשוך את הקבצים מGIT הייתי צריך להתקין בשרת את ..גיט..על ידי הפקודה הפשוטה

sudo yum install git

בתפריט הצדדי נבחר ב"New Item"

נבחר שם לJOB שלנו (במקרה שלי "demojob"), ובאפשרויות נבחר Freestyle Project

באפשרות Source Code Managment נבחר בGIT

ב "Repository URL" נזין את הכתובת

https://github.com/Azure-Samples/php-docs-hello-world.git

את הBranch נשאיר בMaster.

לאחר שסיימנו נלחץ על "Save".

אם נלחץ בתפריט הצדדי על "Build Now" , הJOB ירוץ ולאחר שיסיים במידה ונקליד את 2 הפקודות הבאות בשרת שלנו:


cd /var/lib/jenkins/workspace/demojob
ls -la

נוכל לראות שאכן הJOB משך בהצלחה את הקבצים מהGIT REPO והם נמצאים בתיקייה של הJOB.

total 16
drwxr-xr-x. 3 jenkins jenkins   85 Dec 23 11:32 .
drwxr-xr-x. 3 jenkins jenkins   21 Dec 23 11:32 ..
drwxr-xr-x. 8 jenkins jenkins  162 Dec 23 11:32 .git
-rw-r--r--. 1 jenkins jenkins  251 Dec 23 11:32 .gitignore
-rw-r--r--. 1 jenkins jenkins   28 Dec 23 11:32 index.php
-rw-r--r--. 1 jenkins jenkins 1183 Dec 23 11:32 LICENSE
-rw-r--r--. 1 jenkins jenkins  684 Dec 23 11:32 README.md

מצאתם טעות? הערות? שאלות? הסתדרתם? נתקעתם? כתבו לי בתגובות!

לקריאה נוספת:
1. איך להתקין Jenkins בCentOS7
2. יצירת Jenkins Job פשוט שמושך קבצים מGIT
3. על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו
4. קצת על Jenkins Pipelines
5. התקנת DOCKER בJenkins

איך להתקין Jenkins בCentOS7


לקריאה נוספת:
1. איך להתקין Jenkins בCentOS7
2. יצירת Jenkins Job פשוט שמושך קבצים מGIT
3. על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו
4. קצת על Jenkins Pipelines
5. התקנת DOCKER בJenkins


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

נריץ את הפקודות הבאות:

בשלב הראשון עלינו להתקין את Java SDK

yum install java-1.8.0-openjdk

נוכל לוודא את ההתקנה על ידי הפקודה

java -version

הפלט של הפקודה הנל אמור להראות כך:

[root@localhost ~]# java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

נוסיף את הריפו של ג'נקינס:

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key

ולאחר מכן נוכל להתקין את ג'נקינס:

sudo yum install jenkins

לאחר מכן נוכל לאפשר ולאתחל את השירות של ג'נקינס על ידי הפקודות הבאות:

sudo systemctl enable jenkins
sudo systemctl start jenkins

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

firewall-cmd --permanent --new-service=jenkins
firewall-cmd --permanent --service=jenkins --set-short="Jenkins Service Ports"
firewall-cmd --permanent --service=jenkins --set-description="Jenkins service firewalld port exceptions"
firewall-cmd --permanent --service=jenkins --add-port=8080/tcp
firewall-cmd --permanent --add-service=jenkins
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload

הדבר האחרון שנותר לנו לעשות הוא לסיים את ההתקנה באמצעות הדפדפן, במידה וכתובת הIP של השרת שלנו היא לדוגמה: 1.2.3.4 אנו ניגש לכתובת: 1.2.3.4:8080 (פורט 8080).

כדי לקבל את קוד האימות נריץ את הפקודה:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

נעקוב אחרי המשך ההוראות – וסיימנו. ככה פשוט.


מדריך התקנה באתר ג'נקינס הרשמי: https://jenkins.io/doc/book/installing/
מדריך התקנה בגנקינס WIKI להפצות רד הט: https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions


מצאתם טעות? הערות? שאלות? הסתדרתם? נתקעתם? כתבו לי בתגובות!

לקריאה נוספת:
1. איך להתקין Jenkins בCentOS7
2. יצירת Jenkins Job פשוט שמושך קבצים מGIT
3. על Jenkins וWebHooks – עדכון אוטומטי כאשר מתבצע שינוי בקוד בריפו שלנו
4. קצת על Jenkins Pipelines
5. התקנת DOCKER בJenkins

מה זה Gradle Build?

Gradle Build מוגדר בקובץ בשם build.gradle (בשפת גרובי או קוטלין) שממוקם בתיקיית הROOT של הפרויקט.
על ידי הפקודה:

gradle init

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

כל gradle build מוגדר בעצם מ"משימות" – gradle tasks. כדי להריץ "משימה" ספציפית נריץ את הקוד הבא (בהנחה ושם המשימה שלנו הוא "sampletask1"

./gradlew sampletask1

קובץ הbuild.gradle שלנו בעצם אמור להכיל את כל המשימות שזמינות לפרויקט שלנו.

בדוגמה הבאה למשל ניצור "משימה" שקוראים לה "sampletask1" שכל מה שהיא עושה זה להדפיס את המילה "ישראל"

task sampletask1 {
  println 'Israel'
}

ניתן בנוסף להגדיר משימות שתלויות – Dependencies – במשימות אחרות, לדוגמה נוכל להגדיר 2 משימות, האחת בשם task1 והשנייה בשם task2 כאשר task2 תלויה במשימה task1, דהיינו המשימה task1 תהיה חייבת לרוץ ולהצליח לפני המשימה task2.

בנוסף לGradle יש המון תוספים – plugins שיכולים לעזור לנו בהמון מצבים, את התוספים אפשר לכלול בקובץ build.gradle שלנו , לדוגמה על ידי השורות הבאות

plugins {
 id "<plugin id here>" version "<plugin version here">
}

קובץ build לדוגמה:


/*
 * This file was generated by the Gradle 'init' task.
 *
 * This is a general purpose Gradle build.
 * Learn how to create Gradle builds at https://guides.gradle.org/creating-new-gradle-builds
 */

task sayIsrael << {
 println 'Israel'
}

task task2 {
 println 'task task2 is here'
}

הקובץ מכיל 2 משימות, האחת בשם sayIsrael שמדפיסה Israel ומשימה שנייה בשם task2 שמדפיסה 'task task2 is here'

אם נריץ את הפקודה:

./gradlew sayIsrael

נקבל

[aviv@localhost test1]$ ./gradlew sayIsrael

> Configure project :
Israel
task task2 is here

BUILD SUCCESSFUL in 1s

וכשנריץ

./gradlew task2

נקבל:

[aviv@localhost test1]$ ./gradlew task2

> Configure project :
Israel
task task2 is here

BUILD SUCCESSFUL in 1s

כשנוסיף לקובץ בילד שלנו לדוגמה את השורה
sayIsrael.dependsOn task2
ונריץ שוב את המשימה sayIsrael נקבל הפעם

[aviv@localhost test1]$ ./gradlew -q sayIsrael
Israel
task task2 is here

למרות שהרצנו לכאורה רק את המשימה sayIsrael.

מצאתם טעות? הערות? שאלות? הסתדרתם? נתקעתם? כתבו לי בתגובות!

להמשיך לקרוא מה זה Gradle Build?

איך להתקין Gradle בCentos7

נריץ את הפקודות הבאות:

cd ~/
wget -O ~/gradle-bin.zip https://services.gradle.org/distributions/gradle-6.0.1-bin.zip
sudo yum -y install unzip java-1.8.0-openjdk
sudo mkdir /opt/gradle
sudo unzip -d /opt/gradle/ ~/gradle-bin.zip

נערוך את הקובץ gradle.sh על ידי הפקודה הבאה:

sudo nano /etc/profile.d/gradle.sh

ונכתוב לקובץ את השורה הבאה:

export PATH=$PATH:/opt/gradle/gradle-6.0.1/bin

ניתן הרשאות מתאימות לקובץ gradle.sh

sudo chmod 755 /etc/profile.d/gradle.sh

אחרי שעשינו Logout וLogin מחדש למכונה, נריץ את הפקודה הבאה כדי לוודא שההתקנה בוצעה בהצלחה

gradle --version

זהו, ככה קל.

[aviv@localhost ~]$ gradle --version

Welcome to Gradle 6.0.1!

Here are the highlights of this release:
 - Substantial improvements in dependency management, including
   - Publishing Gradle Module Metadata in addition to pom.xml
   - Advanced control of transitive versions
   - Support for optional features and dependencies
   - Rules to tweak published metadata
 - Support for Java 13
 - Faster incremental Java and Groovy compilation
 - New Zinc compiler for Scala
 - VS2019 support
 - Support for Gradle Enterprise plugin 3.0

For more details see https://docs.gradle.org/6.0.1/release-notes.html


------------------------------------------------------------
Gradle 6.0.1
------------------------------------------------------------

Build time:   2019-11-18 20:25:01 UTC
Revision:     fad121066a68c4701acd362daf4287a7c309a0f5

Kotlin:       1.3.50
Groovy:       2.5.8
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          1.8.0_232 (Oracle Corporation 25.232-b09)
OS:           Linux 3.10.0-1062.9.1.el7.x86_64 amd64

כדי להתקין את Graddle Wrapper נריץ את הפקודות הבאות:

cd ~/
mkdir my-project
cd my-project
gradle wrapper
./gradlew build

לאתר Gradle
https://gradle.org/


מצאתם טעות? הערות? שאלות? הסתדרתם? נתקעתם? כתבו לי בתגובות!

להמשיך לקרוא איך להתקין Gradle בCentos7