<?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>Forem: Shai Mendel</title>
    <description>The latest articles on Forem by Shai Mendel (@shaimendel).</description>
    <link>https://forem.com/shaimendel</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%2F247164%2F42692d29-b9d4-45be-8e41-b1c48fa14533.jpeg</url>
      <title>Forem: Shai Mendel</title>
      <link>https://forem.com/shaimendel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/shaimendel"/>
    <language>en</language>
    <item>
      <title>The Last (Engineering) Dance</title>
      <dc:creator>Shai Mendel</dc:creator>
      <pubDate>Sun, 26 Jul 2020 13:27:00 +0000</pubDate>
      <link>https://forem.com/shaimendel/the-last-engineering-dance-ga</link>
      <guid>https://forem.com/shaimendel/the-last-engineering-dance-ga</guid>
      <description>&lt;p&gt;Watching The Last Dance was an incredible experience, much more than watching Michael Jordan or specifically to sports - I treated this series as a team building tutorial.&lt;br&gt;&lt;br&gt;
 So many team building and personal growth topics were raised there, I just found myself sitting after every episode and thinking on the episode's relevancy to my work as team lead and what I can learn from it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZjO18OJM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AhVJatdjpvFdwJZ9z.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZjO18OJM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AhVJatdjpvFdwJZ9z.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  tl;dr
&lt;/h3&gt;

&lt;p&gt;This blog post is about taking lessons from The Last Dance and applying them to the engineering world.&lt;br&gt;&lt;br&gt;
 I'll focus on the processes that took place in the Chicago Bulls that converted them from a great team to the best group of their time. A lot can be learned from the different approaches that the coaches took and the different behaviors of Michael Jordan that led to this improvement in the team's performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparing a basketball team with an engineering team
&lt;/h3&gt;

&lt;p&gt;I’ll begin with doing a basic mapping (as I see it) between the series characters to an engineering org:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The coach (Phil Jackson and Doug Collins before him) — the team lead&lt;/li&gt;
&lt;li&gt;Michael Jordan — a senior engineer&lt;/li&gt;
&lt;li&gt;The rest of the Chicago Bulls team — non-senior engineers in the team&lt;/li&gt;
&lt;li&gt;Jerry Reinsdorf and the rest of the Chicago Bulls mgmt — different stakeholders, “upper management”&lt;/li&gt;
&lt;li&gt;The fans and the crowd — customers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that we have this comparison in mind we can begin with the real fun :)&lt;/p&gt;

&lt;h3&gt;
  
  
  The team lead’s approach to winning
&lt;/h3&gt;

&lt;p&gt;The coach/team lead have a lot on their minds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Satisfying all stakeholders inside the organization — bringing money in by winning/selling&lt;/li&gt;
&lt;li&gt;Satisfying the fans/customers in the long term&lt;/li&gt;
&lt;li&gt;Satisfying the team itself — personal growth, ego, salaries&lt;/li&gt;
&lt;li&gt;Satisfying themselves — let’s not forget that the coach/team lead wants to develop and enjoy as well&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s compare the two approaches of the two coaches in the series:&lt;/p&gt;

&lt;h3&gt;
  
  
  Doug Collins — win by maximizing reliance on Michael Jordan
&lt;/h3&gt;

&lt;p&gt;Doug Collins was a coach that brought great results to the team by putting all the focus on Michael Jordan, all the game moves and tactics were built on Michael Jordan’s abilities. This is an example to a team lead that puts the weight of the team’s ability to deliver only on the senior engineers in the team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Difficult and complicated tasks are assigned to the senior engineers&lt;/li&gt;
&lt;li&gt;The non-senior engineers’ purpose is to let the senior engineers run fast and deliver&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made the Chicago Bulls a great team because they had one hell of a senior engineer :) but they could not win the championship. There are a lot of disadvantages to this approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The team’s ability to deliver is equal to the senior engineers’ ability to deliver&lt;/li&gt;
&lt;li&gt;The ability to improve is equal to the ability of specific senior engineers to improve&lt;/li&gt;
&lt;li&gt;This is not scalable and relies too much on too few people in the team&lt;/li&gt;
&lt;li&gt;The non-senior team members do not improve, this approach perpetuates the current “snapshot” of the team — the seniors will stay seniors, the non-seniors will not be promoted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So even though the results were good, they were not great. Remember all the concerns team leads have on their minds? this approach led to unsatisfied internal stakeholders (not winning the championship), unsatisfied fans/customers (not winning the championship =&amp;gt; the product quality was limited and did not improve), unsatisfied team (they were all a shadow of the senior engineer with no future to be seniors themselves), which makes the team lead itself unsatisfied — and who can blame them, how can you be satisfied when everyone around you is not?&lt;/p&gt;

