חמש דקות על Bitbucket Pipelines
שירותי אחסון גיט בענן כבר מזמן כוללים שירותי 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