<?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: Benjamin Justice</title>
    <description>The latest articles on Forem by Benjamin Justice (@justice).</description>
    <link>https://forem.com/justice</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%2F398105%2F47c94be6-e612-4a8d-a1dc-7c85853472cc.jpg</url>
      <title>Forem: Benjamin Justice</title>
      <link>https://forem.com/justice</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/justice"/>
    <language>en</language>
    <item>
      <title>One-Click Deployments for Small Projects</title>
      <dc:creator>Benjamin Justice</dc:creator>
      <pubDate>Sun, 08 Nov 2020 16:00:00 +0000</pubDate>
      <link>https://forem.com/justice/one-click-deployments-for-small-projects-1hgi</link>
      <guid>https://forem.com/justice/one-click-deployments-for-small-projects-1hgi</guid>
      <description>&lt;p&gt;When we think of DevOps and deployments, we usually think about big fancy automated deployment pipelines.&lt;br&gt;&lt;br&gt;
Although I love deployment pipelines, others have written great articles and tutorials.&lt;/p&gt;

&lt;p&gt;If you are looking to expand our Travis CI build server from &lt;a href="https://www.justice.sh/blog/devops/devops-ep-4-build-servers/"&gt;Getting Started with Build Servers&lt;/a&gt;, its super easy to implement with the Travis CI documentation at &lt;a href="https://docs.travis-ci.com/user/deployment/"&gt;https://docs.travis-ci.com/user/deployment/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Instead I want to show you how I deploy small projects with a one-click deployment script.&lt;br&gt;&lt;br&gt;
Before continuing, make sure you know the PowerShell basics from my &lt;a href="https://www.justice.sh/blog/devops/command-line-basics/"&gt;Cross-Platform Command Line&lt;/a&gt; article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing a Deployment Script
&lt;/h2&gt;

&lt;p&gt;For this example, we will deploy a WordPress theme. It’s a common use-case and does not require you to know &lt;strong&gt;anything&lt;/strong&gt; about WordPress.&lt;/p&gt;

&lt;p&gt;As for all small projects, we will follow four simple steps to help us determine how we will deploy via script.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: What do we need?
&lt;/h3&gt;

&lt;p&gt;A WordPress theme is a simple directory with php, css and javascript files.&lt;br&gt;&lt;br&gt;
If you want to see an example, have a look at the &lt;a href="https://core.trac.wordpress.org/browser/trunk/src/wp-content/themes/twentyseventeen"&gt;TwentySeventeen sample theme&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As a wordpress theme only consists of this directory, we do not have any builds to upload. We simply upload our entire theme directory.&lt;/p&gt;

&lt;p&gt;For this example, we will call this folder &lt;code&gt;my-custom-theme&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Where do we need it?
&lt;/h3&gt;

&lt;p&gt;Now that we have a wordpress theme, where must we deploy it to?&lt;br&gt;&lt;br&gt;
For this example, we will assume that we have two servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dev.justice.sh&lt;/code&gt; – a private server for testing new code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;justice.sh&lt;/code&gt; – a public server hosting your website&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WordPress themes are installed by uploading them into the &lt;code&gt;wp-content/themes&lt;/code&gt; directory. If you wish to learn more on the wordpress folder structure, &lt;a href="https://www.wpdownloadmanager.com/basic-guide-to-wordpress-file-and-directory-structure/"&gt;this article&lt;/a&gt; gives a great overview.&lt;/p&gt;

&lt;p&gt;So let’s say our target path is &lt;code&gt;/var/www/wordpress/wp-content/themes&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: How do we transfer it?
&lt;/h3&gt;

&lt;p&gt;While there are many ways to upload our theme, SSH and FTP are the most popular ones.&lt;/p&gt;

&lt;p&gt;Because setting up FTP via script is &lt;a href="https://www.thomasmaurer.ch/2010/11/powershell-ftp-upload-and-download/"&gt;a little more work&lt;/a&gt;, I prefer using SSH.&lt;br&gt;&lt;br&gt;
If you are using Windows 10, you must &lt;a href="https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse"&gt;enable the OpenSSH client first&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First of all, make sure that you can access your server via ssh.&lt;br&gt;&lt;br&gt;
I recommend using ssh keys instead of username/password. See &lt;a href="https://www.chrisjhart.com/Windows-10-ssh-copy-id/"&gt;this article using windows + powershell&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
If you are on mac or Linux, you can simply use &lt;code&gt;ssh-keygen&lt;/code&gt; and &lt;code&gt;ssh-copy-id&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Script it!
&lt;/h3&gt;

&lt;p&gt;With the above information, we can now write our two scripts.&lt;br&gt;&lt;br&gt;
Be sure to replace USERNAME with your own username:&lt;/p&gt;

&lt;h4&gt;
  
  
  deploy-dev.sh
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/sh

# Copy the directory 'my-custom-theme' to our target server via ssh.
scp -r my-custom-theme USERNAME@dev.justice.sh:/var/www/wordpress/wp-content/themes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  deploy-prod.sh
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/sh

# Copy the directory 'my-custom-theme' to our target server via ssh.
scp -r my-custom-theme USERNAME@justice.sh:/var/www/wordpress/wp-content/themes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With the above two scripts, you can simply run &lt;code&gt;./deploy-dev.ps1&lt;/code&gt; or &lt;code&gt;./deploy-prod.ps1&lt;/code&gt; to deploy to DEV or PROD servers.&lt;br&gt;&lt;br&gt;
I like to commit my deployment scripts in git, so I always have them together with my projects.&lt;/p&gt;

&lt;p&gt;And so this part of the &lt;a href="https://www.justice.sh/blog/devops/getting-started-with-devops/"&gt;Getting Started with DevOps&lt;/a&gt; series comes to a close.&lt;br&gt;&lt;br&gt;
If you have any questions or feedback, you can reach me on &lt;a href="https://twitter.com/JusticeDev"&gt;Twitter&lt;/a&gt; or on the &lt;a href="https://discordapp.com/invite/4FmEwGp"&gt;BrutalHack Discord Server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.justice.sh/blog/devops/one-click-deployments-for-small-projects/"&gt;One-Click Deployments for Small Projects&lt;/a&gt; appeared first on &lt;a href="https://www.justice.sh"&gt;justice.sh&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>blog</category>
      <category>deploy</category>
      <category>devops</category>
      <category>deployment</category>
    </item>
    <item>
      <title>One Easy Trick to Manage Your Software Release</title>
      <dc:creator>Benjamin Justice</dc:creator>
      <pubDate>Mon, 12 Oct 2020 07:42:00 +0000</pubDate>
      <link>https://forem.com/justice/one-easy-trick-to-manage-your-software-release-301f</link>
      <guid>https://forem.com/justice/one-easy-trick-to-manage-your-software-release-301f</guid>
      <description>&lt;p&gt;A software release can be daunting. Software engineers learn how to plan, code, build and test their software. However many aren’t taught about releasing and maintaining software.&lt;/p&gt;

&lt;p&gt;In this article I want to share one of the simplest and most effective tools for planning your software release: The software release checklist.&lt;/p&gt;