&lt;h3&gt;
  
  
  Phil Jackson — win by maximizing the team performance
&lt;/h3&gt;

&lt;p&gt;Phil was hard to process for the team, he arrived with a completely different approach which turned upside down the way the team behaved so far.&lt;br&gt;&lt;br&gt;
 The discussions and plans moved from “what can we do to make Michael Jordan score?” to “what can we do to win in the long term?”. This is a huge difference that made the real change in the group.&lt;br&gt;&lt;br&gt;
 Phil put emphasis on team building, made everyone focused on the target of winning and to rely on each other. “There is no I in team”.&lt;br&gt;&lt;br&gt;
 Phil was a true inclusive leader, fostering collaboration (reducing the &lt;a href="https://en.wikipedia.org/wiki/Bus_factor"&gt;bus factor&lt;/a&gt;) and not necessarily hiring new team members for their resume but their ability to complement the team.&lt;/p&gt;

&lt;p&gt;After some adaption time there was a huge difference in the team performance that led to winning the championship. All the disadvantages from before disappeared:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The team’s ability to deliver is equal to the entire team’s ability to deliver&lt;/li&gt;
&lt;li&gt;The ability to improve is equal to the entire team’s ability to improve&lt;/li&gt;
&lt;li&gt;This is as scalable as it can get — it relies on everyone in the team&lt;/li&gt;
&lt;li&gt;The non-senior team members improve because the senior team members push them to excellence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach makes the stakeholders, fans/customers and the team satisfied.&lt;br&gt;&lt;br&gt;
 When you put weight on the long term goal and make sure everyone on the team improves you get the best outcomes. Focusing on one person or on short term goals (winning only the next game and not the next seasons) doesn’t get you to your maximum. No shortcuts here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hv1u2uEE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AZrtTx1cGn96JSnBQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hv1u2uEE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AZrtTx1cGn96JSnBQ.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The role of the senior team member
&lt;/h3&gt;

&lt;p&gt;Doug Collins believed that the senior engineer’s responsibility is to bring success by leading the team and carry it forward.&lt;br&gt;&lt;br&gt;
 Phil Jackson believed that the senior engineer’s responsibility is to bring success by pushing the team to excellence “from behind”, being a servant leader that defines success by the team’s success and not by personal success.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Phil: There is no I in team&lt;br&gt;&lt;br&gt;
Michael: But there is an I in win&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a conversation that blew my mind, it shows so clearly the difference between the two approaches. The problem is they are both right :) It took time for Michael Jordan to understand that there is indeed an I in win, but it had a different meaning than what he used to think.&lt;br&gt;&lt;br&gt;
 Michael Jordan was a critical senior engineer in the team’s success:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;He pushed the other team members to excellence during practices. He expected them more, pushed them to be better. He had high expectations of them&lt;/li&gt;
&lt;li&gt;He pushed the other team members to excellence during games&lt;/li&gt;
&lt;li&gt;He helped the team to stay focused when their spirit took a hit. Michael could stay focused and perform even when they were losing, and this approach led others to play accordingly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During their time under Phil’s leadership, the best time this group has ever had, Michael wasn’t the only scorer, the game tactics did not focus on Michael, and it took him time to process it. There is really no I in team.&lt;br&gt;&lt;br&gt;
 When Michael saw the results of this new approach he was convinced that there is definitely an I in win, but only as part of a team.&lt;/p&gt;

