• בלוג
  • חמש דקות על Bitbucket Pipelines

חמש דקות על Bitbucket Pipelines

27/05/2019

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

1. מה אנחנו בונים

המנגנון של Bitbucket Pipelines מאפשר להריץ פקודה כל פעם שאתם דוחפים קומיט, כאשר שני השימושים העיקריים במנגנון הוא להריץ את הבדיקות אחרי כל קומיט או לעשות Deployment למכונת Staging אחרי כל קומיט (יש גם אופציה להפעיל Pipeline באופן יזום למשל בשביל Deployment לסביבת ייצור, אבל אני אשאיר את זה לפוסט המשך בעתיד).

בשביל התחלה אני רוצה לבנות פרויקט Node.JS עם קובץ בדיקות כך שכל פעם שאני מעלה קומיטים חדשים (כלומר מפעיל push) הבדיקה תרוץ אוטומטית.

2. מבנה הפרויקט

הפרויקט שאני בונה הוא פרויקט Express ומנגנון הבדיקות מתבסס על ספריית mocha. תחילה יצרתי את הפרויקט עם ה express-generator:

$ express

  warning: the default view engine will not be jade in future releases
  warning: use `--view=jade' or `--help' for additional options


   create : public/
   create : public/javascripts/
   create : public/images/
   create : public/stylesheets/
   create : public/stylesheets/style.css
   create : routes/
   create : routes/index.js
   create : routes/users.js
   create : views/
   create : views/error.jade
   create : views/index.jade
   create : views/layout.jade
   create : app.js
   create : package.json
   create : bin/
   create : bin/www

   install dependencies:
     $ npm install

   run the app:
     $ DEBUG=bitbucket-pipelines:* npm start

לאחר מכן הוספתי את mocha ואת ה Test Reporter המתאים:

$ npm install --save mocha mocha-junit-reporter 

ובסוף המשכתי לכתוב את הקוד והבדיקות עבורו. בתוך תיקיה חדשה בשם utils יצרתי קובץ בשם primes.js עם התוכן הבא:

exports.isPrime = num => {
  return false;

    for(let i = 2, s = Math.sqrt(num); i <= s; i++)
        if(num % i === 0) return false; 
    return num > 1;
};

ובתוך תיקיה חדשה בשם test יצרתי קובץ בשם primes.js עם התוכן הבא:

const assert = require('assert');
const isPrime = require('../utils/primes').isPrime;

describe('isPrime', function() {
  it('should tell 5 is a prime number', function() {
    assert.equal(isPrime(5), true);
  });

  it('should tell 27 is not a prime number', function() {
    assert.equal(isPrime(27), false);
  });
});

כמו כן הוספתי ל package.json את הבלוק הבא כדי שאפשר יהיה לכתוב npm test ולהריץ את הבדיקות:

  "scripts": {
    "start": "node ./bin/www",
    "test": "node ./node_modules/mocha/bin/mocha test --reporter mocha-junit-reporter --reporter-options mochaFile=./test-reports/junit.xml"
  },

הדבר החשוב כאן הוא לבנות את הבדיקות כך שייצרו XML עם תוצאות בפורמט של JUnit, ושקובץ התוצאות יישמר בספריה בעלת שם קבוע test-reports. למעשה ביטבאקט מוכן לחפש את הקובץ הזה בכל אחד מהשמות הבאים:

./**/surefire-reports/**/*.xml
./**/failsafe-reports/**/*.xml
./**/test-results/**/*.xml
./**/test-reports/**/*.xml

אם הכל הלך כמו שצריך תוכלו להריץ על המכונה שלכם:

$ npm test

וזה ייצור אצלכם את הקובץ test-reports/junit.xml עם תוצאות הבדיקות.

מוזמנים לראות את הפרויקט המלא שלי בריפוזיטורי כאן:

https://bitbucket.org/ynonp/pipelines-test/src

3. הקובץ bitbucket-pipelines.yml

מנגנון ה Pipelines של ביטבאקט מתחיל מהקובץ bitbucket-pipelines.yml שצריך להיות בתיקיה הראשית של הפרויקט. בקובץ זה אנחנו רושמים "דף הוראות" לביטבאקט בפורמט yml. הנה הקובץ שאני השתמשתי בו:

image: node:11.11.0
pipelines:
  default:
    - step:
        script:
          - npm install
          - npm test

אנחנו מגדירים pipeline ברירת מחדל עם המילה default, אחרי זה מגדירים בתוכו שלבי בניה (בדוגמא יש רק שלב אחד) והשלבים השונים מבוצעים אחד אחרי השני, ובכל שלב מחדש ביטבאקט יוצר Docker Container חדש, מושך אליו את הקוד שלכם ואז מפעיל את הסקריפטים אחד אחרי השני. בסיום השלב ביטבאקט בודק אם יש קובץ תוצאות לבדיקות ואם כן מציג לנו את זה בתפריט.

בגלל שהשלבים רצים בתוך Docker Container אנחנו צריכים לציין איזה אימג' לקחת. אפשר לבחור כאן אימג' רשמי של דוקר אבל אפשר גם למשוך כל אימג' שאתם יצרתם והעליתם ל docker hub.

4. מה קיבלנו

המנגנון של ביטבאקט עובד מאוד יפה ובאמת כל פעם שאתם דוחפים קוד לפרויקט ה Pipeline ירוץ ובמקרה שלנו הוא מריץ את הבדיקות וגם מראה ב GUI באתר את כל התוצאות. אתם יכולים לראות כאן את הממשק עם שתי פעולות Push שאני כבר עשיתי, בראשונה הבדיקות עברו ובשניה הבדיקות נכשלו:

https://bitbucket.org/ynonp/pipelines-test/addon/pipelines/home