<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Geofrey Bundala</title>
    <description>The latest articles on DEV Community by Geofrey Bundala (@geofreybundala).</description>
    <link>https://dev.to/geofreybundala</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F845920%2F6ac2a4da-ae78-4c73-94c2-47d2f5dbea08.jpg</url>
      <title>DEV Community: Geofrey Bundala</title>
      <link>https://dev.to/geofreybundala</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/geofreybundala"/>
    <language>en</language>
    <item>
      <title>How to Carry Out Effective User Acceptance Testing with agile methodology</title>
      <dc:creator>Geofrey Bundala</dc:creator>
      <pubDate>Mon, 12 Sep 2022 06:26:13 +0000</pubDate>
      <link>https://dev.to/clickpesa/how-to-carry-out-effective-user-acceptance-testing-with-agile-methodology-5ci3</link>
      <guid>https://dev.to/clickpesa/how-to-carry-out-effective-user-acceptance-testing-with-agile-methodology-5ci3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Agile&lt;/strong&gt; is an iterative approach to project management and software development that helps teams deliver value to their customers faster and with fewer headaches. Instead of betting everything on a "big bang" launch, an agile team delivers work in small, but consumable, increments. Requirements, plans, and results are evaluated continuously so teams have a natural mechanism for responding to change quickly. &lt;a href="https://www.atlassian.com/agile"&gt;Further reading&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agile&lt;/strong&gt;  It involves constant collaboration with stakeholders and continuous improvement at every stage. Once the work begins, teams cycle through a process of planning, executing, and evaluating. Continuous collaboration is vital, both with team members and project stakeholders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User Acceptance Testing (UAT)&lt;/strong&gt; is one of the last stages of the software development life cycle. It is performed after the software has been thoroughly tested. It is sometimes known as End User Testing&lt;/p&gt;

&lt;h2&gt;
  
  
  The following steps are involved in UAT:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Planning:&lt;/strong&gt; The UAT strategy - which mainly includes time-frame - is outlined during the planning step.&lt;/p&gt;

&lt;p&gt;Designing test cases: These are created to cover the core functional scenarios of the software in real-world usage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UAT team:&lt;/strong&gt; The testing team is comprised of real world end-users or users who are not part of the development/testing phases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execution &amp;amp; Documentation of test cases:&lt;/strong&gt; The testing team executes the designed test cases as well as the relevant random exploratory tests. All bugs are logged in the bug tracker with steps to reproduce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug fixing:&lt;/strong&gt; Taking an account of the bugs filed by the testing team, the development team starts with the bug fixation depending on its severity. Once all the tests are run and the results are in hand, the Acceptance Decision is made, which is also known as the Go/No-Go call. If the users are satisfied, it’s a Go for production or a No-go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User acceptance testing tips&lt;/strong&gt;&lt;br&gt;
It is every test engineer’s dream to ensure that the right solution is delivered to the users. This section will discuss some tips a developer may use while performing UAT along with best practices.&lt;br&gt;
&lt;strong&gt;Set up the right environment:&lt;/strong&gt; Having a production-like test environment is important. Accurate performance testing cannot be carried out in test environments.&lt;br&gt;
&lt;strong&gt;Plan your test:&lt;/strong&gt; Design a clear test acceptance plan during the requirement analysis and design phase. Planning reduces pressure to meet deadlines.&lt;br&gt;
&lt;strong&gt;Train the UAT staff properly:&lt;/strong&gt; The testers need to be trained on the developed business requirements. During the planning phase, select and train testers. This can significantly increase the success of UAT.&lt;br&gt;
&lt;strong&gt;Have the right communication channel:&lt;/strong&gt; UAT involves collaboration between the development, quality assurance (QA), and UAT team. Having a proper communication channel is key to the success of UAT, especially when the teams are working remotely.&lt;br&gt;
&lt;strong&gt;Do not use the functional testing team:&lt;/strong&gt; Functional testers are not meant to perform UAT. Functional testers may end up not testing all real-world scenarios. This leads to end-users finding issues when the software is in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  When should you not do UAT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Its standard package so doesn't need testing( COTS)&lt;/li&gt;
&lt;li&gt;The staff don't understand the new system , users was not involved in early process&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>uat</category>
      <category>testing</category>
      <category>agile</category>
    </item>
    <item>
      <title>Experience on PM2 Tricks to manage your NodeJs processes</title>
      <dc:creator>Geofrey Bundala</dc:creator>
      <pubDate>Fri, 05 Aug 2022 12:33:00 +0000</pubDate>
      <link>https://dev.to/clickpesa/experience-on-pm2-tricks-to-manage-your-nodejs-processes-1j7f</link>
      <guid>https://dev.to/clickpesa/experience-on-pm2-tricks-to-manage-your-nodejs-processes-1j7f</guid>
      <description>&lt;p&gt;As as a back-end developer I always interact with the servers by using different tools in order visualize on going and failed processes  by  checking logs also  debugging etc , when its comes to NodeJs PM2 it common tool to be used &lt;/p&gt;