&lt;p&gt;The series demonstrated so well the most effective way we can define the senior engineer role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The senior engineer’s success criteria is the team’s performance and not just their personal performance&lt;/li&gt;
&lt;li&gt;Improve yourself by making others better — don’t be frustrated if the there is a gap of knowledge between yourself and the team, see it as an opportunity of personal growth and have high expectations from your team mates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Living in a roller coaster
&lt;/h3&gt;

&lt;p&gt;Basketball/engineering team’s life is like a roller coaster, you sometimes get super high after a win and sometimes get depressed by a devastating loss. It is hard to create a strong team spirit like that, and I found the way the Chicago Bulls coped with it very interesting and we should all apply it to our engineering teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Celebrate successes&lt;/li&gt;
&lt;li&gt;Learn from mistakes&lt;/li&gt;
&lt;li&gt;Anyway, either after a win or a loss — stay focused&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every topic here should not be underestimated, it is a crucial part of forming a healthy team culture and identity while keep focusing on the right direction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;In case you did not watch The Last Dance from an engineering standpoint — I encourage to do it :)&lt;br&gt;&lt;br&gt;
 Hoped you enjoyed my take on the series!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://shaimendel.dev/docs/2020-07-09-last-dance"&gt;&lt;em&gt;https://shaimendel.dev&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>teambuilding</category>
      <category>engineering</category>
      <category>softwaredevelopment</category>
      <category>michaeljordan</category>
    </item>
    <item>
      <title>Creating my open source dev blog</title>
      <dc:creator>Shai Mendel</dc:creator>
      <pubDate>Tue, 19 May 2020 08:43:01 +0000</pubDate>
      <link>https://forem.com/shaimendel/creating-my-open-source-dev-blog-2aei</link>
      <guid>https://forem.com/shaimendel/creating-my-open-source-dev-blog-2aei</guid>
      <description>&lt;h4&gt;
  
  
  Why I chose to create my dev blog in a fully open source manner and all the advantages with this approach
&lt;/h4&gt;

&lt;h3&gt;
  
  
  tl;dr
&lt;/h3&gt;

&lt;p&gt;In this blog post, I explain why I chose to create my &lt;a href="https://shaimendel.dev/"&gt;dev blog&lt;/a&gt; in a fully open source manner and all the advantages with this approach. I planned creating my own developer blog for a while but wasn’t satisfied with the common setups normally chosen. As an engineer, I preferred to treat my blog as yet another software project and therefore had the following requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manage everything (really, everything) in a single place — GitHub&lt;/li&gt;
&lt;li&gt;the blog management interface should be done solely using git:

&lt;ul&gt;
&lt;li&gt;git pull = get the latest version of the blog
&lt;/li&gt;
&lt;li&gt;merge to master = publish a new version of the website&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;be able to run the blog locally and see how it looks before publishing&lt;/li&gt;
&lt;li&gt;maximum Markdown as possible, ideally no CSS and html work. I admit, I’m not a CSS fan :)&lt;/li&gt;
&lt;li&gt;the entire stack should be open source&lt;/li&gt;
&lt;li&gt;both the website’s UI and the tech setup should be as simple as possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dpbFbwCU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/400/0%2AdWWmtyATVtR1S4ok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dpbFbwCU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/400/0%2AdWWmtyATVtR1S4ok.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Setup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Source Code Management
&lt;/h4&gt;

&lt;p&gt;Per the requirements I set, GitHub was a clear choice as my source code management. You can see the blog’s repo &lt;a href="https://github.com/shaimendel/dev-blog"&gt;here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Nothing special to add here :)&lt;/p&gt;

&lt;h4&gt;
  
  
  Static Pages Framework
&lt;/h4&gt;