&lt;p&gt;I will not assume any prior knowledge for the last phases in our &lt;a href="https://www.justice.sh/blog/devops/getting-started/"&gt;DevOps Lifecycle&lt;/a&gt;. If you have no clue about releasing software, this is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Software Release?
&lt;/h2&gt;

&lt;p&gt;The DevOps Lifecycle defines 4 phases after you have finished developing your software version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Release&lt;/li&gt;
&lt;li&gt;Deploy&lt;/li&gt;
&lt;li&gt;Operate&lt;/li&gt;
&lt;li&gt;Monitor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see, actually uploading and distributing the software is the next step, Deploy.&lt;/p&gt;

&lt;p&gt;Before we get to that phase, we should plan, schedule and communicate our release. This may sound like a lot of management and, for big corporations, this is also the case. However if you are in a small business or startup, this can be solved with one of the easiest tools available.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Software Release Checklist
&lt;/h2&gt;

&lt;p&gt;A good software release is all about managing the process.&lt;br&gt;&lt;br&gt;
And the simplest way to manage a process is with a checklist.&lt;/p&gt;

&lt;p&gt;I will share my release checklist with you, but keep in mind that you should alter it to suit your company and your software.&lt;/p&gt;

&lt;p&gt;When I talk about the “app” or “software”, I mean the version, which we are releasing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Assign all Tasks.
&lt;/h3&gt;

&lt;p&gt;Assign every task in the checklist to exactly 1 person.&lt;/p&gt;

&lt;p&gt;The responsible person for a task may change every release, but it is critical, that every task is assigned to someone. If that person only coordinates others doing the task, that is absolutely fine.&lt;/p&gt;

&lt;p&gt;The important part here is to have exactly 1 contact person, in case things go wrong or you need a status update.&lt;/p&gt;

&lt;h3&gt;
  
  
  Software Release Checklist for a mobile App
&lt;/h3&gt;