&lt;p&gt;One day I was working on server and I was changing only  environment variable as to make change to reflect  I restarted an app by running command&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PM2 restart &amp;lt;App name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It fails to restart due to error of  missing some environment variable , I was looking fast way around to start again an app again I took some time for fixing by adding those missing variable but I was not luck at all &lt;br&gt;
Then thanks to my team leader remind me to use &lt;/p&gt;

&lt;p&gt;&lt;code&gt;PM2 resurrect&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And the app starts running  :) &lt;/p&gt;

&lt;h2&gt;
  
  
  What is PM2
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PM2&lt;/strong&gt; is node daemon process management that comes with load balancer (improves application availability and responsiveness and prevents server overload).&lt;br&gt;
PM2 offers a simple CLI tool and is installed via NPM , and bunch of command to be used on starting, stoping, restarting, checking logs and more &lt;/p&gt;

&lt;p&gt;What PM2 resurrect does it to restore previously saved process list&lt;br&gt;
PM2 process list are saved with command below&lt;br&gt;
PM2 save &lt;br&gt;
PM2 save takes a snapshot of your currently running Node applications, This saves the processes currently managed by PM2 to disk so they're accessible to the daemon on system boot.&lt;/p&gt;

&lt;p&gt;Running PM2 contains environment(process.env) variable on heap (The heap is the RAM used by the program you're asking PM2 to manage and monitor), saving command will save all instances variables &lt;br&gt;
you can see what memory usage by this command.&lt;br&gt;
  &lt;code&gt;pm2 monit&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This means incase something went wrong resurrect can be used to revert running instances with no issue&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantage of using PM2
&lt;/h2&gt;

&lt;p&gt;pm2 offer run multiple processes with multiple cores of CPU to achieve the Load Balancer like effect&lt;br&gt;
Can easy used on  CI/CD deployment&lt;br&gt;
 Schedule to restart periodically&lt;br&gt;
pm2 help to organise log&lt;br&gt;
Allows auto-restart under specific conditions, such as ‘up-time’, ‘memory usage’ &lt;br&gt;
 It provides much information, including restarting number, CPU usage, memory usage, process_id etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative of PM2 with build in load Balancer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nodemon.io/"&gt;Nodemon.io&lt;/a&gt;&lt;br&gt;
Monitor for any changes in your &lt;a href="https://nodejs.org/en/"&gt;NodeJS&lt;/a&gt; application and automatically restart the server - perfect for development&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/forever"&gt;Forever&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
A simple CLI tool for ensuring that a given script runs continuously (i.e. forever)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/supervisor"&gt;Supervisor&lt;/a&gt;&lt;br&gt;
Supervisor process control system for UNIX&lt;/p&gt;

&lt;p&gt;You can add comment below on the issue you faced on servers&lt;/p&gt;

&lt;p&gt;If you like this article there are more like this in our blogs, follow us on &lt;a href="https://dev.to/clickpesa"&gt;dev.to&lt;/a&gt; and&lt;br&gt;
&lt;a href="//medium.com/@clickpesa"&gt;medium&lt;/a&gt; &lt;/p&gt;

</description>
      <category>backend</category>
      <category>pm2</category>
    </item>
    <item>
      <title>Multisignature in stellar blockchain</title>
      <dc:creator>Geofrey Bundala</dc:creator>
      <pubDate>Tue, 12 Jul 2022 21:26:25 +0000</pubDate>
      <link>https://dev.to/clickpesa/multisignature-in-stellar-blockchain-k0d</link>
      <guid>https://dev.to/clickpesa/multisignature-in-stellar-blockchain-k0d</guid>
      <description>&lt;p&gt;Signatures are required to authorize operations and to authorize changes to the source account,&lt;br&gt;
Transaction signatures are created by cryptographically signing the transaction object contents with a secret key. Stellar currently uses the ed25519 signature scheme, but there's also a mechanism for adding additional types of public/private key schemes. A transaction with an attached signature is considered to have authorization from that public key.&lt;br&gt;
Multisignature - is useful to add extra security to an account and power&lt;br&gt;
a transaction that may need more than one signature. If the transaction has operations that affect more than one account, it will need authorization from every account in question. A transaction will also need additional signatures if the account associated with the transaction has multiple public keys. &lt;a href="https://developers.stellar.org/docs/glossary/multisig/#thresholds"&gt;More details&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is stellar threshold
&lt;/h3&gt;

&lt;p&gt;Is the amount of signature weight required to authorize an operation, threshold has 3 levels which are low, medium, or high, threshold for a given level can be set to any number from 0–255&lt;/p&gt;

&lt;p&gt;How it works&lt;/p&gt;

&lt;p&gt;Consider the table below on how to  set threshold&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;
&lt;strong&gt;Level&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;
&lt;strong&gt;Operations&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;
&lt;strong&gt;Number&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Low
   &lt;/td&gt;
   &lt;td&gt;
&lt;ul&gt;

&lt;li&gt;Trusting Processing

&lt;/li&gt;
&lt;li&gt;Allow trust and &amp;amp; Set Trustline Flag

&lt;/li&gt;
&lt;li&gt;Bump Sequence
&lt;/li&gt;
&lt;/ul&gt;
   &lt;/td&gt;
   &lt;td&gt;
    1
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Medium 
   &lt;/td&gt;
   &lt;td&gt;
&lt;ul&gt;

&lt;li&gt;All other &lt;a href="https://developers.stellar.org/docs/start/list-of-operations/#content"&gt;Operations&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
   &lt;/td&gt;
   &lt;td&gt;
    2
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;High
   &lt;/td&gt;
   &lt;td&gt;
&lt;ul&gt;

&lt;li&gt;High security

&lt;/li&gt;
&lt;li&gt;Set options

&lt;/li&gt;
&lt;li&gt;Account Merge 
&lt;/li&gt;
&lt;/ul&gt;
   &lt;/td&gt;
   &lt;td&gt;
    3
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Above table show levels, Operation and Numbers&lt;br&gt;&lt;br&gt;
For Low level operations any account can sign  and   make transactions&lt;/p&gt;

&lt;p&gt;For Medium level -&amp;gt; it required two signers with Low level to authorize operation , and only one signer with medium level or High level&lt;/p&gt;

&lt;p&gt;For High level operation -&amp;gt; can authorize any transaction&lt;/p&gt;

&lt;h3&gt;
  
  
  How to  set threshold to  stellar new stellar account
&lt;/h3&gt;

&lt;p&gt;Note that when your create an account for the first time the operations thresholds (low/medium/high) are 0/0/0 and there's no signer's list.&lt;/p&gt;

&lt;p&gt;There are many way you can set threshold depend on what you intend the blockchain to do , example will be as for Anchors&lt;/p&gt;

&lt;p&gt;Consider we have account which is our Anchor account lets call it Operation account&lt;/p&gt;

&lt;p&gt;And will will give it a power to have control over all other accounts this means as Anchor we can be able to handle every transaction is something went wrong and we are going to give Operation account threshold of 3 weight as higher&lt;/p&gt;

&lt;p&gt;And for other accounts let call them customer accounts will give them 2 weight of threshold as medium level &lt;/p&gt;

&lt;p&gt;Also the low threshold will be 1 weight &lt;/p&gt;

&lt;p&gt;See the code snippet below &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xtb-W9SO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1657659061/registration/images/ap0a5htrhbnxp48gulaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xtb-W9SO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1657659061/registration/images/ap0a5htrhbnxp48gulaf.png" alt="alt_text" title="image_tooltip" width="880" height="724"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see we use the &lt;a href="https://developers.stellar.org/docs/start/list-of-operations/#set-options"&gt;setOptions&lt;/a&gt; which Sets options for an account, such as setting the inflation destination or adding an additional signer on an account&lt;/p&gt;

&lt;p&gt;You can see we set medThreshold with 2 weight and masterWeight with 2&lt;/p&gt;

&lt;p&gt;And we added signer which is our Operation account and give weight of 3&lt;/p&gt;

&lt;p&gt;For the case of normal transactions any account can do, but for the high operation it will required Operation account to sign that transaction &lt;/p&gt;

&lt;p&gt;How to sign to a such transaction &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_w9a7Eif--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1657659264/registration/images/sm8b1oxdfqwlyzflbh95.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_w9a7Eif--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1657659264/registration/images/sm8b1oxdfqwlyzflbh95.png" alt="alt_text" title="image_tooltip" width="880" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let use our example to see issue when setup doesn’t configured well&lt;/p&gt;

&lt;p&gt;What will happen if  we set the threshold and we didnt specify the signer :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5Iu-Vczq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1657659351/registration/images/e8sd7uhbgoecasfxpixx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5Iu-Vczq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1657659351/registration/images/e8sd7uhbgoecasfxpixx.png" alt="alt_text" title="image_tooltip" width="880" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It means any account can be used to sign to perform any transaction since each account has 2 weight and to perform a higher operation 1 weight is missing so any account can sign and make 4 weight which is greater than 3&lt;/p&gt;

&lt;p&gt;There are more &lt;a href="https://developers.stellar.org/docs/glossary/multisig/#example-1:-anchors"&gt;example&lt;/a&gt; on how to configure threshold and experience the power of blockchain&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Automate software versioning, release and changelog with CI/CD pipelines</title>
      <dc:creator>Geofrey Bundala</dc:creator>
      <pubDate>Mon, 30 May 2022 08:30:06 +0000</pubDate>
      <link>https://dev.to/clickpesa/automate-software-versioning-release-and-changelog-with-cicd-pipelines-3mj</link>
      <guid>https://dev.to/clickpesa/automate-software-versioning-release-and-changelog-with-cicd-pipelines-3mj</guid>
      <description>&lt;h2&gt;
  
  
  Automate software versioning, release and changelog with CI/CD pipelines
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is software release?
&lt;/h3&gt;

&lt;p&gt;Is the final version of software released to the end-users after further enhancements and bugs fixes &lt;/p&gt;

&lt;h3&gt;
  
  
  What is software versioning ?
&lt;/h3&gt;

&lt;p&gt;Software versioning is the process of numbering different releases of a particular software program for both internal use and release designation.&lt;/p&gt;

&lt;p&gt;All released changes with version number are recorded in specific order into a file know as changelog &lt;/p&gt;

&lt;h3&gt;
  
  
  Common method of versioning
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Semantic versioning - **this is common method used , where by it consist three groups of numbers&lt;/strong&gt; &lt;strong&gt;Major, Minor and Patch&lt;/strong&gt; ,&lt;strong&gt;semantic version has  this structure **MAJOR&lt;/strong&gt;.&lt;strong&gt;MINOR&lt;/strong&gt;.&lt;strong&gt;PATCH&lt;/strong&gt; 

&lt;ol&gt;
&lt;li&gt;PATCH is counter for bug fixes&lt;/li&gt;
&lt;li&gt;MINOR is counter for functionalities&lt;/li&gt;
&lt;li&gt;MAJOR is a counter for product changes&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;** Date of release - **The software version number is the date of the release example UBUNTU  22.04&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequential numbering&lt;/strong&gt; - assigned a unique identifier that consists of one or more sequences of numbers or letters used to convey the significance of changes between releases. The level of significance are classified by changes from the previous release.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why do we need of versioning
&lt;/h3&gt;

&lt;p&gt;It allows programmers and all people to know when changes have been made and track changes enforced in the software. At the same time, it enables potential customers to be acquainted with new releases and recognize the updated versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How ClickPesa implement software versioning, release and changelog
&lt;/h3&gt;

&lt;p&gt;As ClickPesa we like to automate our process in order to increase our productivity and smooth things by removing human errors, we decided to let pipeline handle versioning process , let see how we manage to achieve this&lt;/p&gt;

&lt;p&gt;For branch or feature which are ready to be deployed in production  means  PR will be created to Production and merged to master , pipeline will run with master Branch&lt;/p&gt;

&lt;p&gt;Actually we are using &lt;a href="https://bitbucket.org/"&gt;Bitbucket&lt;/a&gt; so pipeline is set as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   master:
     - step:
         name: bump version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  We added step for bump version which will do the following
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First retrieve all merged branch commit as save them it bash variable as&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RELEASE_DETAILS
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We use gulp which is javascript package for streaming task runner that lets developers automate many development tasks , so after having RELEASE_DETAILS we passed them into Gulpfile which handle all tasks&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- gulp autoversion --t "${RELEASE_DETAILS}"
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On gulpfile.js&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const gulp = require('gulp');
const runSequence = require('gulp4-run-sequence');
const jsonModify = require('gulp-json-modify');
const gap = require('gulp-append-prepend');

gulp.task('autoVersion', async function () { // Run tasks sequentially
 runSequence('upVersion', 'saveVersion', 'updateChangeLog');
});

gulp.task('upVersion', async function () {
 let ver = require('./package.json').version; //version defined in the package.json file
 console.log('current version: ', ver);
 let splitString = ver.split('.', 3);

 let majorVersion = splitString[0].split('"', 1);
 let minorVersion = splitString[1].split('"', 1);
 let patchVersion = splitString[2].split('"', 1);

 let patchNumber = Number(patchVersion[0]);
 let minorNumber = Number(minorVersion[0]);
 let majorNumber = Number(majorVersion[0]);
 if (patchNumber &amp;lt; 9) {
   patchNumber++;
   splitString[2] = String(patchNumber);
 } else {
   splitString[2] = String(0);
   if (minorNumber &amp;lt; 9) {
     minorNumber++;
     splitString[1] = String(minorNumber);
   } else {
     splitString[1] = String(0);
     majorNumber++;
     splitString[0] = String(majorNumber);
   }
 }

 process.env.VERSION = splitString.join('.');
 console.log(' new version : ', process.env.VERSION);
});
gulp.task('saveVersion', async function () { // saving new version number into package.json
 return gulp
   .src(['./package.json'])
   .pipe(
     jsonModify({
       key: 'version',
       value: process.env.VERSION,
     }),
   )
   .pipe(gulp.dest('./'));
});
gulp.task('updateChangeLog', async function () { // add changes into changelog file
 let messages = process.argv[4];
 console.log(messages);
 messages = messages.replace('&amp;gt;', '*');
 console.log(messages);
 if (messages != '') {
   gulp
     .src('./changelog.md')
     .pipe(gap.prependText(messages))
     .pipe(gap.prependText(`# v${process.env.VERSION}`))
     .pipe(gulp.dest('./'));
 } else {
   console.log('no commit messages');
 }
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As we you can see we call runSequence which call other three tasks upVersion,  saveVersion and updateChangeLog&lt;/p&gt;

&lt;p&gt;As we can see our trigger tasks which is &lt;code&gt;autoVersion&lt;/code&gt;called from a pipeline and inside of it there is runSequence function which call  three tasks upVersion,  saveVersion and updateChangeLog in sequence &lt;/p&gt;

&lt;h5&gt;
  
  
  Let's take a look on  each task
&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt; start with upVersion task

&lt;ol&gt;
&lt;li&gt;What it does is looking into package.json file and get the version number , depend on your way of versioning it can be Semantic or Sequential or other custom way what needed it you will do your magic of bumping up version number  and save the new value in example above new version number is saved on this  process.env.VERSION&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Then we are going to update Package.json file with new version number you can see on code above on this task &lt;code&gt;saveVersion&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Final task is updateChangeLog file &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remember we passed &lt;code&gt;RELEASE_DETAILS&lt;/code&gt;on step 1 which has commits of branch which is merged all details are extracted and saved on variable message you can see on step above where version and commit are added on change log file &lt;/li&gt;
&lt;li&gt;This is changelog.md file we have with our version 0.0.1 changes &lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  v0.0.1
&lt;/h1&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* 👌 IMPROVE: create PR for each branch from staging to master 
* 🐛 FIX:  Inject winston logger to the providers 
* 🐛 FIX: import statements path 
* 👌 IMPROVE: Add wallet transfer transaction job before the payout 
* 👌 IMPROVE: Use one queue to process different jobs 
* 🐛 FIX: Add EBUREAU_WALLET_PAYOUT_TRANSACTION_QUEUE initialization 
* 📦 NEW: Implement a queue for wallet payouts 
* 👌 IMPROVE: add dependencies for gulp 
* 🐛 FIX: name of step for bump version 
* 🤖 TEST: update changelog file and bump version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Wow! Remember we modified two files package.json by updating version number and changelog.md by adding  changes.&lt;/p&gt;

&lt;p&gt;Back on the pipeline process all change files will be committed and pushed as per your setup develop or master branch. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>AUTOMATE JIRA TASKS TRANSITION WITH BITBUCKET-PIPELINE</title>
      <dc:creator>Geofrey Bundala</dc:creator>
      <pubDate>Mon, 02 May 2022 18:26:49 +0000</pubDate>
      <link>https://dev.to/clickpesa/automate-jira-tasks-transition-with-bitbucket-pipeline-5gp7</link>
      <guid>https://dev.to/clickpesa/automate-jira-tasks-transition-with-bitbucket-pipeline-5gp7</guid>
      <description>&lt;h2&gt;
  
  
  AUTOMATE JIRA  TASKS TRANSITION WITH BITBUCKET-PIPELINE
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are Jira tasks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jira  tasks  represents the work needed to be done, Jira help a lot on  managing tasks  on Agile development process for many startups and growing companies like GitHub, Slack , Zendesk and more&lt;/p&gt;

&lt;p&gt;As it  known that on agile developement  its import breaking functionality into small tasks  help keeping track of feature development progress, prioritization , testing and more advantages&lt;/p&gt;

&lt;p&gt;As per my experience, most developers  know the importance of using the Jira boards but mostly we are forgetting to update tasks after making changes.&lt;/p&gt;

&lt;p&gt;As as clickpesa team we looks on a way to automate that processes so as to help developers only to focus on development and let automation to do the rest &lt;/p&gt;

&lt;p&gt;Thanks for atlassian team for provide us out of box &lt;a href="https://support.atlassian.com/cloud-automation/docs/jira-cloud-automation/"&gt;automation&lt;/a&gt; so we can  build solution  using it&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How did we use Jira automation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As clickpesa we have jira boards with columns as shown below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6V9Vs4V_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1648307802/engineering-blog/images/c6memafbhsj2ofk9sspr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6V9Vs4V_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1648307802/engineering-blog/images/c6memafbhsj2ofk9sspr.png" alt="alt text" width="880" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It looks complicated :)? Dont worry you can define your columns depending on your workflow , as per our needs this setup fit to us&lt;/p&gt;

&lt;p&gt;As more column means a lot of manual work and was sound tedious to a developer to update the tasks along the way that why we decided to look for a solution&lt;/p&gt;

&lt;p&gt;With Taking advantage of Jira automation Triggers we did a magic for helping our self by saving energy of moving tasks manual&lt;/p&gt;

&lt;p&gt;As to know estimation of accomplishment for a tasks we set manual process at beginning also to help developer to check their todos&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the following are steps on how we implemented it&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developers will move tasks from &lt;strong&gt;todo&lt;/strong&gt; to &lt;strong&gt;select for development&lt;/strong&gt; in this step developers are required to fill their time estimation for a tasks accomplishment&lt;/li&gt;
&lt;li&gt;Developers create branch by open  and the will see option to create Branch
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H3SiKuho--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1648307919/engineering-blog/images/n6xsdyiyy7horrdhyros.png" alt="drawing" width="880" height="324"&gt;
After creating the branch the task will move to &lt;strong&gt;in progress&lt;/strong&gt; This trigger will be executed and move task to in progress&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CuoEEQ2r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1648307995/engineering-blog/images/r4hktcluu5a7fcw6owwd.png" alt="drawing" width="694" height="668"&gt;
&lt;/li&gt;
&lt;li&gt;Then after developer finish to work for a task he/she will create PR to a develop and then merge changes to develop the task will move from &lt;strong&gt;in review&lt;/strong&gt; to &lt;strong&gt;in develop&lt;/strong&gt;  (on merging to develop we have define tasks on pipeline to create another PR to staging) this is trigger for that
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NWibfOq7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1648308077/engineering-blog/images/jrmqtvpsujsf7d34xpgx.png" alt="drawing" width="618" height="948"&gt;
&lt;/li&gt;
&lt;li&gt;As PR merged to staging the  task will move from &lt;strong&gt;develop&lt;/strong&gt; to &lt;strong&gt;staging&lt;/strong&gt;  (again PR to master will be created )  same trigger as above is used but now with consideration  to check if triggered task is &lt;strong&gt;in develop&lt;/strong&gt; then is moved to &lt;strong&gt;in staging&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;After creating PR to master  the card is moved to &lt;strong&gt;in Review&lt;/strong&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pe1uEPQk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/dojg0fuxn/image/upload/v1648203434/Screenshot_2022-03-24_at_00.21.54_kzudog.png" alt="drawing" width="558" height="608"&gt;
&lt;/li&gt;
&lt;li&gt;Final  after PR reviewed and approved to go live the task  moved to &lt;strong&gt;DONE&lt;/strong&gt;
this is trigger for it
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v6gnJJ5u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1648308394/engineering-blog/images/zwb0ghlnjw4ccqmohtio.png" alt="drawing" width="594" height="618"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Yes, the job is done simple like that , developers cannot move tasks as it was before cool :)&lt;/p&gt;

&lt;p&gt;This approach works well for two days until we get terrible problem one of our colleague who was  working to a specific  task after finish he create PR and merge it on develop  then pipelines fails he close PR and fix pipeline and create again PR and merge add notice that the task was not in correct column (issue occurs because we use trigger &lt;strong&gt;when pull request merged&lt;/strong&gt; check current position of task them move to the next one )&lt;/p&gt;

&lt;p&gt;So we looks on way to handle that  using Pipeline you can learn more on CI/CD in &lt;a href="https://www.atlassian.com/continuous-delivery/tutorials"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Solution 2&lt;/strong&gt;
&lt;/h3&gt;




&lt;p&gt;&lt;strong&gt;What is the DevOps pipeline?&lt;/strong&gt;&lt;br&gt;
as defined by &lt;a href="https://www.atlassian.com/devops/devops-tools/devops-pipeline"&gt;atlassian&lt;/a&gt; DevOps pipeline is  a set of automated processes and &lt;a href="https://www.atlassian.com/devops/devops-tools"&gt;tools&lt;/a&gt; that allows both developers and operations professionals to work cohesively to build and deploy code to a production environment.&lt;/p&gt;

&lt;p&gt;What we did to solve issue mention above  is  let pipeline  decide where the tasks to be moved, the task will move if it meet our test cases defined on pipeline .we have been able to achieve that by using trigger know as &lt;strong&gt;incoming webhook&lt;/strong&gt; , which provides us webhook url and we use that URL on pipeline when URL is executed on pipeline Action will be triggered &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HyPEgj3F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1648308463/engineering-blog/images/cf3v6egywhpzhj14zc9o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HyPEgj3F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/clickpesa/image/upload/v1648308463/engineering-blog/images/cf3v6egywhpzhj14zc9o.png" alt="drawing" width="624" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pipelines</category>
      <category>cicd</category>
      <category>bitbucket</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