&lt;p&gt;There are lots of open source site generators, &lt;a href="https://www.gatsbyjs.org/"&gt;Gatsby&lt;/a&gt; and &lt;a href="https://hexo.io/"&gt;Hexo&lt;/a&gt; to name a few.&lt;br&gt;&lt;br&gt;
I eventually chose &lt;a href="https://codedoc.cc/"&gt;CodeDoc&lt;/a&gt; as the site generator for a few reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I saw it in a Reddit and thought it would be nice to give a new framework a shot :)&lt;/li&gt;
&lt;li&gt;it is really simple to use&lt;/li&gt;
&lt;li&gt;the look and feel is very unique and simple, I looked for the simplest design as possible&lt;/li&gt;
&lt;li&gt;it comes with some useful builtin features out of the box:&lt;/li&gt;
&lt;li&gt;Markdown-based menu (table of contents) on the left&lt;/li&gt;
&lt;li&gt;a small page-map on the bottom-right&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Local Debugging
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://codedoc.cc/"&gt;CodeDoc&lt;/a&gt;’s CLI has a codedoc serve command that automatically monitors all the local files, converts the relevant Markdown files to html and updates the local server, so &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt; always has the updated version.&lt;br&gt;&lt;br&gt;
This allows me to see how the final website looks like during "development" (adding more content).&lt;/p&gt;

&lt;h4&gt;
  
  
  Publishing Website On Merge
&lt;/h4&gt;

&lt;p&gt;This is exactly the purpose of GitHub Pages! I just configured my repository to publish my master branch as GitHub Pages and that was basically it. so simple and efficient!&lt;/p&gt;

&lt;h4&gt;
  
  
  Versioning
&lt;/h4&gt;

&lt;p&gt;I used GitHub Actions to call Semantic Release upon merge to master. If you are interested — &lt;a href="https://github.com/shaimendel/dev-blog/blob/master/.github/workflows/ci.yaml"&gt;here is the action configuration&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
This automatically creates a GitHub release and a nice and clear release notes, according to my commit messages. Feel free to see all of the &lt;a href="https://github.com/shaimendel/dev-blog/releases"&gt;blog’s releases&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Source Approach Advantages
&lt;/h3&gt;

&lt;p&gt;This open source approach supplies some decent advantages, here are a few:&lt;/p&gt;

&lt;h4&gt;
  
  
  Ease Of Management
&lt;/h4&gt;

&lt;p&gt;This approach makes the website development cycle a regular software development cycle, making it super easy to maintain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local development in a code editor (for writing Markdown files and edit package.json mostly)&lt;/li&gt;
&lt;li&gt;local debugging using codedoc serve -&amp;gt; I put it as my npm start command&lt;/li&gt;
&lt;li&gt;build the website using codedoc build -&amp;gt; I put it as my npm run build command&lt;/li&gt;
&lt;li&gt;merge code to master in order to deploy&lt;/li&gt;
&lt;li&gt;The Semantic Release versioning gives the owner (and everyone who look at the repository :)) a clear view of what each website version contained&lt;/li&gt;
&lt;li&gt;if bad things happen and the website doesn’t look as expected — reverting a commit will do the job&lt;/li&gt;
&lt;li&gt;opening a PR is equivalent to adding new blog content — even this blog post was merged &lt;a href="https://github.com/shaimendel/dev-blog/pull/2"&gt;in a PR&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Security
&lt;/h4&gt;

&lt;p&gt;I added Snyk’s vulnerability test badge at the page header, so every viewer can see the security status of the blog:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HFeB11mN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/266/0%2A5SZxlCTLO87n6ovZ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HFeB11mN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/266/0%2A5SZxlCTLO87n6ovZ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;I hope I made it clear why I chose to build my blog the way I did, feel free to reach out for any questions!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://shaimendel.dev/docs/2020-05-02-my-open-source-blog"&gt;&lt;em&gt;https://shaimendel.dev&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>blogging</category>
      <category>blog</category>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>VS Code extension: building auto CI/CD with GitHub Actions</title>
      <dc:creator>Shai Mendel</dc:creator>
      <pubDate>Mon, 06 Apr 2020 18:49:57 +0000</pubDate>
      <link>https://forem.com/shaimendel/vs-code-extension-building-auto-ci-cd-with-github-actions-2dmf</link>
      <guid>https://forem.com/shaimendel/vs-code-extension-building-auto-ci-cd-with-github-actions-2dmf</guid>
      <description>&lt;h1&gt;
  
  
  tl;dr
&lt;/h1&gt;