&lt;p&gt;The following checklist is for a mobile App without a backend. It involves releasing to Google Play Store and Apple App Store.&lt;br&gt;&lt;br&gt;
As some of you may be new to App releases, I have gone into a little more detail here.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pre-Release
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define new software version&lt;/strong&gt;. (I recommend &lt;a href="https://semver.org/"&gt;Semantic Versioning&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create release checklist for this software version in our Wiki/Google Drive/etc.&lt;/strong&gt;
It should be visible to everyone involved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define target release date.&lt;/strong&gt;
This does not have to be communicated outside of your company.
This is mainly for our internal planning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define an “end of feature development” for the release.&lt;/strong&gt;
This is the deadline for new features. I recommend at least 1 week before planning your release (2-3 weeks, if releasing for iOS).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Maintenance Plan exists.&lt;/strong&gt;
Think about where people can report bugs and how you prioritise and fix them. This might include reading app store reviews and a support forum you may have.
This can be a simple wiki page with a checklist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inform marketing.&lt;/strong&gt;
This might be a team, a person, or yourself.
Update your Presskit, prepare a tweet, prepare new screenshots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We have a release branch or tag in git for this software version&lt;/strong&gt;.
This helps us in case we must test old versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test android app.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test iOS app.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload android app to Google Play Store&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upload iOS app to Apple App Store.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update Screenshots &amp;amp; Information in Google Play Store.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update Screenshots &amp;amp; Information in Apple App Store.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Apple Review was successful.&lt;/strong&gt;
This step may take several days, even 1-2 weeks if you must fix something. Take this into account when communicating deadlines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release android app on Google Play Store.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release iOS app on Apple App Store.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Post-Release
&lt;/h4&gt;

&lt;p&gt;For software releases without a backend, the post-release checklist is quite short. It basically consists of testing your released app and monitoring customer feedback&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Run Regression Tests on released Android App.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run Regression Tests on released iOS App.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define process for checking App Store reviews / support forums.&lt;/strong&gt;
Who checks these? How often?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;p&gt;All in all, software releases are a complex topic, which requires communication with many people. can be simplified&lt;/p&gt;

&lt;p&gt;Looking for more inspiration? Yasmin Nozari has &lt;a href="https://medium.com/swlh/release-planning-with-a-checklist-48e4304c688"&gt;a post with more information on release checklists&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can reach out to me on &lt;a href="https://twitter.com/JusticeDev"&gt;Twitter&lt;/a&gt; or the &lt;a href="https://discordapp.com/invite/4FmEwGp"&gt;BrutalHack Discord Server&lt;/a&gt; for questions or feedback.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.justice.sh/blog/devops/one-easy-trick-to-manage-your-software-release/"&gt;One Easy Trick to Manage Your Software Release&lt;/a&gt; appeared first on &lt;a href="https://www.justice.sh"&gt;justice.sh&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>release</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Testing your Software with Style and Structure</title>
      <dc:creator>Benjamin Justice</dc:creator>
      <pubDate>Sun, 13 Sep 2020 18:57:57 +0000</pubDate>
      <link>https://forem.com/justice/testing-your-software-with-style-and-structure-1cpl</link>
      <guid>https://forem.com/justice/testing-your-software-with-style-and-structure-1cpl</guid>
      <description>&lt;p&gt;After setting up a simple build server in last months article, &lt;a href="https://justice.sh/blog/devops/devops-ep-4-build-servers/"&gt;DevOps Ep. 4: Build Servers&lt;/a&gt;, our next step in &lt;a href="https://justice.sh/blog/devops/getting-started/"&gt;the DevOps Lifecycle&lt;/a&gt; is Testing.&lt;/p&gt;

&lt;p&gt;Let’s have a look at structured unit, integration and system testing, inspired by the V-Model used in automotive development.&lt;/p&gt;

&lt;p&gt;Note that we are only looking into software verification, i.e. “the software works”. There is also software validation, which verifies, that the software works for a given user or scenario.&lt;/p&gt;

&lt;h2&gt;
  
  
  What types of tests are there?
&lt;/h2&gt;

&lt;p&gt;When thinking about which types of tests there are, I like referring to the &lt;a href="https://www.geeksforgeeks.org/software-engineering-sdlc-v-model/"&gt;V-Model&lt;/a&gt;. When simplified, we can identify the three most important development phases and their verification via tests:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wlue9nGr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justice.sh/wp-content/uploads/2020/09/v-model-1024x576.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wlue9nGr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justice.sh/wp-content/uploads/2020/09/v-model-1024x576.png" alt="Simplified Image of the V-Model. Requirements, Architecture and Implementation are verified by System Tests, Integration Tests and Unit Tests, respectively."&gt;&lt;/a&gt;Every Design step is verified within the V-Model (simplified depiction)&lt;/p&gt;

&lt;p&gt;In summary software is developed in three stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First we gather &lt;strong&gt;Requirements&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Next we plan an &lt;strong&gt;Architecture&lt;/strong&gt; (hopefully).&lt;/li&gt;
&lt;li&gt;Finally we &lt;strong&gt;implement&lt;/strong&gt; the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the V-Model defines a verification step for each stage of development, which we will describe in detail in the following chapters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unit Testing
&lt;/h3&gt;

&lt;p&gt;Each Unit Test tests one small unit of code.&lt;br&gt;&lt;br&gt;
In object oriented code, these are your classes’ methods.&lt;br&gt;&lt;br&gt;
Most literature also refers to each unit test having a &lt;strong&gt;method under test&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Probably the most important part about good unit tests is naming and structuring them, so colleagues can easily understand, what a failing unit test means.&lt;/p&gt;

&lt;p&gt;For this purpose I encourage fellow developers to use a naming schema inspired by &lt;a href="https://en.wikipedia.org/wiki/Behavior-driven_development"&gt;Behaviour-Driven-Development&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ACTION_WhenCONDITION
e.g. &lt;code&gt;authenticateUser_WhenCredentialsAreCorrect&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Condition_ThenACTION
e.g. &lt;code&gt;CredentialsAreCorrect_ThenAuthenticateUser&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While the above naming schema looks good, it is missing a vital piece of information: Which unit is being tested? The solution can be found in one of my favourite articles to date: &lt;a href="https://haacked.com/archive/2012/01/02/structuring-unit-tests.aspx"&gt;Structuring Unit Tests on You’ve Been Haacked&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In summary the article recommends creating a test class for every class in your code as usual, but also introduces an additional internal class for every method under test within the class. In C#, partial classes can be helpful if you have a class with many methods.&lt;/p&gt;

&lt;p&gt;&amp;lt;!-- HTML generated using hilite.me --&amp;gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[TestFixture]public class AuthenticationServiceTest { [TestFixture]public class LoginMethod { [Test]public void CredentialsAreCorrect\_ThenAuthenticateUser() { // Test Code } [Test]public void UsernameIsMissing\_ThenReject() { // Test Code } [Test]public void PasswordIsMissing\_ThenReject() { // Test Code } } public class RegisterMethod { [Test]public void CredentialsAreCorrect\_ThenAuthenticateUser() { // Test Code } [Test]public void UsernameIsMissing\_ThenReject() { // Test Code } [Test]public void PasswordIsMissing\_ThenReject() { // Test Code } } }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When developing Unit Tests, you will sometimes encounter situations, where you depend on other software units in your code.&lt;br&gt;&lt;br&gt;
This is a rather advanced issue and the solution is &lt;strong&gt;Mocking&lt;/strong&gt;. It enables us to create “fake” dependencies for our class under test, but it is worth its own future article.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration Testing
&lt;/h3&gt;

&lt;p&gt;Unlike Unit Tests, Integration Tests test multiple units of code working together. They are often realised using frameworks, such as &lt;a href="https://www.selenium.dev/"&gt;Selenium&lt;/a&gt;, to automate usage of small parts of your software.&lt;/p&gt;

&lt;p&gt;The important part about Integration Tests is size.&lt;br&gt;&lt;br&gt;
Writing integration tests is often more work than writing unit tests, however they are not very precise. If an integration test fails, you do not immediately know, which software unit is at fault.&lt;/p&gt;

&lt;p&gt;As setting up Integration Tests is very dependent on your chosen technologies, I cannot provide a generic example here.&lt;/p&gt;

&lt;h3&gt;
  
  
  System Testing
&lt;/h3&gt;

&lt;p&gt;Finally System Tests are the final frontier of quality assurance. They test the entire system in a shippable state.&lt;/p&gt;

&lt;p&gt;While automation of system tests is theoretically possible, this is a lot of work. So much, that I have never seen automated System Tests in the wild.&lt;br&gt;&lt;br&gt;
As such it is completely normal and okay to have &lt;strong&gt;manual&lt;/strong&gt; system tests.&lt;/p&gt;

&lt;p&gt;The only important part about manual system tests, is to have a structure. For each system test, we want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;define system tests with IDs for easier communication.&lt;/li&gt;
&lt;li&gt;document a step-by-step guide with numbered steps, so that anyone can execute the system test.&lt;/li&gt;
&lt;li&gt;document each execution of the system tests with

&lt;ul&gt;
&lt;li&gt;software version or build number&lt;/li&gt;
&lt;li&gt;time &amp;amp; date&lt;/li&gt;
&lt;li&gt;person performing the test&lt;/li&gt;
&lt;li&gt;test result (Pass/Fail)&lt;/li&gt;
&lt;li&gt;Comments, if any necessary&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although dedicated solutions for system tests exist, such as &lt;a href="https://azure.microsoft.com/en-us/services/devops/test-plans/"&gt;Azure Test Plans&lt;/a&gt;, most of them are expensive. However you can get away by using &lt;strong&gt;spreadsheet&lt;/strong&gt; software. We like using Google Drive Spreadsheets, as it enables us all to edit the documents and protocol our test runs and comments.&lt;/p&gt;

&lt;p&gt;While strictly speaking, System Tests only cover the system developed by you, I highly recommend performing these tests on a “production-similar” setup. E.g. Execute your Android Apps System Tests on a real device.&lt;/p&gt;

&lt;p&gt;This actually blurs out the lines between System Tests and so-called &lt;a href="https://www.tutorialspoint.com/software_testing_dictionary/end_to_end_testing.htm#:~:text=End%2Dto%2Dend%20testing%20is,various%20system%20components%20and%20systems."&gt;“End to End” Tests&lt;/a&gt;, but that is a good thing. If you are developing a cross-platform application, repeat your system tests for &lt;strong&gt;each and every target platform&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We only covered the tip of the ice berg on this subject, but we can follow-up with examples and CI integration in future articles.&lt;/p&gt;

&lt;p&gt;For now, it should give you and your team a good overview and allow you to start with simple automated unit testing as well as manual system testing documented in spreadsheets.&lt;/p&gt;

&lt;p&gt;You can reach out to me on &lt;a href="https://twitter.com/JusticeDev"&gt;Twitter&lt;/a&gt; or the &lt;a href="https://discordapp.com/invite/4FmEwGp"&gt;BrutalHack Discord Server&lt;/a&gt; for questions.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.justice.sh/blog/devops/testing-your-software-with-style-and-structure/"&gt;Testing your Software with Style and Structure&lt;/a&gt; appeared first on &lt;a href="https://www.justice.sh"&gt;justice.sh&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>devops</category>
      <category>testing</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Getting Started with Build Servers</title>
      <dc:creator>Benjamin Justice</dc:creator>
      <pubDate>Sun, 09 Aug 2020 13:06:31 +0000</pubDate>
      <link>https://forem.com/justice/getting-started-with-build-servers-758</link>
      <guid>https://forem.com/justice/getting-started-with-build-servers-758</guid>
      <description>&lt;p&gt;For part 4 of our &lt;a href="https://justice.sh/blog/devops/getting-started/"&gt;Getting Started with DevOps Series&lt;/a&gt;, I want to introduce you to &lt;em&gt;Continuous Integration (CI)&lt;/em&gt;: Making automatic builds of our newest code available to all team members.&lt;br&gt;&lt;br&gt;
To keep things simple, we will start with a simple build server, which can build a C# &lt;em&gt;hello world&lt;/em&gt; project for macOS and linux, verifying your cross-platform compatibility.&lt;br&gt;&lt;br&gt;
Later tutorials will introduce pipelines covering &lt;em&gt;automatic tests&lt;/em&gt; and &lt;em&gt;deployments&lt;/em&gt; for offline applications as well as server applications.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating a Build Server
&lt;/h2&gt;

&lt;p&gt;Before we get into the Bouncer CI setup, let’s get a simple Build server running ourselves.&lt;br&gt;&lt;br&gt;
For this tutorial we will create a quick .NET Core “hello world” on GitHub.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new GitHub Repository (&lt;a href="https://github.com/Benjamin-Justice/ci-example"&gt;here is mine&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Clone your new repository to your computer&lt;/li&gt;
&lt;li&gt;Open a console and navigate to your repository&lt;/li&gt;
&lt;li&gt;run “&lt;code&gt;dotnet new console&lt;/code&gt;“&lt;/li&gt;
&lt;li&gt;commit and push&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Choosing a Build Server
&lt;/h3&gt;

&lt;p&gt;There are many good build servers available. All of them have similarities and will get most jobs done.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/services/devops/pipelines/"&gt;Azure Pipelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://Travis%20CI%20-%20Test%20and%20Deploy%20Your%20Code%20with%20Confidencetravis-ci.org"&gt;Travis CI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Travis CI is free to use for open source projects and feature rich.&lt;br&gt;&lt;br&gt;
So it looks like Travis CI is a great place to start.&lt;br&gt;&lt;br&gt;
We also use Travis CI for BrutalHack.Bouncer. You can see our build reports here: &lt;a href="https://travis-ci.org/github/BrutalHack/Bouncer/builds"&gt;https://travis-ci.org/github/BrutalHack/Bouncer/builds&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Choosing an Operating System
&lt;/h3&gt;

&lt;p&gt;As developers prefer different operating systems, I suggest we embrace this instead of forcing all developers to use windows or linux.&lt;/p&gt;

&lt;p&gt;As a result, your developers are able to use the operating system of their choice. Simply have your build server run the rarest operating system in your team.&lt;br&gt;&lt;br&gt;
Nobody is programming on linux? Then we should build on linux.&lt;br&gt;&lt;br&gt;
Nobody is coding on windows? Then we should build on windows.&lt;/p&gt;

&lt;p&gt;Our goal here is to guarantee flexibility for our team and to guarantee that our product will also be more stable on the target system.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started with Travis CI
&lt;/h2&gt;

&lt;p&gt;As mentioned earlier, we will be using Travis CI with GitHub. So let’s begin by setting up Travis CI! At first we have to follow the guide in the &lt;a href="https://docs.travis-ci.com/user/tutorial/"&gt;Travis CI Tutorial&lt;/a&gt; to authorize TravisCI as GitHub App:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X_753O0S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.travis-ci.com/images/migrate/legacy-services-migration-github-apps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X_753O0S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.travis-ci.com/images/migrate/legacy-services-migration-github-apps.png" alt="Granting Travis CI build servers access to our Github Repositories"&gt;&lt;/a&gt;Granting Travis CI access to our GitHub Repositories&lt;/p&gt;

&lt;p&gt;Next we create a simple .travis.yaml file in out repositories root:&lt;/p&gt;

&lt;p&gt;&amp;lt;!-- HTML generated using hilite.me --&amp;gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;language: csharp# if your .sln file has a different name, change it here :)solution: ci-example.csproj
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This will build a C# solution from the ci-example.sln solution file with default settings.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Commit&lt;/li&gt;
&lt;li&gt;Push&lt;/li&gt;
&lt;li&gt;Watch Travis CI build your project at &lt;a href="https://travis-ci.com/"&gt;https://travis-ci.com/&lt;/a&gt;
(here is &lt;a href="https://travis-ci.com/github/Benjamin-Justice/ci-example/builds/178866895"&gt;my build report&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://justice.sh/wp-content/uploads/2020/08/image.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6A1lQlz8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justice.sh/wp-content/uploads/2020/08/image-1024x575.png" alt=""&gt;&lt;/a&gt;Travis CI building our first commit with travis CI support&lt;/p&gt;

&lt;p&gt;If you click on “View Config” in the screenshot above, you will see the default configuration using linux, specifically “xenial”.&lt;br&gt;&lt;br&gt;
The &lt;a href="https://docs.travis-ci.com/user/reference/linux/"&gt;Travis CI linux documentation&lt;/a&gt; tells us, that this refers to Ubuntu 16.04 Xenial Xerus.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cross-Platform Builds
&lt;/h3&gt;

&lt;p&gt;Now let’s complete this tutorial by customizing our build config.&lt;br&gt;&lt;br&gt;
Specifically we want to verify our cross-platform compatibility.&lt;br&gt;&lt;br&gt;
As Travis CI does not support building C# projects on windows, we will only build on macOS and linux within this tutorial.&lt;/p&gt;

&lt;p&gt;We can do this by introducing &lt;strong&gt;jobs&lt;/strong&gt; in our .travis.yml file according to the &lt;a href="https://docs.travis-ci.com/user/multi-os/"&gt;Travis CI Multi OS documentation&lt;/a&gt;. Because our C# hello world project is created with .net core 3.1, we must define this version as described in the &lt;a href="https://docs.travis-ci.com/user/languages/csharp/"&gt;Travis CI C# Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&amp;lt;!-- HTML generated using hilite.me --&amp;gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;language: csharp# if your .sln/.csproj file has a different name, change it here :)solution: ci-example.csproj# Travis CI jobs to run multiple buildsjobs: include: # linux build with Ubuntu 18.04 "Bionic Beaver"# (https://docs.travis-ci.com/user/reference/linux/ - os: linux dist: bionic # .Net Core version 3.1.302 # (https://dotnet.microsoft.com/download/dotnet-core/3.1) dotnet: 3.1.302 # macOS build with "xcode12" image running macOS 10.15.5 with Xcode 12# (https://docs.travis-ci.com/user/reference/osx/) - os: osx osx\_image: xcode12 # .Net Core version 3.1.302 # (https://dotnet.microsoft.com/download/dotnet-core/3.1) dotnet: 3.1.302
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After commiting and pushing our new .travis.yml, you will see the new build starting with two build jobs instead of one.&lt;br&gt;&lt;br&gt;
The following screenshot displays my build with the two build jobs.&lt;br&gt;&lt;br&gt;
You can see the &lt;a href="https://travis-ci.com/github/Benjamin-Justice/ci-example/builds/179028876"&gt;full build report here at Travis CI&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://justice.sh/wp-content/uploads/2020/08/image-2.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oVz_HkEy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://justice.sh/wp-content/uploads/2020/08/image-2-1024x616.png" alt=""&gt;&lt;/a&gt;Successful linux &amp;amp; macOS builds&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Now we know how to setup automated builds, which can verify, that our code works &lt;strong&gt;independently&lt;/strong&gt; of our development machine and &lt;strong&gt;cross-platform&lt;/strong&gt;. Our next episodes will extend our build server to &lt;strong&gt;run automated tests&lt;/strong&gt; and automatically &lt;strong&gt;upload releases to GitHub&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Until then, you can reach out to me on &lt;a href="https://twitter.com/JusticeDev"&gt;Twitter&lt;/a&gt; or the &lt;a href="https://discordapp.com/invite/4FmEwGp"&gt;BrutalHack Discord Server&lt;/a&gt; for questions. I also recommend some further research in the excellent &lt;a href="https://docs.travis-ci.com/user/tutorial/"&gt;Travis CI documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.justice.sh/blog/devops/devops-ep-4-build-servers/"&gt;Getting Started with Build Servers&lt;/a&gt; appeared first on &lt;a href="https://www.justice.sh"&gt;justice.sh&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>beginners</category>
      <category>ci</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cross-Platform Scripting</title>
      <dc:creator>Benjamin Justice</dc:creator>
      <pubDate>Mon, 13 Jul 2020 06:46:04 +0000</pubDate>
      <link>https://forem.com/justice/devops-ep-3-cross-platform-scripting-3ah1</link>
      <guid>https://forem.com/justice/devops-ep-3-cross-platform-scripting-3ah1</guid>
      <description>&lt;p&gt;In this months &lt;a href="https://justice.sh/blog/devops-getting-started/"&gt;DevOps Guide&lt;/a&gt; we're getting into scripting. It's just the fastest way to simplify complex tasks. Before you continue, please make sure you are familiar with &lt;a href="https://justice.sh/blog/devops/code/devops-command-line-basics/"&gt;command line basics&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Just the other day, I wrote a small script to&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; download multiple &lt;a href="https://swagger.io/specification/"&gt;swagger json files&lt;/a&gt; from services&lt;/li&gt;
&lt;li&gt; download the &lt;a href="https://github.com/simonstewart/swagger-to-PDF"&gt;swagger-to-PDF&lt;/a&gt; tool&lt;/li&gt;
&lt;li&gt; generate a single pdf with all api endpoints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now developers don't even have to know which tool we use to generate our api documentation. They see the script, run it, and have the pdf file.&lt;br&gt;&lt;br&gt;
Furthermore the tool just automatically identifies which API versions are available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-Platform PowerShell
&lt;/h2&gt;

&lt;p&gt;Why PowerShell? Well, it is preinstalled on Windows and easy to install on macOS and Linux.&lt;br&gt;&lt;br&gt;
Installing most other scripting languages on Windows is complicated.&lt;br&gt;&lt;br&gt;
My main motivation here is to keep the entrance barrier &lt;strong&gt;as low as possible&lt;/strong&gt;. Enable everyone on your team.&lt;/p&gt;

&lt;p&gt;If your team is already familiar with another cross-platform scripting solution (e.g. bash on windows via Cygwin), you already have all you need for our series on DevOps. In that case you can skip this one for the series.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;For this tutorial, we need PowerShell and Visual Studio Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  PowerShell
&lt;/h3&gt;

&lt;p&gt;For installation steps, follow &lt;a href="https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell?view=powershell-7"&gt;this guide by microsoft for your operating system&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On Windows, the installation of PowerShell 7 is optional. However, some advanced scripts will require PowerShell 7.&lt;/p&gt;

&lt;h4&gt;
  
  
  Extra Step for Windows
&lt;/h4&gt;

&lt;p&gt;Before running PowerShell scripts on Windows, you must run &lt;code&gt;Set-ExecutionPolicy Unrestricted&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
On macOS and Linux, Unrestricted is the default.&lt;br&gt;&lt;br&gt;
For more information, see &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7"&gt;microsoft's documentation on Execution Policies&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visual Studio Code
&lt;/h3&gt;

&lt;p&gt;Now let's download and install &lt;a href="https://code.visualstudio.com/download"&gt;Visual Studio Code from Microsoft&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Visual Studio Code offers coding assistance and even debugging functionality for PowerShell. So we will be using visual studio code as free cross-platform script editor within this tutorial.&lt;br&gt;&lt;br&gt;
If you prefer a different editor, I still recommend using Visual Studio Code for this tutorial. After the tutorial, you should check if your preferred editor has the same debugging functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Scripting
&lt;/h2&gt;

&lt;p&gt;After getting comfortable with moving around your file system, let's write your first script.&lt;br&gt;&lt;br&gt;
Open Visual Studio Code and create a new file and save it with the .ps1 ending.&lt;br&gt;&lt;br&gt;
This way Visual Studio Code will recognize it as PowerShell script and offer a play button in the top right.&lt;/p&gt;

&lt;p&gt;Also I can really recommend reading &lt;a href="https://devblogs.microsoft.com/scripting/debugging-powershell-script-in-visual-studio-code-part-1/"&gt;Microsoft's Guides to Debugging PowerShell with Visual Studio Code&lt;/a&gt; to learn how to use Breakpoints and Watches.&lt;/p&gt;

&lt;h3&gt;
  
  
  She-Bang
&lt;/h3&gt;

&lt;p&gt;As they use different default shells, the first line of your cross-platform script will tell macOS and Linux, that this is a PowerShell script.&lt;br&gt;&lt;br&gt;
pwsh is the command name for PowerShell in macOS and linux.&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;#! /usr/bin/env pwsh&lt;/span&gt;
&lt;/pre&gt;

&lt;h3&gt;
  
  
  Hello World
&lt;/h3&gt;

&lt;p&gt;In PowerShell, you have different possibilities to write output.&lt;br&gt;&lt;br&gt;
While Write-Host is okay to give the user information on the state of your script. However, Write-Object, Write-Error Write-Debug and Write-Verbose will be important for advanced scripts.&lt;/p&gt;

&lt;p&gt;It's a good idea to be very verbose and always tell the script-user what's happening.&lt;br&gt;&lt;br&gt;
So we can use &lt;code&gt;Write-Host "Copying files, please wait."&lt;/code&gt; to display exactly this text to the console.&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;#! /usr/bin/env pwsh&lt;/span&gt;

Write-Host &lt;span&gt;"Hello World."&lt;/span&gt;
&lt;/pre&gt;

&lt;h3&gt;
  
  
  Variables
&lt;/h3&gt;

&lt;p&gt;Variables in PowerShell are names with a prefixed $ sign.&lt;br&gt;&lt;br&gt;
e.g. $count, $foldername, $date, etc.&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;#! /usr/bin/env pwsh&lt;/span&gt;

$directory = Get-Location
Write-Host &lt;span&gt;"Current directory: $directory"&lt;/span&gt;
&lt;/pre&gt;

&lt;h3&gt;
  
  
  Objects
&lt;/h3&gt;

&lt;p&gt;The main advantage of PowerShell is its object orientation.&lt;br&gt;&lt;br&gt;
Assuming that your script is called test.ps1, we can read this files properties:&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;#! /usr/bin/env pwsh&lt;/span&gt;
Set-StrictMode -Version Latest

$scriptfile = Get-Item test.ps1
Write-Host &lt;span&gt;"File name: $scriptfile.Name"&lt;/span&gt;
Write-Host &lt;span&gt;"File extension: $scriptfile.Extension"&lt;/span&gt;
Write-Host &lt;span&gt;"Creation Date: $scriptfile.CreationTimeUtc"&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;You can use Visual Studio Codes Watch function to examine your script's objects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://brutalhack.com/wp-content/uploads/2020/05/Screenshot-2020-05-01-at-22.39.22.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RhWgPoAM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g8xk9me817otbpldmb37.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
We can use the **Watch** function to examine objects in scripts.



&lt;p&gt;As this would be a lot to cover, we will have a closer look at PowerShells object orientation later on. For now, just keep this fact in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strict Mode
&lt;/h2&gt;

&lt;p&gt;I always recommend enabling Strict Mode in all your scripts.&lt;br&gt;&lt;br&gt;
This is basically your standard second line after the she-bang.&lt;br&gt;&lt;br&gt;
It causes your scripts to abort when using uninitialized variables, non-existant properties etc.&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;#! /usr/bin/env pwsh&lt;/span&gt;
Set-StrictMode -Version Latest&lt;/pre&gt;



&lt;p&gt;See &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/set-strictmode?view=powershell-7"&gt;Microsofts documentation&lt;/a&gt; for detailed information on strict mode.&lt;/p&gt;
&lt;h2&gt;
  
  
  If Else
&lt;/h2&gt;

&lt;p&gt;Microsoft has a &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_if?view=powershell-7"&gt;super documentation on if-else in PowerShell&lt;/a&gt;, including many great examples.&lt;br&gt;&lt;br&gt;
Therefore I only want to show one example here for completeness.&lt;/p&gt;



&lt;pre&gt;&lt;span&gt;#! /usr/bin/env pwsh&lt;/span&gt;
Set-StrictMode -Version Latest

$number = 2;

&lt;span&gt;if&lt;/span&gt; ($number -gt 2) {
    Write-Host &lt;span&gt;"$number is greater than 2"&lt;/span&gt;
}
elseif ($number -eq 2) {
    Write-Host &lt;span&gt;"$number is equal to 2"&lt;/span&gt;
}
&lt;span&gt;else&lt;/span&gt; {
    Write-Host (&lt;span&gt;"$number is less than 2"&lt;/span&gt;)
}
&lt;/pre&gt;

&lt;h2&gt;
  
  
  Loops
&lt;/h2&gt;

&lt;p&gt;Microsoft also has a super documentation on loops in PowerShell, so this example is also quite short.&lt;br&gt;&lt;br&gt;
As PowerShell is object oriented, I tend to use ForEach normally.&lt;br&gt;&lt;br&gt;
&lt;code&gt;For&lt;/code&gt; or &lt;code&gt;While&lt;/code&gt; Loops are quite rare in my scripts.&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;#! /usr/bin/env pwsh&lt;/span&gt;
Set-StrictMode -Version Latest

Write-Host &lt;span&gt;"Listing files in current folder:"&lt;/span&gt;
foreach ($file in Get-ChildItem)
{
  Write-Host &lt;span&gt;"- $file (created $($file.CreationTime))"&lt;/span&gt;
}
&lt;/pre&gt;

&lt;p&gt;See more more great examples at Microsoft's documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_for?view=powershell-7"&gt;For Loops in PowerShell&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_foreach?view=powershell-7"&gt;ForEach Loops in PowerShell&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;p&gt;PowerShell is very popular, so you can google "&lt;em&gt;How to  in PowerShell&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;The following are among some of my favourite resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://docs.microsoft.com/de-de/powershell/scripting/overview?view=powershell-7"&gt;Official PowerShell Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://pscustomobject.github.io/powershell/coding%20habits/powershell%20best%20practice/PowerShell-Strongly-Typed-Variables/"&gt;Strongly Typed Variables in PowerShell&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.red-gate.com/simple-talk/sysadmin/powershell/how-to-use-parameters-in-powershell/"&gt;Parameters in PowerShell Scripts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://powershell-guru.com/"&gt;PowerShell Guru Best Practices&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_arrays?view=powershell-7"&gt;Arrays in PowerShell&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;With this basic scripting knowledge, we are able to get started automating in the upcoming episodes of our &lt;a href="https://justice.sh/blog/devops-getting-started/"&gt;DevOps Guide&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
While most scripts will only run very few commands, these are a few commands that you and your colleagues save every day. And let's not forget the manual errors avoided by your scripts.&lt;/p&gt;

&lt;p&gt;We can use them for builds, deployments, tests, project setup, anything!&lt;/p&gt;

&lt;p&gt;If you have questions during your first steps in PowerShell, please contact me on &lt;a href="https://discordapp.com/invite/NekmPh"&gt;Discord&lt;/a&gt;, &lt;a href="https://twitter.com/ZanvalDev"&gt;Twitter&lt;/a&gt; or &lt;a href="https://www.facebook.com/zanval88"&gt;Facebook&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>powershell</category>
    </item>
    <item>
      <title>Cross-Platform Command Line</title>
      <dc:creator>Benjamin Justice</dc:creator>
      <pubDate>Mon, 15 Jun 2020 09:07:59 +0000</pubDate>
      <link>https://forem.com/justice/devops-ep-2-command-line-basics-50lp</link>
      <guid>https://forem.com/justice/devops-ep-2-command-line-basics-50lp</guid>
      <description>&lt;p&gt;The command line can be daunting for many. And yet it is one of the most powerful tools we developers can have. And it's free!&lt;/p&gt;

&lt;p&gt;So in this episode I want to help you get comfortable using your command line. You don't have to use it much, but there are some tasks that were just &lt;strong&gt;made&lt;/strong&gt; for the command line. Also, this is a foundation for writing scripts for any operating system.&lt;/p&gt;

&lt;p&gt;As part of my &lt;a href="https://brutalhack.com/blog/devops-getting-started/"&gt;Getting Started with DevOps series&lt;/a&gt;, this tutorial is cross-platform. We will be using PowerShell on &lt;strong&gt;Windows&lt;/strong&gt; and bash (or zsh, they are compatible) on &lt;strong&gt;macOS&lt;/strong&gt; and &lt;strong&gt;Linux&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to use this article as a reference to look up commands later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The Basics
&lt;/li&gt;
&lt;li&gt;  Read the Manual
&lt;/li&gt;
&lt;li&gt;  File Operations
&lt;/li&gt;
&lt;li&gt;  The Wildcard
&lt;/li&gt;
&lt;li&gt;  Executing Programs
&lt;/li&gt;
&lt;li&gt;  Make it fun to use!
&lt;/li&gt;
&lt;li&gt;  Thefuck (plugin)
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Basics
&lt;/h2&gt;

&lt;p&gt;First off, start your engines.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Windows&lt;/strong&gt;: press the start button and search for a program called &lt;strong&gt;PowerShell&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;macOS&lt;/strong&gt;: Use &lt;a href="https://support.apple.com/en-us/HT204014"&gt;Spotlight&lt;/a&gt; to launch &lt;strong&gt;terminal.app&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Linux&lt;/strong&gt;: Search for an application called &lt;strong&gt;Terminal&lt;/strong&gt;. In Ubuntu, you can also press ctrl+alt+T&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the first question to answer is: Where are we?&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;# print working directory&lt;/span&gt;
pwd
&lt;/pre&gt;

&lt;p&gt;This is one command for Windows, macOS and Linux. How can this be?&lt;br&gt;&lt;br&gt;
The command line interface in macOS and Linux are identical (bash or another compatible shell like zsh, fish, etc).&lt;br&gt;&lt;br&gt;
You can use most commands in both operating systems.&lt;br&gt;&lt;br&gt;
And while Windows uses PowerShell, they have integrated aliases for unix commands. The output will often differ, but you get nearly the same information.&lt;/p&gt;

&lt;p&gt;Now let's navigate around your file system with the following commands:&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;# list files in directory&lt;/span&gt;
ls

&lt;span&gt;# list all files in directory (includes hidden files)&lt;/span&gt;
ls -al &lt;span&gt;# macOS and Linux&lt;/span&gt;
ls -Hidden &lt;span&gt;#PowerShell&lt;/span&gt;

&lt;span&gt;# change directory&lt;/span&gt;
cd 

&lt;span&gt;# leave directory / move up&lt;/span&gt;
cd ..

&lt;span&gt;# go back to your $HOME directory&lt;/span&gt;
cd ~
&lt;/pre&gt;

&lt;p&gt;So we can now navigate around our file systems, but typing the folder names takes long. Time to try out &lt;strong&gt;tab-completion&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
While typing anything in your terminal, you can often press tab to auto-complete your command, filename or directory name.&lt;br&gt;&lt;br&gt;
Just a few examples to get you started:&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;# cd to directory "Documents"&lt;/span&gt;
cd Doc&lt;span&gt;&lt;/span&gt;
&lt;span&gt;# =&amp;gt; cd Documents&lt;/span&gt;

&lt;span&gt;# list hidden files in PowerShell&lt;/span&gt;
ls -Hi&lt;span&gt;&lt;/span&gt;
&lt;span&gt;# =&amp;gt; ls -Hidden&lt;/span&gt;
&lt;/pre&gt;

&lt;h2&gt;
  
  
  Read the Manual
&lt;/h2&gt;

&lt;p&gt;There are many commands coming up and both PowerShell and bash/zsh have manuals you can read on every single command.&lt;br&gt;&lt;br&gt;
After all, this is just your beginning ;)&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;# Show manual in PowerShell&lt;/span&gt;
Get-Help  -Full

&lt;span&gt;# Show only examples in PowerShell&lt;/span&gt;
Get-Help  -Examples

&lt;span&gt;# Show manual in macOS/Linux&lt;/span&gt;
man 
&lt;span&gt;# Scroll with arrow keys up/down&lt;/span&gt;
&lt;span&gt;# Close with Q&lt;/span&gt;
&lt;/pre&gt;

&lt;h2&gt;
  
  
  File Operations
&lt;/h2&gt;

&lt;pre&gt;&lt;span&gt;# Create a new file&lt;/span&gt;
touch 

&lt;span&gt;# Display file contents&lt;/span&gt;
cat 

&lt;span&gt;# list target directory contents&lt;/span&gt;
ls 
&lt;span&gt;# e.g. ls ~/Documents&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;So now that we can navigate through our file system, it‘s time for some interaction. Creating, Copying, Moving and removing files are the three basic operations I use everyday.&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;# Move a file&lt;/span&gt; 
mv  /
&lt;span&gt;# e.g. mv Documents/photo.jpg Pictures/&lt;/span&gt;

&lt;span&gt;# With the move command you can also rename files&lt;/span&gt;
mv  /
&lt;span&gt;# e.g. mv Documents/photo.jpg Pictures/holiday-photo.jpg&lt;/span&gt;
&lt;span&gt;# e.g. mv photo.jpg holiday-photo.jpg&lt;/span&gt;

&lt;span&gt;# Remove a file&lt;/span&gt;
rm 
&lt;/pre&gt;

&lt;p&gt;Now that we know how to work with files, we can alter these commands slightly to work with directories.&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;# Move a directory&lt;/span&gt; 
mv  /
&lt;span&gt;# e.g. mv Scanned-Pages ~/Documents/&lt;/span&gt;

&lt;span&gt;# With the move command you can also rename directories&lt;/span&gt;
mv  
&lt;span&gt;# e.g. mv Scanned-Pages Scans&lt;/span&gt;

&lt;span&gt;# Remove an empty directory&lt;/span&gt;
rmdir 

&lt;span&gt;# Remove a directory with all its contents (careful with this one!)&lt;/span&gt;
rm -rf 
&lt;/pre&gt;

&lt;p&gt;Take some time to get comfortable with these commands before you move on. The cool stuff is just ahead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Wildcard
&lt;/h2&gt;

&lt;pre&gt;&lt;span&gt;# Show the content of all .txt files&lt;/span&gt;
cat *.txt

&lt;span&gt;# Move Photo-london.jpg, Photo-tokio.jpg, Photo-berlin.jpg etc to parent directory&lt;/span&gt;
mv Photo-*.jpg ../
&lt;/pre&gt;

&lt;h2&gt;
  
  
  Executing Programs
&lt;/h2&gt;

&lt;p&gt;Now the last part missing is: How do I execute a program on the command line? Of course, globally installed software can be run by simply executing the command. But local files? They sometimes need execution permission (macOS and linux only)&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;# Add execution permission to file on macOS/Linux&lt;/span&gt;
chmod +x 

&lt;span&gt;# execute a local file&lt;/span&gt;
./
&lt;span&gt;# Example: list connected devices with android developer tools&lt;/span&gt;
./adb list devices
&lt;/pre&gt;

&lt;p&gt;Beware that the above command sets execution permissions for all users on your computer. If you are managing permissions for a file outside of your personal directory or generally want to learn more about your unix/linux permissions, &lt;a href="https://www.tutorialspoint.com/unix/unix-file-permission.htm"&gt;tutorialspoint&lt;/a&gt; explains it well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it fun to use!
&lt;/h2&gt;

&lt;p&gt;Now I would love to share an easy-to-setup terminal, that is really fun to use. Including bells and whistles!&lt;br&gt;&lt;br&gt;
First, let‘s get a good terminal Emulator that supports tabs.&lt;br&gt;&lt;br&gt;
Just like in my browser, I often use multiple Terminal Tabs (e.g. for working in different Git repositories)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Windows: &lt;a href="https://www.microsoft.com/de-de/p/windows-terminal/9n0dx20hk701?rtc=1"&gt;Windows Terminal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  MacOS: &lt;a href="https://www.iterm2.com/"&gt;iTerm2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Ubuntu Linux: &lt;a href="http://guake-project.org/"&gt;Guake&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Okay. Now that the terminal emulator (the window) is easy to rich and offers tabs, support for ctrl+f/cmd+f text search, copy-paste and more, it‘s time to upgrade what‘s inside of that window.&lt;/p&gt;

&lt;p&gt;Meet &lt;a href="https://starship.rs/"&gt;Starship&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Starship is a feature-loaded command prompt, which automatically shows you the following information and more without you asking for it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Git Status&lt;/li&gt;
&lt;li&gt;  Current User&lt;/li&gt;
&lt;li&gt;  If the last command returned an error&lt;/li&gt;
&lt;li&gt;  Current directory’s NodeJS/Python/Ruby/Rust/Dotnet/Java/etc version&lt;/li&gt;
&lt;li&gt;  Current Kubernetes/Azure/AWS/etc environment&lt;/li&gt;
&lt;li&gt;  command duration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just check out the gif on its website. it shows it all.&lt;br&gt;&lt;br&gt;
As I also like the features oh-my-zsh brings to the table, I use iTerm2+&lt;a href="https://ohmyz.sh/"&gt;oh-my-zsh&lt;/a&gt;+&lt;a href="https://github.com/denysdovhan/spaceship-prompt"&gt;spaceship&lt;/a&gt;, which is very similar to starship but only available for zsh. If you‘re interested, I might go into detail on my personal setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thefuck (plugin)
&lt;/h2&gt;

&lt;p&gt;Another Plugin I love using is &lt;a href="https://github.com/nvbn/thefuck"&gt;thefuck&lt;/a&gt;. Yes, that‘s its name. And it does what you think it does: It adds support for writing fuck when you messed up your last command.&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;# try to clone the bouncer repo&lt;/span&gt;
git clpne git@github.com:BrutalHack/Bouncer.git
&lt;span&gt;# =&amp;gt; git: 'clpne' is not a git command. See 'git --help'.&lt;/span&gt;

&lt;span&gt;# The most similar command is&lt;/span&gt;
&lt;span&gt;#  clone&lt;/span&gt;

&lt;span&gt;# correct the previous command&lt;/span&gt;
fuck
&lt;span&gt;# =&amp;gt; git clone git@github.com:BrutalHack/Bouncer.git [enter/↑/↓/ctrl+c]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;My most common case: When I create a local git branch and try git push, git says that I must first setup your new branch to track a remote new branch.&lt;br&gt;&lt;br&gt;
I do not know this command, but instead write fuck, which then suggests the correct command.&lt;br&gt;&lt;br&gt;
For those of us working for clients, we can change the word to „carp“, „meh“ or something funny.&lt;/p&gt;

&lt;pre&gt;&lt;span&gt;# push new "my-branch" to the git repository&lt;/span&gt;
git push
&lt;span&gt;# =&amp;gt; fatal: The current branch new-branch has no upstream branch.&lt;/span&gt;
&lt;span&gt;# To push the current branch and set the remote as upstream, use&lt;/span&gt;
&lt;span&gt;#&lt;/span&gt;
&lt;span&gt;#    git push --set-upstream origin my-branch&lt;/span&gt;

&lt;span&gt;# correct the previous command&lt;/span&gt;
fuck
&lt;span&gt;# =&amp;gt; git push --set-upstream origin new-branch [enter/↑/↓/ctrl+c]&lt;/span&gt;
&lt;/pre&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;p&gt;If this was a little much at once, no worries.&lt;br&gt;&lt;br&gt;
You can come back to this article anytime and look up the commands.&lt;/p&gt;

&lt;p&gt;If you wanna learn more about your command line, here are some interesting links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x1712.htm"&gt;tldp on the Bash Line History (also applies to PowerShell)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://ryanstutorials.net/linuxtutorial/piping.php"&gt;Ryans Tutorials on Piping (also applies to PowerShell)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Did this post help you? Do you still have questions?&lt;br&gt;&lt;br&gt;
I will be kapping an eye on the comment section below :)&lt;/p&gt;

</description>
      <category>devops</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Getting Started with DevOps</title>
      <dc:creator>Benjamin Justice</dc:creator>
      <pubDate>Sun, 17 May 2020 16:00:00 +0000</pubDate>
      <link>https://forem.com/justice/devops-ep-1-getting-started-cj6</link>
      <guid>https://forem.com/justice/devops-ep-1-getting-started-cj6</guid>
      <description>&lt;p&gt;DevOps. This buzzword is thrown around a lot and can be hard to understand at first. So what does it mean?&lt;br&gt;&lt;br&gt;
Within this series I'm want to break it down for fellow developers step-by-step:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is DevOps&lt;/strong&gt; and &lt;strong&gt;how can you get started&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;The name DevOps says a lot, as it's a combination of "&lt;strong&gt;Dev&lt;/strong&gt;elopment" and "&lt;strong&gt;Op&lt;/strong&gt;erations".&lt;br&gt;&lt;br&gt;
It basically stands for a mindset of embracing the entire software development process. Including planning, releasing and operating the software product.&lt;br&gt;&lt;br&gt;
Sounds like a lot of work? That's why DevOps Engineers automate anything they can.&lt;br&gt;&lt;br&gt;
As an example, here are a few things I implement within my projects to embrace DevOps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PowerShell scripts to install tools and setup your project&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;New co-workers don't have to waste 1-2 days installing software and configuring their system. Get to the fun parts!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deployment scripts&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;These can be small local PowerShell scripts that upload your website via FTP or they can be actual build scripts in a system like &lt;a href="https://dev.azure.com/"&gt;Azure DevOps&lt;/a&gt;, &lt;a href="https://help.github.com/en/actions/getting-started-with-github-actions"&gt;GitHub Actions&lt;/a&gt; or &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;File conversion scripts&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Do colleagues need to convert lots of files? E.g. sound files from .ogg to .wav? I'll create a script using &lt;a href="https://ffmpeg.org/"&gt;ffmpeg&lt;/a&gt; for that. Start the script, have a cup of coffee, 100 sound files converted. No tedious clicking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitoring alerts&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Is your server becoming crowded? I like getting an e-mail when we reach 60% load. This gives me enough time to plan ahead without checking monitoring systems manually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define Processes&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Do you have a step-by-step guide for releases, user tests and other processes? I highly recommend them. A wiki is the best place to document them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a small taste of what we will learn during this series, but let's take a step back.&lt;/p&gt;

&lt;h1&gt;
  
  
  The DevOps Lifecycle
&lt;/h1&gt;

&lt;p&gt;The DevOps mindset can be applied throughout the entire lifecycle of your projects. You've probably come across this image online already:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--llqg8GJh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nhjy8f8o9o4ulr2wuig3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--llqg8GJh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nhjy8f8o9o4ulr2wuig3.png" alt="The DevOps Lifecycle"&gt;&lt;/a&gt;&lt;/p&gt;
The DevOps Lifecycle



&lt;p&gt;As you can see, the only prerequisite to implementing DevOps is working in iterations.&lt;br&gt;&lt;br&gt;
I have broken down the DevOps Lifecycle into chunks and will offer a deep look at each one of them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While planning your project, you should consider all phases of your products life cycle, not just development. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Code&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Developers want to code. They don't want to reinvent wheels or spend a day setting up the project and its databases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Build Systems speed up and simplify your build process. However they can also provide additional services, such as static code analysis or uploading binaries for your testers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most Tests can be automated. Our goal is to reduce, but also improve your manual tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Release&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;A release is much more than just uploading your built software. There is much to plan: You have to validate your built software, plan your release (frontend and backend), migrate your databases to the new version, and more. Let's optimize it all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;This is probably the most popular case. Manual deployments can take so much time. Once you automate them, you will never look back.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Operate&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Most systems do not need routine maintenance. But they do require automated backups, SSL certificate renewals, software updates and emergency plans.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitor&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Of course we can monitor our servers and see if they are still running. However, we can answer many more questions: How many users are using our servers? How is our growth? When do we need to scale? And can we scale automatically?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I will also include excursions where I see them as useful (expect a crash course on cross-platform scripting).&lt;br&gt;&lt;br&gt;
Are there any DevOps topics you would like me to write about?&lt;br&gt;&lt;br&gt;
I'm open for questions and suggestions on our &lt;a href="https://discordapp.com/invite/4FmEwGp"&gt;Discord&lt;/a&gt;, &lt;a href="https://www.facebook.com/BrutalHackGames/"&gt;Facebook&lt;/a&gt; or &lt;a href="https://twitter.com/BrutalHackGames"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>howto</category>
    </item>
  </channel>
</rss>