&lt;p&gt;This article is about building a full CI/CD pipeline for Visual Studio Code extensions using only GitHub Actions.&lt;/p&gt;

&lt;p&gt;My basic requirement was to build an automatic CI/CD that will allow me to do the following upon pushing a new commit to &lt;code&gt;master&lt;/code&gt; branch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Test: run the tests on Mac, Windows and Linux&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Release: create a new GitHub release with automatic release notes based on &lt;a href="https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines"&gt;Angular Commit Message Conventions&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Publish: publish the new version to Visual Studio’s Marketplace&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One last thing: I wanted to do all of that based solely on GitHub Actions :) So I need nothing but the GitHub repository to configure and run everything.&lt;/p&gt;

&lt;h1&gt;
  
  
  Motivation
&lt;/h1&gt;

&lt;p&gt;It all began when I wanted to write a small VS Code extension that will allow me to right-click on a Yaml file and apply/delete it from my local Kubernetes cluster.&lt;br&gt;
Very soon I realized that VS Code’s &lt;a href="https://code.visualstudio.com/api/get-started/your-first-extension"&gt;documentation to how to write an extension&lt;/a&gt; is really good — I found myself writing and locally-debugging my new Typescript extension in no time, but then it occurred to me that the full CI/CD for it that Microsoft suggests in their docs is a bit lacking:&lt;/p&gt;
&lt;h4&gt;
  
  
  Tests
&lt;/h4&gt;

&lt;p&gt;This part is actually relatively good in the &lt;a href="https://code.visualstudio.com/api/working-with-extensions/continuous-integration"&gt;formal docs&lt;/a&gt;, they specifically mention a GitHub&lt;a href="https://code.visualstudio.com/api/working-with-extensions/continuous-integration#github-actions"&gt; Action&lt;/a&gt; that runs the tests on Mac, Windows and Linux, and I definitely used it.&lt;/p&gt;
&lt;h4&gt;
  
  
  Release &amp;amp; Publish
&lt;/h4&gt;

&lt;p&gt;The entire release and publish process is built on the &lt;a href="https://code.visualstudio.com/api/working-with-extensions/publishing-extension#vsce"&gt;&lt;em&gt;vsce&lt;/em&gt;&lt;/a&gt; tool.&lt;br&gt;
The first things you need to do to set the ground is to follow the &lt;a href="https://code.visualstudio.com/api/working-with-extensions/publishing-extension"&gt;publishing docs&lt;/a&gt; and especially do the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://code.visualstudio.com/api/working-with-extensions/publishing-extension#get-a-personal-access-token"&gt;get a personal access token&lt;/a&gt; from Azure DevOps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create a &lt;a href="https://code.visualstudio.com/api/working-with-extensions/publishing-extension#get-a-personal-access-token"&gt;publisher&lt;/a&gt; (the publisher name has to match the &lt;em&gt;publisher&lt;/em&gt; section in package.json)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have all that you can package, publish and unpublish your extension using vsce.&lt;br&gt;
Those are manual steps needed to be taken, less than ideal!&lt;/p&gt;

&lt;p&gt;In addition there is also a gap in how the extension version is set during publishing. there are a few ways to set that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;change the &lt;em&gt;version&lt;/em&gt; field in package.json and call &lt;code&gt;vsce publish&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;use &lt;code&gt;vsce publish minor&lt;/code&gt; for example (or major/patch accordingly) to automatically increment the version&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;use &lt;code&gt;vsce publish 2.0.1&lt;/code&gt; to mention a specific version&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is really not handy, I want the version to be set according to my &lt;a href="https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines"&gt;commit conventions&lt;/a&gt; automatically, with automatic release notes generation. Spoiler: I will use &lt;a href="https://github.com/semantic-release/semantic-release"&gt;semantic-release&lt;/a&gt; for that :)&lt;/p&gt;
&lt;h1&gt;
  
  
  Let’s start!
&lt;/h1&gt;

&lt;p&gt;I’ll follow the steps I went through and we’ll build our CI/CD pipeline step by step.&lt;/p&gt;
&lt;h4&gt;
  
  
  Create an extension
&lt;/h4&gt;

&lt;p&gt;I followed the &lt;a href="https://code.visualstudio.com/api/get-started/your-first-extension"&gt;formal docs&lt;/a&gt; and relatively easily created&lt;a href="https://github.com/shaimendel/vscode-plugin-cicd-github-actions"&gt; a new repository&lt;/a&gt; with my fresh templated Typescript extension.&lt;br&gt;
I then modified the functionality so right clicking a YAML file allows you to apply or delete it from my local Kubernetes cluster. super cool and useful to me!&lt;/p&gt;
&lt;h4&gt;
  
  
  Create an empty GitHub Actions workflow
&lt;/h4&gt;

&lt;p&gt;Create an empty yaml file at &lt;code&gt;.github/workflows/&amp;lt;workflow name&amp;gt;.yaml&lt;/code&gt;. I called it &lt;code&gt;ci.yaml&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Mention that the workflow should happen on push to master
&lt;/h4&gt;

&lt;p&gt;Change you yaml workflow to be:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The upper paragraph tells GitHub to run that action when a push to master happens.&lt;br&gt;
The lower part is the jobs that should be run, we will fill them soon.&lt;/p&gt;
&lt;h4&gt;
  
  
  Auto tests
&lt;/h4&gt;

&lt;p&gt;As mentioned above I would like the tests to run on Mac, Windows and Linux. and the docs actually mention a specific action I will use now by adding a dedicated job:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;As can be seen this adds a job called &lt;code&gt;Test&lt;/code&gt;, that will run on Mac, Windows and Ubuntu.&lt;br&gt;
this job contains 4 steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Checkout: use the builtin action to checkout the repo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setup Node.js: use the builtin action to set Node 12&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install dependencies: run &lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run headless test: runs the tests using the &lt;a href="https://github.com/GabrielBB/xvfb-action"&gt;GabrielBB/xvfb-action@v1.0&lt;/a&gt; action, as recommended by &lt;a href="https://code.visualstudio.com/api/working-with-extensions/continuous-integration#github-actions"&gt;the formal docs&lt;/a&gt; (plus some improvements)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After this step I saw that on the Actions tab:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nncJp6zx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1180/1%2AY_BfVywUfmsM9rtTHClUuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nncJp6zx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1180/1%2AY_BfVywUfmsM9rtTHClUuw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;where each test had the following steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G8QIOxwo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/864/1%2AdyKw1S9u3slbLY5qmIZK-A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G8QIOxwo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/864/1%2AdyKw1S9u3slbLY5qmIZK-A.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Publish and release
&lt;/h4&gt;

&lt;p&gt;Let’s add a new step, which looks like the following:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;We’ll go slowly through this, don’t worry!&lt;br&gt;
So we begin with the previous steps of checking out the code, setting up Node 12 and running &lt;code&gt;npm install&lt;/code&gt;. The next two steps are the most important ones, and deserve sections of their own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The purpose here is to create and publish a new GitHub release with proper release notes.&lt;br&gt;
In order to do so I basically just call &lt;code&gt;semantic-release&lt;/code&gt; :) This action runs through the commit messages, builds release notes and creates a new GitHub release with a semver version corresponding to the commits I added.&lt;br&gt;
It also sets that release version in the package.json, a useful fact for next phase.&lt;/p&gt;

&lt;p&gt;In order to properly configure &lt;code&gt;semantic-release&lt;/code&gt; you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pass the&lt;code&gt;GITHUB_TOKEN&lt;/code&gt; env var (as GitHub secret): your personal GitHub token, with minimal &lt;code&gt;repo&lt;/code&gt; permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k_AhwXC1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1078/1%2AZ18MvnZBIp7esbFMtdorTg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k_AhwXC1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1078/1%2AZ18MvnZBIp7esbFMtdorTg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;pass the&lt;code&gt;NPM_TOKEN&lt;/code&gt;env var (as GitHub secret): your npm token to release your npm package. In my case I didn’t want to release an npm package. In order to do so you need to configure &lt;code&gt;"private": true&lt;/code&gt; in your package.json. after you do so you don’t have to pass this env var (found this fact &lt;a href="https://github.com/semantic-release/npm#options"&gt;here&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;install &lt;code&gt;@semantic-release/github&lt;/code&gt; as a dev dependency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configure the following in your package.json:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Once this step was done I could start seeing proper GitHub releases&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FOu35Ib_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2536/1%2AMTUHzQ1uDTmeYEpx2W04fg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FOu35Ib_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2536/1%2AMTUHzQ1uDTmeYEpx2W04fg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publish&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The purpose here is to upload a new version of the extension to the VS Code marketplace with the correct version.&lt;br&gt;
One of the benefits of the previous Release section is that the package.json now contains the right package version. all needed to do no is to call &lt;code&gt;vsce publish -p &amp;lt;my token&amp;gt;&lt;/code&gt;.&lt;br&gt;
I found an existing GitHub action to release a plugin, &lt;a href="https://github.com/marketplace/actions/vscode-plugin-release-action"&gt;JCofman/vscodeaction&lt;/a&gt;. all you need to do is to pass it your &lt;code&gt;PUBLISHER_TOKEN&lt;/code&gt; as an env var (again, using GitHub secrets).&lt;/p&gt;

&lt;p&gt;After this step you’ll see a new &lt;code&gt;Release and publish&lt;/code&gt; job in the Actions tab that contains&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0oyh4JOT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1428/1%2Apqz2xLFLLhtoa2BPV-RL6Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0oyh4JOT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1428/1%2Apqz2xLFLLhtoa2BPV-RL6Q.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Result
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lLXsMoZ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2582/1%2AK7Bg21RLqNPAj-Gm_ppKnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lLXsMoZ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2582/1%2AK7Bg21RLqNPAj-Gm_ppKnw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now find my new extension in &lt;a href="https://marketplace.visualstudio.com/items?itemName=ShaiMendel.kubernetesapply"&gt;the marketplace&lt;/a&gt; and in VS Code extensions search!&lt;/p&gt;

&lt;p&gt;You can find my repository at &lt;a href="https://github.com/shaimendel/vscode-plugin-cicd-github-actions"&gt;https://github.com/shaimendel/vscode-plugin-cicd-github-actions&lt;/a&gt;, with the workflow configured at &lt;a href="https://github.com/shaimendel/vscode-plugin-cicd-github-actions/blob/master/.github/workflows/ci.yaml"&gt;ci.yaml&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;We just build a fully automatic CI/CD for a new VS Code extension.&lt;br&gt;
every time a new PR is merged to &lt;code&gt;master&lt;/code&gt; we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;test the code in multiple operating systems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;release a new GitHub release with super nice release notes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;publish a new extension to the marketplace&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and we did all of it purely using GitHub Actions!&lt;/p&gt;

&lt;p&gt;Great success :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lw4OriUs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1736/1%2AAi5wAGW4Vw5YKIuBSTNrrQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lw4OriUs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1736/1%2AAi5wAGW4Vw5YKIuBSTNrrQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shai Mendel, Engineering team lead at &lt;a href="https://snyk.io/"&gt;Snyk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>devops</category>
      <category>github</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Modern cyber security tooling should empower developers</title>
      <dc:creator>Shai Mendel</dc:creator>
      <pubDate>Thu, 10 Oct 2019 19:46:27 +0000</pubDate>
      <link>https://forem.com/shaimendel/modern-cyber-security-tooling-should-empower-developers-208p</link>
      <guid>https://forem.com/shaimendel/modern-cyber-security-tooling-should-empower-developers-208p</guid>
      <description>&lt;h1&gt;
  
  
  tl;dr
&lt;/h1&gt;

&lt;p&gt;I truly believe in the necessity of Cyber products, but modern companies will truly improve their security if and only if their developers are engaged to the effort.&lt;br&gt;
This article is about talking and surfacing the gap of the traditional Cyber world, which is stuck all the way to the right, waiting for dev-first companies to shift it left.&lt;/p&gt;

&lt;h1&gt;
  
  
  A bit about myself
&lt;/h1&gt;

&lt;p&gt;In the last year I have been working as an engineering team lead in &lt;a href="https://snyk.io"&gt;Snyk&lt;/a&gt;, a dev-first open source security company aiming to help developers use open source in an easy and secure manner. In the years before I was deep in the Cyber world, which is classically divided into major categories like endpoint protection, VA/VM, BAS (breach and attack simulation) and more. I have met closely some of the categories above during the years.&lt;br&gt;
I have always worked as a developer/engineering team lead and wanted to share my perspective on why it is crucial to the Cyber world to shift left and give much more attention to developers.&lt;/p&gt;

&lt;h1&gt;
  
  
  The traditional cyber world
&lt;/h1&gt;

&lt;p&gt;Let’s talk a bit about the traditional Cyber world! Traditional Cyber relies on the technologies that ruled the world and on functions that managed security in the past. Therefore most of the traditional Cyber products target the CISO/CIO/ops/security functions in companies, and in order to do so those products normally feature beautiful dashboards that can be showed in big SOC/NOC screens, extensive reporting options, SIEM integrations etc.&lt;/p&gt;

&lt;p&gt;Additionally the traditional Cyber products are many times on-prem only, focusing on non-modern methodologies like using virtual machines in your production environments, relatively long deployment cycles and more. Thus the security/ops departments are the ones responsible to patch those virtual machines, setting the network configurations, the security configuration and more. &lt;/p&gt;

&lt;p&gt;This gets a little twist if we look at a bit more modern Cyber companies, where the exact same concepts are applied to the cloud environments, targeting Kubernetes clusters or other cloud environments as the production environments.&lt;/p&gt;

&lt;p&gt;Traditional Cyber divides the world into the good vs the bad, which are called by different names in different contexts: attackers vs defenders, red team vs blue team and more.&lt;/p&gt;

&lt;h1&gt;
  
  
  Enter modern Cyber world
&lt;/h1&gt;

&lt;p&gt;The ops world is changing quickly, it moved from deploying on dedicated virtual machines in VPS hosting providers to virtual machines in cloud providers to container-based environments in the cloud.&lt;br&gt;
As a result the operations ownership which was previously owned solely by the ops team gradually moves towards the ones who build the software and the containers wrapping them - the developers!&lt;br&gt;
The security ownership also gradually moves  left towards developers due to the exact same reasons.&lt;/p&gt;

&lt;p&gt;So as I said, the traditional Cyber world is divided to attackers vs defenders, which leads to products that target the ops/security departments. This approach is missing the most important ingredient to actually improve your company’s security - &lt;strong&gt;the ones who are responsible to fix those issues, the developers.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Dev-first Cyber products
&lt;/h1&gt;

&lt;p&gt;This gap of not targeting developers as consumers lead sometimes to some resentness from the developers towards the ones who order them to fix security issues in a non-actionable manner.&lt;br&gt;
We, the developers, are a very different kind of people :) we don’t care so much about beautiful dashboards; we prefer a clear, simple and actionable tools. We want maximum value with minimum effort, and if some effort is needed it is better to be dev-friendly.&lt;/p&gt;

&lt;p&gt;I truly believe in the necessity of Cyber products, but modern companies can truly improve their security if and only if their developers are engaged to the effort.&lt;/p&gt;

&lt;p&gt;If talking in shift-left terms: from my experience I believe that the future Cyber world will be dominated by dev-first companies coming to the right rather than traditional Cyber companies moving to the left.&lt;br&gt;
Therefore in order to keep the pace I think Cyber companies will have to adapt their products to the developer audience, which means to suggest remediation in a dev-friendly way, for example: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert traditional patch management systems to features that help developers reduce vulnerabilities in their container images&lt;/li&gt;
&lt;li&gt;Opening pull requests to fix found vulnerabilities&lt;/li&gt;
&lt;li&gt;Opening pull request to change network configuration in Kubernetes yaml files/helm charts to reduce security risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The security world, with the Cyber security world as a subset, is owned by developers. so why not targeting it as consumers?&lt;br&gt;
I hope this article will raise awareness to this gap, help developers realize it is our interest to own our own security, and for non-developers help us be part of it.&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>devfirst</category>
    </item>
  </channel>
</rss>
