<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AnaisUrlichs</title>
    <description>The latest articles on DEV Community by AnaisUrlichs (@urlichsanais).</description>
    <link>https://dev.to/urlichsanais</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%2F231025%2Fe24ba65a-2564-4817-9140-3fea1f16f7b1.png</url>
      <title>DEV Community: AnaisUrlichs</title>
      <link>https://dev.to/urlichsanais</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/urlichsanais"/>
    <language>en</language>
    <item>
      <title>Comparison: Code Analysis Tools</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Tue, 09 Feb 2021 16:55:47 +0000</pubDate>
      <link>https://dev.to/codefreshio/comparison-code-analysis-tools-3ff9</link>
      <guid>https://dev.to/codefreshio/comparison-code-analysis-tools-3ff9</guid>
      <description>&lt;p&gt;Code analysis tools are essential to gain an overview and understanding of the quality of your code. This post is going to cover the following&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;
&lt;a href="https://about.codecov.io/"&gt;Codecov&lt;/a&gt;;&lt;/li&gt;
    &lt;li&gt;
&lt;a href="https://coveralls.io/"&gt;Coveralls&lt;/a&gt;;&lt;/li&gt;
    &lt;li&gt;And &lt;a href="https://www.codacy.com"&gt;Codacy&lt;/a&gt;;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While these tools target similar use cases, they differ in their implementation, ease of use, and documentation just to name a few.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/02/image3.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y8WhPCja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2021/02/image3-300x114.png" alt="code-coverage-comparison"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post provides an overview of each tool as well as a detailed comparison to help analyse and decide which tool is best suited for your needs.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Overview&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Code analysis tools make it possible to access, group, and merge analysis reports of your application. Test coverage reports used in combination with code analysis tools provide comprehensive insights on the quality of your code.&lt;/p&gt;

&lt;p&gt;This allows developers to know their code quality today and improve it tomorrow. Specifically, to&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Improve poorly written code;&lt;/li&gt;
    &lt;li&gt;Develop robust and secure applications;&lt;/li&gt;
    &lt;li&gt;Receive insights into the code quality over time;&lt;/li&gt;
    &lt;li&gt;Ensure test coverage is done throughout the codebase.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the best case, you would want to have all the insights on your code quality in one place. This is made possible by Codacy, Codecov, and Coveralls.&lt;/p&gt;

&lt;p&gt;The next sections will compare distinct aspects of each tool with its competitors. We tried all 3 tools with our own project in order to gain a better understanding of how they work. Here is each blog post if you want to see what we did:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href="https://codefresh.io/howtos/code-coverage-codecov/"&gt;Codecov&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://codefresh.io/howtos/code-coverage-reports-using-coveralls-codefresh/"&gt;Coveralls&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://codefresh.io/howtos/codacy-coverage-reports/"&gt;Codacy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Features&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Now that we discovered that all three tools have the same goals in mind, let’s take a look at the features each tool pursues and the ways they differ.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Each tool has been evaluated based on the following criteria&lt;/b&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Feature&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Clear Difference&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Pricing&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The flexibility of the pricing options
and the extent to which those are justified&lt;/td&gt;
&lt;td&gt;Coveralls is the only tool of the three that
charges per repository rather than per user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Ease of Use&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Whether or not it was intuitive
to get started with the tool&lt;/td&gt;
&lt;td&gt;Coveralls was the easiest to
integrate within our project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Documentation&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The quality of the overall documentation,
whether examples were provided,
integration with CI/CD providers,
and the clarity of the conveyed information&lt;/td&gt;
&lt;td&gt;Codecov had the most comprehensive documentation
that left little to no room for ambiguity,
making it easy set-up and expand the integration with our project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Dashboard&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The functionality of the Dashboard
and the way information is displayed.&lt;/td&gt;
&lt;td&gt;While the Codacy Dashboard is not the easiest to navigate,
it did provide the best data visualisation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Historical Data&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Whether it is possible to access historical data,
view trends, and analyse code changes&lt;/td&gt;
&lt;td&gt;All tools enable this feature in a different format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CI/CD Integration&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Ease of automating the process of creating code
coverage reports and forwarding those to a CI platform&lt;/td&gt;
&lt;td&gt;Codecov did not require extensive custom set-up
to integrate with Codefresh&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;&lt;b&gt;Pricing&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Both Codacy and Codecov provide a free version, a pro-version and an on-premises version. In the case of Codecov, all pricing options are &lt;a href="https://about.codecov.io/pricing/"&gt;detailed on their website.&lt;/a&gt; In comparison, &lt;a href="https://www.codacy.com/pricing"&gt;Codacy does not clearly state&lt;/a&gt; the service provided with the free version. Additionally, both platforms charge per user, who receives access to an organization’s repository.&lt;/p&gt;

&lt;p&gt;Coveralls, on the other hand, has more &lt;a href="https://coveralls.io/pricing"&gt;segmented pricing options&lt;/a&gt; with 5 different tiers. Additionally, it provides free analysis for open source. The remaining options are priced depending on the number of repositories that receive coverage reports rather than the number of users, who need access to the platform.&lt;/p&gt;

&lt;p&gt;Given the information provided by each tool, we would recommend startups and open-source projects to go with Coveralls. While they currently do not provide extensive support to projects, they clearly state their belief in the open-source ethos and provide a flexible pricing model. Additionally, paying Coveralls per repository provides more predictable pricing. Depending on the size of your team and the number of repositories that have to be covered, Codecov will provide the best option for its price. However, if your company would like to receive additional features, it might be worth looking into the enterprise and on-premises solutions provided by Codecov and Codacy since both provide a few more features than Codecov.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Reports and Analysis&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;All three platforms provide a comprehensive dashboard through which code analysis reports can be accessed. This section will look at the features of each platform before providing a comparison. Note that we uploaded to each platform the same coverage report.&lt;/p&gt;

&lt;p&gt;The coverage reports uploaded to each platform were based on a&lt;a href="https://github.com/codefresh-contrib/coveralls-sample-app"&gt; Typescript application&lt;/a&gt;. Thus, reports had to be in either of the following formats: json, xml, or txt.&lt;/p&gt;

&lt;p&gt;Both &lt;a href="https://docs.codecov.io/docs/supported-languages"&gt;Codecov&lt;/a&gt; and &lt;a href="https://docs.coveralls.io/"&gt;Coveralls&lt;/a&gt; suggest different testing and coverage report frameworks depending on the language used throughout a comprehensive list of examples. In comparison, Codacy provides &lt;a href="https://docs.codacy.com/coverage-reporter/generating-coverage-reports/"&gt;a list of suggestions&lt;/a&gt; that are not directly managed by Codacy. This makes it a bit more difficult to understand the potential and implementation of Codacy. Once we have uploaded our coverage report, we can view the information in the respective Dashboards.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Codecov&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/02/image1-1.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dUtOgy23--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2021/02/image1-1-276x300.png" alt="Codecov"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Codecov Dashboard is divided into several sections with a top menu bar. Each coverage report is classified in either of the following categories:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
&lt;b&gt;hit&lt;/b&gt; indicates that the source code was executed by the test suite.&lt;/li&gt;
    &lt;li&gt;
&lt;b&gt;partial&lt;/b&gt; indicates that the source code was not fully executed by the test suite; there are remaining branches that were not executed.&lt;/li&gt;
    &lt;li&gt;
&lt;b&gt;miss&lt;/b&gt; indicates that the source code was not executed by the test suite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is visible in the files section of the Dashboard in the form of a street-light system.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Coveralls&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/02/image4.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NEI5vKF0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2021/02/image4-294x300.png" alt="Coveralls"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coveralls follows a unique style throughout its platform. Similar to Codecov, Coveralls uses the percentage of the project covered by tests to analyze its code quality. Furthermore, with every new code coverage upload, Coveralls makes a separate entry into the recent builds section of the Dashboard. This entry includes the coverage percentage of the repository. While a graph for enhanced visualisation of code coverage improvements would be nice, it is not necessary to understand the coverage change over time.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Codacy&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/02/image8.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jlLhmkay--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2021/02/image8-300x146.png" alt="Codacy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similar to Codecov, Codacy focuses on enhancing its code analysis by connecting coverage reports with the information recorded on your git repository. This includes issues, pull requests and commits. From the main Dashboard, users can access specific information on the repository, such as file coverage. However, Codacy does not provide you with an option to view coverage reports directly. The pro version allows users to set-up security alerts, which is a feature that is unique to Codacy.&lt;/p&gt;

&lt;p&gt;Separately, Codacy provides additional tools such as user management, separate configuration for file support, and setting quality standards.&lt;/p&gt;

&lt;h4&gt;&lt;b&gt;Comparison&lt;/b&gt;&lt;/h4&gt;

&lt;ul&gt;
    &lt;li&gt;Coveralls was the most intuitive platform of the three. However, this can be considered a positive side-effect of Coveralls focusing on the core features needed to create curated coverage reports rather than providing too many options that might confuse users.&lt;/li&gt;
    &lt;li&gt;In contrast, both Codecov and Codacy place more focus on the visualisation of the coverage reports that enhance the Dashboard.&lt;/li&gt;
    &lt;li&gt;An additional feature worth highlighting is the option to compare branches directly within the Codecov UI.&lt;/li&gt;
    &lt;li&gt;In the case of Codacy, the complex UI used to accommodate all features was a problem. The Codacy UI has two settings taps with similar features. When setting up the integration, it was not clear which API token should be used. More on this in the integration section.&lt;/li&gt;
    &lt;li&gt;Overall, there is not much to set-up or to customise within the UI, which results in a similar workflow while using each tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;b&gt;Historical Trends&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Historical Trends are necessary to reason between events, changes done to the code base and the results of the code coverage. Depending on the way historical trends are displayed, it becomes easier for developers to identify good practices that led to higher code quality.&lt;/p&gt;

&lt;p&gt;All platforms provide historical trends. While Codacy provides the best visualisation of reports over time as an average, it makes it difficult to access coverage reports directly from within the tool. Looking at Codecov and Coveralls, also the simplified Dashboards makes it possible to reason about changes in code coverage within respective files and repositories.&lt;/p&gt;

&lt;p&gt;Summarising, the information provided by Codacy is better when looked at high-level but does not provide an advantage when users want to analyse specific files.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Code Analysis&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Using a code coverage solution makes it possible for users to access additional information on the quality of their code. The following screenshots showcase the analysis interface of the file that we ran tests on. It is worth highlighting that Codacy analyses the code quality of all files within the git repository by default. Resulting, also files that are not part of the code coverage report are automatically analysed.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Codecov&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/02/image6.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WWYfww_a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2021/02/image6-300x125.png" alt="codecov-code-analysis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Coveralls&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/02/image7.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rqKrQq6a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2021/02/image7-300x157.png" alt="Coveralls Code Analysis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Codacy&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Note that Codacy has some additional logic that did not allow us to access the js file created from the ts file. Thus, we used the ts file instead to analyse our code quality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/02/image2.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bgJx2K8i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2021/02/image2-300x149.png" alt="Codacy Code Analysis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this category, Codacy clearly provided the most information on each line of code, highlighting the improvements that can be made. However, by doing so, the platform enforces specific practices onto your codebase. For instance, in the case of JavaScript, there is no need to provide semicolons but their tool will flag those as missing and downgrade the code quality. By not flagging distinct coding styles, Codacy could be used to enforce a coding style within the organisation.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Documentation &lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Your need for good documentation will vary, depending on the way you want to use the tools and access code coverage reports. Sadly, the documentation is often that part of a product that is least taken care of. Good documentation allows users to get started quickly, avoid ambiguity, and optimise the use of the platform over time.&lt;/p&gt;

&lt;p&gt;When comparing the documentation by Codecov, Coveralls and Codacy, the following became apparent&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Codecov has the most comprehensive documentation since it covers every aspect of the product with great detail.&lt;/li&gt;
    &lt;li&gt;Coveralls’ documentation was the easiest to navigate given that it focuses on the essential operations that users would want to do.&lt;/li&gt;
    &lt;li&gt;Both Codecov and Coveralls provide a comprehensive list of examples that users can choose from depending on the programming language and framework used in their application. This was greatly missed within Codacy, which is further detailed in the next section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;b&gt;Use and Ease of Implementation&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;The use and ease of implementation is arguably the most important aspect of each platform. Depending on the tool that is added to your existing workflow, you do not want to change your entire processes to accommodate one tool. Thus, it is necessary for code coverage and analysis tools to understand at what point coverage reports are created in the development lifecycle. This will allow the tool to provide seamless integration into the testing and coverage process that a team has already established.&lt;/p&gt;

&lt;p&gt;Using Codefresh to connect our code coverage reports to the respective tool makes it possible to automate the process of running tests, creating coverage reports, and uploading those to the code analysis tool. This section will detail our experience integrating each analysis tool within our Codefresh pipeline.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Integrate with each tool&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;The connection between the tool and your application is made through a repository token. Independent of the tool you are using, you will be provided with a repository token once you grant the platform access to a new git repository. The repository token is set as an environment variable either in your local installation or within your CI/CD platform.&lt;/p&gt;

&lt;p&gt;In the case of Coveralls, it was necessary to install a node package and a script was added to the repository. The script can be modified to provide additional information on the application. Further details are provided in the &lt;a href="https://codefresh.io/howtos/code-coverage-reports-using-coveralls-codefresh/"&gt;Coveralls specific blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Codecov merely required a specific set-up of the code coverage tool used.&lt;/p&gt;

&lt;p&gt;Codacy was a bit special in this regard. Instead of installing a script or package within the application, users have to call a remote script. While it might seem more user friendly at the beginning, it has several disadvantages. Namely:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;The script has to be called every time that the code coverage report is pushed to the Codacy account. If the script changes, it might result no longer be compatible with the coverage reports used and fail to upload those.&lt;/li&gt;
    &lt;li&gt;In case of an error, users do not have insights on what has gone wrong. In our case, Codacy was unable to access the right file within the repository and as a result, did not display coverage resorts. However, the script behaved as if it ran successfully.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;b&gt;Pipeline Creation&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;One heavily promoted feature within each code coverage tool is the possibility to integrate it directly within your existing CI/CD platform. To evaluate the use of each tool, we set-up a CI/CD pipeline for each tool within Codefresh. The process was highly similar across tools and resulted in the following pipeline for Codecov:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/02/image5.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8W_Kmjw4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2021/02/image5-300x174.png" alt="codecov-pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that we have access to the live logging through the ‘Output’ section in the Codefresh UI.&lt;/p&gt;

&lt;p&gt;This section specifically details the use of integrating either of the code coverage tools into Codefresh pipelines. The first steps of the Codecov pipeline are provided as an example. In Codefresh, each step is its own Docker image. At the beginning of standard pipelines, the git repository is cloned, a container image created and pushed to the user's container registry. These steps were the same for each tool.&lt;/p&gt;



&lt;pre&gt;
version: "1.0"
# Stages can help you organize your steps in stages
stages:
  - "clone"
  - "build"
  - "test"

steps:
  clone:
    title: "Cloning repository"
    type: "git-clone"
    repo: "codefresh-contrib/codecov-sample-app"
    # CF_BRANCH value is auto set when pipeline is triggered
    # Learn more at codefresh.io/docs/docs/codefresh-yaml/variables/
    revision: "${{CF_BRANCH}}"
    git: "github"
    stage: "clone"

  build:
    title: "Building Docker image"
    type: "build"
    image_name: "codefresh-contrib/codecov-sample-app"
    working_directory: "${{clone}}"
    tag: "${{CF_BRANCH_TAG_NORMALIZED}}"
    dockerfile: "Dockerfile"
    stage: "build"
&lt;/pre&gt;



&lt;p&gt;Next, we had to run the tests, create coverage reports of our projects, and forward those to each platform. This is done in its own container image. For our application, we used the node image within each pipeline. The implementation for forwarding coverage reports between our Codefresh pipeline varied between Codecov, Coveralls, and Codacy.&lt;/p&gt;

&lt;pre&gt; 
test:
    title: "Running test"
    type: "freestyle" # Run any command
    image: "anaisurlichs/codecov-sample-app:master" # The image in which command will be executed
    working_directory: "${clone}" # Running command where code cloned
    commands:
      - "npm run test"
    stage: "test"

upload:
    title: "Pushing to Codecov"
    type: "freestyle" # Run any command
    image: "node:15.2" # The image in which command will be executed
    working_directory: "${clone}" # Running command where code cloned
    commands:
      - "ci_env=`curl -s https://codecov.io/env`"
      - "npm install codecov -g"
      - "codecov -t ${CODECOV_TOKEN} -f ./coverage/clover.xml"
    stage: "test"
&lt;/pre&gt;

&lt;p&gt;Note that it would have been best if each tool would provide their own container image that can be used within CI/CD pipelines instead of using the generic node image. This would have reduced the need for a custom workaround and makes it possible to optimize the process.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Let’s Recap&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;This post provided an overview and comparison of three different code analysis tools. Namely, Codecov, Coveralls and Codacy. All three tools have the same goal of accessing code coverage reports and generating curated insights over time.&lt;/p&gt;

&lt;p&gt;When explored in more detail it becomes visible that all tools have a different focus on their implementation of features. This results in a tradeoff between access to features and ease of use. While Codacy is the most advanced tool of the three, it was more difficult to set-up and to navigate its UI. In contrast, Coveralls focuses on the minimum functionality needed to access and analyse code coverage reports. Comparing the free version of each tool, there is no significant difference between tools.&lt;/p&gt;

&lt;p&gt;If you are interested in each tool specifically, we highly recommend you to have a look at our previous blog posts on:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href="https://codefresh.io/howtos/code-coverage-codecov/"&gt;Codecov&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://codefresh.io/howtos/code-coverage-reports-using-coveralls-codefresh/"&gt;Coveralls&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;And &lt;a href="https://codefresh.io/howtos/codacy-coverage-reports/"&gt;Codacy&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each tool can be automated through Codefresh; simply by creating a pipeline for your project that integrates with the respective code coverage tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/codefresh-signup/?utm_source=Blog&amp;amp;utm_medium=Post&amp;amp;utm_campaign=codeanalysiscomparison"&gt;Create Your Free Account today and try it out!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dvops</category>
      <category>testing</category>
      <category>code</category>
      <category>coverage</category>
    </item>
    <item>
      <title>#14 DevOps Diary: Learning Go &amp; More Podcasts!</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Sun, 24 Jan 2021 15:39:35 +0000</pubDate>
      <link>https://dev.to/urlichsanais/14-devops-diary-learning-go-more-podcasts-jo1</link>
      <guid>https://dev.to/urlichsanais/14-devops-diary-learning-go-more-podcasts-jo1</guid>
      <description>&lt;p&gt;Welcome beautiful people!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Motivation comes from doing ♾️&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The more I learn about the cloud-native space, tools and platforms, the more excited I get about learning more 🎉&lt;/p&gt;

&lt;p&gt;On other news, I was finally able &lt;a href="https://www.youtube.com/c/AnaisUrlichs?sub_confirmation=1"&gt;to customise my YouTube domain!&lt;/a&gt; A BIG shout-out to my subscribers for supporting me along my learning journey! You rock 🙌🏼&lt;/p&gt;

&lt;p&gt;Now let's get started with this week's content...&lt;/p&gt;

&lt;h2&gt;
  
  
  Videos🎥
&lt;/h2&gt;

&lt;p&gt;This week, I will highlight a few YouTube channels that are quite amazing in different ways&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jeff Geerling&lt;/strong&gt;'s &lt;a href="https://www.youtube.com/channel/UCR-DXc1voovS8nhAvccRZhg"&gt;YouTube channe&lt;/a&gt;l where he shows lots of Raspberry Pi videos + tutorials; he also has a specific Kubernetes 101 tutorial. Have a look if you enjoy hands-on learning.&lt;/li&gt;
&lt;li&gt;Dave Farley's Channel on &lt;a href="https://www.youtube.com/channel/UCCfqyGl3nq_V0bo64CjZh8g"&gt;&lt;strong&gt;Continuous Delivery&lt;/strong&gt;&lt;/a&gt; — Definitely a variety of insights that I would not get in most blog posts or by other YouTubers + he aims to make the content more entertaining by connecting it with current events across industries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And next, two amazing, growing channels — check those out if you are into podcast style content &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.youtube.com/channel/UCMZAsRXAPe3BDxZEncXSbGA"&gt;The Popcast&lt;/a&gt;&lt;/strong&gt; by &lt;a href="https://twitter.com/danpopnyc"&gt;Dan&lt;/a&gt; is going into its second season, featuring lots of amazing people across the cloud-native space.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://blog.anaisurl.com/14-devops-diary-learning-go-more-podcasts/"&gt;View the entire newsletter here&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>kubernetes</category>
      <category>go</category>
    </item>
    <item>
      <title>#13 DevOps Diary: Events are back</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Sun, 17 Jan 2021 18:05:07 +0000</pubDate>
      <link>https://dev.to/urlichsanais/13-devops-diary-events-are-back-48n6</link>
      <guid>https://dev.to/urlichsanais/13-devops-diary-events-are-back-48n6</guid>
      <description>&lt;p&gt;Welcome beautiful people!&lt;/p&gt;

&lt;p&gt;This week is yet another week full of Kubernetes learning resources. Personally, I started learning Go and I am consistently surprised by the level of support from the community; &lt;a href="https://twitter.com/goinggodotnet/status/1350063893293502465"&gt;this is just one example.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope you enjoy this week's newsletter 😊 &lt;/p&gt;

&lt;p&gt;If you have any comments, suggestions, anything you would like to have included in next week's edition, &lt;a href="https://devops.anaisurl.com/contact"&gt;please do let me know&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Top Kubernetes Learning Resources 📖
&lt;/h2&gt;

&lt;p&gt;This is an &lt;a href="https://ramitsurana.gitbook.io/awesome-kubernetes/docs/learning-resources"&gt;open source documentation&lt;/a&gt;, linking to Kubernetes resources and providing explanations. &lt;a href="https://github.com/ramitsurana/awesome-kubernetes"&gt;You can also contribute here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Videos🎥
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This week, I had the chance to &lt;a href="https://youtu.be/n8ou7brCcLw"&gt;spontaneously record an episode on Kubernetes Services&lt;/a&gt; with  &lt;a href="https://twitter.com/rawkode"&gt;David McKay&lt;/a&gt; and &lt;a href="https://twitter.com/pst418"&gt;Philipp Strube&lt;/a&gt; in which I asked all those questions newbies might be wondering about, getting started with Kubernetes. Also, have a look at David McKay's &lt;a href="https://www.youtube.com/channel/UCrber_mFvp_FEF7D9u8PDEA"&gt;YouTube channel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you are new to Kubernetes, or also, if you have already been using Kubernetes for some time, you might want to &lt;a href="https://youtu.be/5Nhbl6LwP2o"&gt;check out k9s&lt;/a&gt; as part of my #100DaysOfKubernetes series. It is a terminal based UI that allows you to easier manage all your cluster resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://blog.anaisurl.com/13-devops-diary-events-are-back/"&gt;View the full newsletter here!&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>newsletter</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Code Coverage Reports using Codacy and Codefresh</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Thu, 14 Jan 2021 14:07:06 +0000</pubDate>
      <link>https://dev.to/codefreshio/code-coverage-reports-using-codacy-and-codefresh-1pdc</link>
      <guid>https://dev.to/codefreshio/code-coverage-reports-using-codacy-and-codefresh-1pdc</guid>
      <description>&lt;p&gt;Where do you usually track your code coverage? If you are not sure about the answer to this question or you would like to explore other options to the ones that you are currently using, then this post is for you.&lt;/p&gt;

&lt;p&gt;Specifically, this post details how you can use &lt;a href="https://www.codacy.com/" rel="noopener noreferrer"&gt;Codacy&lt;/a&gt; in your Codefresh pipeline to create and send coverage reports of your repository with every pipeline build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image6.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage6-300x146.png" alt="Codacy Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To follow along, make sure to have a &lt;a href="https://www.codacy.com/" rel="noopener noreferrer"&gt;Codacy&lt;/a&gt; and a&lt;a href="https://codefresh.io/codefresh-signup/" rel="noopener noreferrer"&gt; Codefresh account.&lt;/a&gt; If not, &lt;a href="https://codefresh.io/codefresh-signup/?utm_source=Blog&amp;amp;utm_medium=Post&amp;amp;utm_campaign=codacy" rel="noopener noreferrer"&gt;now is the time to set-up a fresh account for free&lt;/a&gt;!&lt;/p&gt;

&lt;h1&gt;Codacy Overview&lt;/h1&gt;

&lt;p&gt;Codacy is a code review tool that allows for automatic analysis, code coverage tracking, and extensive reports that allow you and your team to improve your code quality over time.&lt;/p&gt;

&lt;p&gt;The goals of Codacy is to provide insights on&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;How is your code quality today and&lt;/li&gt;
    &lt;li&gt;How is your code quality evolving over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional features include:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;User management: Mirroring GitHub permissions&lt;/li&gt;
    &lt;li&gt;Extensive configuration&lt;/li&gt;
    &lt;li&gt;Additional integration with other tools, such as notifications&lt;/li&gt;
    &lt;li&gt;Receive analysis reports per file&lt;/li&gt;
    &lt;li&gt;Depending on the standards that your team wants to enforce, you can add additional parameters such as coverage thresholds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Codacy has a &lt;a href="https://www.codacy.com/pricing" rel="noopener noreferrer"&gt;free version&lt;/a&gt;, a pro version, and an on-premises version. The latter two have a free trial, which allows you to test all features over the course of two weeks. You can sign-up via GitHub, Bitbucket, or GitLab.&lt;/p&gt;

&lt;p&gt;It supports over &lt;a href="https://docs.codacy.com/getting-started/supported-languages-and-tools/" rel="noopener noreferrer"&gt;30 different languages&lt;/a&gt;. In our example, we'll be using TypeScript. If you would like to follow along with a different language make sure it is supported by Codacy.&lt;/p&gt;

&lt;p&gt;When you log into Codacy for the first time, it will ask you to &lt;a href="https://docs.codacy.com/getting-started/getting-started-with-codacy/#add-repositories" rel="noopener noreferrer"&gt;provide access to a repository.&lt;/a&gt; At this stage, Codacy will not download any code from your repository but merely access its names. You can then either provide access to selective repositories or your entire Git repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image10.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage10-300x205.png" alt="Select Git repository in Codacy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After adding a repository, it will automatically update the information recorded about your application in the Dashboard. Codacy’s UI has the following taps:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;The &lt;a href="https://docs.codacy.com/repositories/repository-dashboard/" rel="noopener noreferrer"&gt;Dashboard&lt;/a&gt; with an overview of issues and code coverage reports&lt;/li&gt;
    &lt;li&gt;The &lt;a href="https://docs.codacy.com/repositories/commits-view/" rel="noopener noreferrer"&gt;Commits&lt;/a&gt;, which provides a history of all commits that are associated with this repository&lt;/li&gt;
    &lt;li&gt;The &lt;a href="https://docs.codacy.com/repositories/files-view/" rel="noopener noreferrer"&gt;Files&lt;/a&gt; within the repository and their respective issues&lt;/li&gt;
    &lt;li&gt;The &lt;a href="https://docs.codacy.com/repositories/issues-view/" rel="noopener noreferrer"&gt;issues&lt;/a&gt; that Codacy identified in our repository&lt;/li&gt;
    &lt;li&gt;Open Pull requests&lt;/li&gt;
    &lt;li&gt;And lastly, as part of the pro features, users can set-up security alerts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will stick for now with the Dashboard tap.&lt;/p&gt;

&lt;p&gt;As you might be able to tell, the Dashboard does not have access to code coverage reports by default. The next section will provide a guide on connecting Codacy to your code coverage reports.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image8.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage8-300x157.png" alt="Codacy Dashboard without code coverage reports set-up"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Set-up Codacy&lt;/h1&gt;

&lt;p&gt;To connect Codacy either to our local set-up or to Codefresh, we need an API token. The token can be accessed through the taps in the project. For this, select your project =&amp;gt; go to settings =&amp;gt; integrations =&amp;gt; add integration =&amp;gt; select “Project API”. Make sure that you select the API token from here and not your general project settings:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image7.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage7-300x137.png" alt="Access project token"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we are going to prepare our project. In our case, we are using a simple &lt;a href="https://github.com/codefresh-contrib/codacy-sample-app" rel="noopener noreferrer"&gt;Typescript application&lt;/a&gt; and uses &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;jest&lt;/a&gt; to produce coverage reports.&lt;/p&gt;

&lt;pre&gt;git clone git@github.com:anais-codefresh/codacy-sample-app.git

# now cd into the cloned repository
cd codacy-sample-app
&lt;/pre&gt;

&lt;p&gt;You should then find yourself in the following project structure:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image3.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage3.png" alt="Example application project structure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To run the application, you can use the following commands:&lt;/p&gt;

&lt;pre&gt;npm install
npm run build
&lt;/pre&gt;

&lt;p&gt;And to test:&lt;/p&gt;

&lt;pre&gt;npm run test
&lt;/pre&gt;

&lt;p&gt;This should produce the following test coverage report:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image1.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage1-300x183.png" alt="Coverage Report with jest"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we have our testing and coverage reports set-up, we can push our changes to our Git repository.&lt;/p&gt;

&lt;h1&gt;Set-up Codefresh&lt;/h1&gt;

&lt;p&gt;The previous section showed how we can set-up our node project with code coverage reports. However, that would not be scalable to continue across machines, versions, or our application, and team members. In this section, we will set-up our Codefresh pipeline to push our code coverage reports to Codacy automatically.&lt;/p&gt;

&lt;p&gt;To follow this section, please have your &lt;a href="https://codefresh.io/codefresh-signup/" rel="noopener noreferrer"&gt;Codefresh account&lt;/a&gt; ready! And integrate with a container registry e.g. Docker Hub or the GitHub container registry.&lt;/p&gt;

&lt;p&gt;Once we enter the Codefresh platform, we want to create a new Pipeline. Make sure to select the repository in which we set-up our coverage reports:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image5.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage5.png" alt="Create new Codefresh Pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pipeline will come with a basic codefresh.yml file. If you are following along, make sure to delete everything that is in the current inline YAML. If you are using your existing pipeline, the next section will show you how to modify the YAML to integrate with Codacy. In the end, we will have the following pipeline:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image4.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage4-300x170.png" alt="Codefresh pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To use Codacy, we will have to modify our pipeline to generate the code coverage reports and then push those to our Codacy account. First, we are going to run our tests inside a node image and then connect to Codacy. Our full pipeline will look as such:&lt;br&gt;
&lt;/p&gt;

&lt;pre&gt;version: "1.0"
# Stages can help you organize your steps in stages
stages:
  - "clone"
  - "build"
  - "test"

steps:
  clone:
    title: "Cloning repository"
    type: "git-clone"
    repo: "codefresh-contrib/codecov-sample-app"
    # CF_BRANCH value is auto set when pipeline is triggered
    # Learn more at codefresh.io/docs/docs/codefresh-yaml/variables/
    revision: "${{CF_BRANCH}}"
    git: "github"
    stage: "clone"

  build:
    title: "Building Docker image"
    type: "build"
    image_name: "codefresh-contrib/codecov-sample-app"
    working_directory: "${{clone}}"
    tag: "${{CF_BRANCH_TAG_NORMALIZED}}"
    dockerfile: "Dockerfile"
    stage: "build"

  tests:
      title: "Running test"
      type: "freestyle"
      working_directory: '${{clone}}'
      arguments:
        image: 'node:15.2'
        commands:
          - "npm install --save-dev jest"
          - "npm run test"
      stage: "test"

  codacy:
        title: "Pushing reports to codacy"
        type: "freestyle"
        working_directory: '${{clone}}'
        arguments:
          image: 'alpine:3.8'
          commands:
            - "export CODACY_PROJECT_TOKEN=${{CODACY_PROJECT_TOKEN}}"
            - "wget -qO - https://coverage.codacy.com/get.sh | sh"
        stage: "test"
&lt;/pre&gt;

&lt;p&gt;&lt;br&gt;
Make sure to&lt;br&gt;
Change image_name in the build step to your image name in the following format:&lt;br&gt;
Container-registry/image-name,&lt;br&gt;
Change the tag of the image to fit your tag,&lt;br&gt;
And lastly, replace the image and the commands in the “tests” stage to use the commands of your repository to run tests and create coverage-reports.&lt;/p&gt;

&lt;p&gt;The last step, called “codacy” in this case, is responsible for running the Codacy script. To set the env variable, we are going to export our Codacy project token and add the token in the toolbar that you can find on the right of the UI. Once the variable is called through the Codefresh YAML syntax, it will automatically use the value provided within the variables section. Note that you could also provide your token directly in the YAML; however, once we add the pipeline to our git repository, we do not want to worry about accidentally exposing secrets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image9.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage9.png" alt="Codefresh variables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once added, we can save and run our pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image4.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage4-300x170.png" alt="Codefresh pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can follow the execution of the pipeline in the output section. The next time that we commit to our repository, a new coverage report will be generated and pushed to our Codacy account through our Codefresh pipeline.&lt;/p&gt;

&lt;h1&gt;View the reports in Codacy&lt;/h1&gt;

&lt;p&gt;Now we can head over to our Codacy account and see the updated data:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image6.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage6-300x146.png" alt="Codacy Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecting the files tap and a specific file to analyze we can find more information on our code quality:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2021/01/image2.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2021%2F01%2Fimage2-300x163.png" alt="Code analysis within Codacy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Let’s Recap&lt;/h1&gt;

&lt;p&gt;Codacy provides a fast way to integrate code coverage into your Codefresh pipeline. It supports over 30 different languages and an extensive dashboard that also displays information on issues, PRs, and your commit history.&lt;/p&gt;

&lt;p&gt;In this tutorial, we set-up coverage reports in our node application, set-up our project in Codacy, and create a Codefresh pipeline with two additional steps.&lt;/p&gt;

&lt;p&gt;If you are new to Codefresh, &lt;a href="https://codefresh.io/codefresh-signup/?utm_source=Blog&amp;amp;utm_medium=Post&amp;amp;utm_campaign=codacy" rel="noopener noreferrer"&gt;now is the time to set-up a fresh account for free&lt;/a&gt;! Also, &lt;a href="https://community.codefresh.io/" rel="noopener noreferrer"&gt;do join our forum&lt;/a&gt; and ask away if you have any questions.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>testing</category>
      <category>codacy</category>
      <category>coverage</category>
    </item>
    <item>
      <title>#12 DevOps Diary: Computer Science and K8s resources</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Sun, 10 Jan 2021 16:28:53 +0000</pubDate>
      <link>https://dev.to/urlichsanais/12-devops-diary-computer-science-and-k8s-resources-iaj</link>
      <guid>https://dev.to/urlichsanais/12-devops-diary-computer-science-and-k8s-resources-iaj</guid>
      <description>&lt;p&gt;Welcome beautiful people! &lt;/p&gt;

&lt;p&gt;I hope you are all doing well. I was really excited to write this week's newsletter and share these amazing resources with you. I hope you like them/find them interesting 😊&lt;/p&gt;

&lt;p&gt;Remember, if you discover anything that you would like to share, just message me, &lt;a href="https://anaisurl.com/contact"&gt;I would love to hear from you.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's get started ⛳&lt;/p&gt;

&lt;h2&gt;
  
  
  Top Kubernetes Learning Resources 📖
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes has &lt;a href="https://kubernetes.io/docs/reference/kubectl/cheatsheet/"&gt;several interactive tutorials&lt;/a&gt; on their Documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's stay on the practical resources, these websites provide great example projects to learn Kubernetes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://katacoda.com/courses/kubernetes"&gt;katacoda: Learn Kubernetes using Interactive Browser-Based Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetesbyexample.com/"&gt;Kubernetes by example&lt;/a&gt;; by Red Hat OpenShift&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Videos🎥
&lt;/h2&gt;

&lt;p&gt;Under the theme "You can learn anything", &lt;a href="https://www.youtube.com/channel/UCb4mfRT5UWpjoUQRcIE2qOQ?sub_confirmation=1"&gt;I am currently doing #100DaysOfKubernetes&lt;/a&gt;. If you enjoy this newsletter, chances are high that you would get lots of value from my current and upcoming videos. Have a look 😊&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://blog.anaisurl.com/12-devops-diary-computer-science-and-k8s-resources/"&gt;Have a look at the full newsletter here&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>devops</category>
      <category>newsletter</category>
      <category>kubernetes</category>
      <category>docker</category>
    </item>
    <item>
      <title>#11 DevOps Diary: Let's kick off 2021🎉</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Sun, 03 Jan 2021 16:17:07 +0000</pubDate>
      <link>https://dev.to/urlichsanais/11-devops-diary-let-s-kick-off-2021-pgh</link>
      <guid>https://dev.to/urlichsanais/11-devops-diary-let-s-kick-off-2021-pgh</guid>
      <description>&lt;p&gt;Welcome beautiful people! &lt;/p&gt;

&lt;p&gt;First of all, congratulations! Congratulations for making it through 2020. It was certainly a tough year for most of us and while we focus on expanding our tech skills and collaborating on tech projects, we shall not forget that we are all human with emotions and human struggles. Let's be kind to each other and support each other throughout 2021.&lt;/p&gt;

&lt;p&gt;Happy New Year! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Top Learning Resources 📖
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you would like to learn more about the fundamentals of Computer Science, &lt;a href="https://teachyourselfcs.com/"&gt;this website&lt;/a&gt; provides a comprehensive list of high quality resources, including lectures, e-books and more.&lt;/li&gt;
&lt;li&gt;Are you currently preparing for your &lt;a href="https://training.linuxfoundation.org/certification/certified-kubernetes-security-specialist/"&gt;CKS Exam&lt;/a&gt;? &lt;a href="https://itnext.io/cks-exam-series-1-create-cluster-security-best-practices-50e35aaa67ae"&gt;This exam serie&lt;/a&gt;s by &lt;a href="https://twitter.com/_killer_shell"&gt;Killer Shell&lt;/a&gt; provides practice questions and answers in video format.&lt;/li&gt;
&lt;li&gt;Kubernetes Resource thread by &lt;a href="https://twitter.com/danielepolencic"&gt;Daniele Polencic&lt;/a&gt;, &lt;a href="https://twitter.com/danielepolencic/status/1343478164836634625"&gt;sharing his 2020 learning journey&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Videos🎥
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Get started contributing to open source projects in 2021. Contributing to open source is a great way to contribute to real world projects and to expand your skills. I would highly recommend the &lt;a href="https://www.youtube.com/channel/UC5mnBodB73bR88fLXHSfzYA"&gt;content by Eddie Jaoude&lt;/a&gt; to get stated 🙌🏼&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://blog.anaisurl.com/11-devops-diary/"&gt;You can view the entire newsletter here&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>#10 DevOps Diary: #100DaysOfKubernetes Let's go</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Sun, 27 Dec 2020 17:07:24 +0000</pubDate>
      <link>https://dev.to/urlichsanais/10-devops-diary-100daysofkubernetes-let-s-go-4khc</link>
      <guid>https://dev.to/urlichsanais/10-devops-diary-100daysofkubernetes-let-s-go-4khc</guid>
      <description>&lt;p&gt;Hey everyone,&lt;/p&gt;

&lt;p&gt;I hope you are doing well and thank you for joining me to week 10 of the DevOps Diary newsletter 🎉&lt;/p&gt;

&lt;p&gt;If you are celebrating Christmas, I hope you have/had a lovely time. &lt;/p&gt;

&lt;p&gt;Now for the news that I mentioned in my last newsletter, here it comes:&lt;/p&gt;

&lt;h2&gt;
  
  
  The News 📢
&lt;/h2&gt;

&lt;p&gt;In this week's newsletter, I would like to share with you my new challenge:&lt;/p&gt;

&lt;p&gt;✨#&lt;strong&gt;100DaysOfKubernetes&lt;/strong&gt; ✨&lt;/p&gt;

&lt;p&gt;My goal is to learn something new about Kubernetes each day. Every day (except weekends), I will be posting a video on my YouTube about the new content that I came across.&lt;/p&gt;

&lt;p&gt;I would love for you to join me on this challenge. If you have any suggestions on what I should spend some time learning, please do let me know. &lt;/p&gt;

&lt;p&gt;My goal is to inspire others to start exploring topics they are interested in; whether those are related to DevOps or not, there is so much to learn and to explore.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCb4mfRT5UWpjoUQRcIE2qOQ?sub_confirmation=1"&gt;Follow my journey on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.notion.so/researchandstudy/DevOps-Diary-2e5c82e48d374442858fc8295070a4b8"&gt;All of my notes on my public notion page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anaisurl.com/contact"&gt;Reach out to get involved or with suggestions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And now to this week's content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Podcast 🎤
&lt;/h2&gt;

&lt;p&gt;StackRox launched a &lt;a href="https://www.stackrox.com/post/2020/12/screaming-in-the-cloud-eliminating-security-risks-in-kubernetes/"&gt;Kubernetes-focused podcast: ‘Screaming in the Cloud’&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first episode is focused on Eliminating Security Risks in Kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://blog.anaisurl.com/10-devops-diary/"&gt;Read the full newsletter here&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>devops</category>
      <category>100daysofkubernetes</category>
      <category>kubernetes</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Code Coverage Analysis Using Codecov and Codefresh</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Tue, 22 Dec 2020 16:08:26 +0000</pubDate>
      <link>https://dev.to/codefreshio/code-coverage-analysis-using-codecov-and-codefresh-16h2</link>
      <guid>https://dev.to/codefreshio/code-coverage-analysis-using-codecov-and-codefresh-16h2</guid>
      <description>&lt;p&gt;&lt;a href="https://coveralls.io/" rel="noopener noreferrer"&gt;Coveralls&lt;/a&gt; is a web service that allows users to track the code coverage of their application over time in order to optimize the effectiveness of their unit tests.&lt;/p&gt;

&lt;p&gt;Once you are managing your application and associated resources within a CI/CD platform like Codefresh, you want to receive insights on the test coverage automatically with every pipeline build.&lt;/p&gt;

&lt;p&gt;This post provides an overview of how this can be achieved with Coveralls and Codefresh. To make the best out of this post, make sure you have both a &lt;a href="https://docs.coveralls.io/" rel="noopener noreferrer"&gt;Coveralls&lt;/a&gt; and a &lt;a href="https://codefresh.io/docs/docs/getting-started/create-a-codefresh-account/" rel="noopener noreferrer"&gt;Codefresh account&lt;/a&gt; set-up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image1.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage1-294x300.png" alt="coveralls interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Overview of Coveralls&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Coveralls has several features that allow you to optimize the coverage of your repositories, analyze trends, and see how changes in specific files have affected the overall project over time.&lt;/p&gt;

&lt;p&gt;Some of the advantages of running code coverage reports with Coveralls:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Set it up once and receive additional insight from code coverage reports with every build&lt;/li&gt;
    &lt;li&gt;Coveralls support &lt;a href="https://docs.coveralls.io/about-coveralls" rel="noopener noreferrer"&gt;22 different language integrations&lt;/a&gt;
&lt;/li&gt;
    &lt;li&gt;Access detailed information on the coverage of every file; Coveralls breaks down the information per file for additional insights&lt;/li&gt;
    &lt;li&gt;The updates page, integrated within the UI, provides additional information on how individual commits to your project have accepted the code coverage&lt;/li&gt;
    &lt;li&gt;Add a nice coverage badge to your project read-me to show everyone how well written your code is&lt;/li&gt;
    &lt;li&gt;Little plus point: The maintainers behind Coveralls show their humour in the documentation (what jokes can you spot?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Separately, Coveralls has a pretty comprehensive &lt;a href="https://coveralls.io/pricing" rel="noopener noreferrer"&gt;pricing model&lt;/a&gt;; whereby open-source projects are free. We have found that coveralls integrates seamlessly with our projects.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Let’s get started&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Once signed-up to Coveralls, you will have to provide Coveralls with a git provider to access your repositories. The integration is required to generate repository-specific access tokens that will allow us to push the coverage reports to Coveralls. Ideally, you are using the same git provider in Coveralls as in Codefresh. If you are using the normal account, you can choose between either of the following git providers: GitHub, GitLab, or BitBucket. The enterprise account supports further options.&lt;/p&gt;

&lt;p&gt;In this example, we are going to be using Coveralls in &lt;a href="https://github.com/anais-codefresh/coveralls-sample-app" rel="noopener noreferrer"&gt;this node application&lt;/a&gt;. However, you could use your own application, as long as it is &lt;a href="https://docs.coveralls.io/about-coveralls" rel="noopener noreferrer"&gt;supported by Coveralls.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First, we have to make sure that our application is set-up correctly with a testing tool that produces coverage reports. To demonstrate the set-up we will first generate test coverage reports manually in our local environment and then optimize the process with Codefresh so that a coverage report is generated automatically with every pipeline build.&lt;/p&gt;

&lt;p&gt;In our case, we are going to use &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;jest&lt;/a&gt;. Alternatively, you could use Mocha in combination with several tools; more information is provided &lt;a href="https://github.com/nickmerwin/node-coveralls" rel="noopener noreferrer"&gt;in their example&lt;/a&gt;. Have a look at their documentation for other languages to get an idea of which testing tools are supported.&lt;/p&gt;

&lt;h4&gt;&lt;b&gt;Set-up testing and code coverage reports in our node repository&lt;/b&gt;&lt;/h4&gt;

&lt;p&gt;If your Node project does not have a testing tool installed, install jest:&lt;/p&gt;

&lt;pre&gt;npm install --save-dev jest&lt;/pre&gt;

&lt;p&gt;Next, we are going to add a file, called jest.config.js to our root project folder with the following content:&lt;/p&gt;

&lt;pre&gt;module.exports = {
 preset: 'ts-jest',
 testEnvironment: 'node',
};
&lt;/pre&gt;

&lt;p&gt;To complete the configuration, we are going to add the following lines to our package.json file:&lt;/p&gt;

&lt;pre&gt;"jest": {
   "coverageDirectory": "./coverage/",
   "collectCoverage": true
 },
&lt;/pre&gt;

&lt;p&gt;And add a script to run jest:&lt;/p&gt;

&lt;pre&gt;"scripts": {
   "test": "jest --coverage",
&lt;/pre&gt;

&lt;p&gt;Now, when you run ’npm run test’, you should see an output similar to the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image7.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage7-300x171.png" alt="test coverage output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once our application produces coverage reports, we have to add coveralls to our packages:&lt;/p&gt;

&lt;pre&gt;npm install coveralls --save-dev&lt;/pre&gt;

&lt;p&gt;Coveralls requires a &lt;a href="https://github.com/nickmerwin/node-coveralls" rel="noopener noreferrer"&gt;script&lt;/a&gt; that takes standard input and sends it to coveralls.io to report your code coverage. Depending on the framework that you are using, you will have to add a different script to your application.&lt;/p&gt;

&lt;p&gt;Any coverage reports can be forwarded that are within a lcov data format (including&lt;a href="https://mochajs.org/" rel="noopener noreferrer"&gt; mocha&lt;/a&gt;'s&lt;a href="https://npmjs.org/package/mocha-lcov-reporter" rel="noopener noreferrer"&gt; LCOV reporter&lt;/a&gt;). For this, we are going to set-up a “bin” folder, and within the folder a coveralls.js file that contains the following content:&lt;/p&gt;

&lt;pre&gt;#!/usr/bin/env node
 
'use strict';
 
const { handleInput } = require('..');
 
process.stdin.resume();
process.stdin.setEncoding('utf8');
 
let input = '';
 
process.stdin.on('data', chunk =&amp;gt; {
 input += chunk;
});
 
process.stdin.on('end', () =&amp;gt; {
 handleInput(input, err =&amp;gt; {
   if (err) {
     throw err;
   }
 });
});
&lt;/pre&gt;

&lt;p&gt;Lastly, we will have to change our testing script:&lt;/p&gt;

&lt;pre&gt;"test": "jest --coverage &amp;amp;&amp;amp; coveralls &amp;lt; coverage/lcov.info",&lt;/pre&gt;

&lt;p&gt;Again, for further information on how to set-up Coveralls on your testing framework, please refer to their examples.&lt;/p&gt;

&lt;h4&gt;&lt;b&gt;Set environment variables to connect to Coveralls&lt;/b&gt;&lt;/h4&gt;

&lt;p&gt;If you don’t have a Coveralls account yet, &lt;a href="https://docs.coveralls.io/" rel="noopener noreferrer"&gt;now is the time to set-one up&lt;/a&gt;. Once you are signed into Coveralls, you should either see a list of already connected repositories (like in my case), or an empty dashboard.&lt;/p&gt;

&lt;p&gt;One last thing that we have to do before running the coverage report and sending it to Coveralls is to define the environment variables. Those will also become useful once we are using Coveralls in Codefresh.&lt;/p&gt;

&lt;pre&gt;export COVERALLS_SERVICE_NAME="codefresh"
export COVERALLS_GIT_BRANCH="insert the branch that you will be using with your application"
export COVERALLS_REPO_TOKEN="insert the secret repo token from coveralls.io"
&lt;/pre&gt;

&lt;p&gt;Like so:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image3.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage3-300x21.png" alt="coveralls env variables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Connect your repository in Coveralls and receive a secret repository token&lt;/h4&gt;

&lt;p&gt;To create the secret repository token, head over to your Coveralls account and add the current repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image4.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage4-300x133.png" alt="add repository "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you turn on any of the repositories (box on the left side next to the repository), you will enable tracking of code coverage reports. It is then that you will see the secret repository token that has to be used within the environment variable above.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Connect your local instance with Coveralls&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;If you have been following along, go ahead and call the tests:&lt;/p&gt;

&lt;pre&gt;npm run test&lt;/pre&gt;

&lt;p&gt;Now refresh the Coveralls site of your repository to see the Code Coverage reports.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image6.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage6-300x297.png" alt="Connection with Coveralls manually"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To unlock the full benefits of using Coveralls and to submit coverage reports automatically with every build, we are now setting up our Codefresh pipeline to do the work for us.&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Using Coveralls in your Pipeline&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;You know the drill, if you don’t have a Codefresh account yet, let’s go ahead and &lt;a href="https://codefresh.io/docs/docs/configure-ci-cd-pipeline/pipelines/" rel="noopener noreferrer"&gt;create your free one&lt;/a&gt;. Once signed in, you should be able to create a project and within the project, we will now create our pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image2.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage2-271x300.png" alt="create a new pipeline"&gt;&lt;/a&gt;&lt;br&gt;
Once you ’create’ the pipeline, a standard codefresh.yml file is generated with three steps:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;The first step will clone your repository;&lt;/li&gt;
    &lt;li&gt;The second step will both, build and push your repository to the container registry &lt;a href="https://codefresh.io/docs/docs/getting-started/create-a-basic-pipeline/#connecting-your-docker-registry-to-codefresh" rel="noopener noreferrer"&gt;that you have connected with Codefresh&lt;/a&gt;;&lt;/li&gt;
    &lt;li&gt;And the third step currently does not do much.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thus, let’s go ahead and modify it.&lt;/p&gt;

&lt;pre&gt;

  test:
    title: "Running test"
    type: "freestyle" # Run any command
    image: "node:15.2" # The image in which command will be executed
    working_directory: "${{clone}}" # Running command where code cloned
    commands:
      - "export COVERALLS_SERVICE_NAME=${{COVERALLS_SERVICE_NAME}}"
      - "export COVERALLS_GIT_BRANCH=${{CF_BRANCH}}"
      - "export COVERALLS_REPO_TOKEN=${{COVERALLS_REPO_TOKEN}}"
      - "npm install --save-dev jest"
      - "npm run test"
    stage: "test"

&lt;/pre&gt;

&lt;p&gt;For reference, you can find the &lt;a href="https://github.com/codefresh-contrib/coveralls-sample-app/blob/master/codefresh.yml" rel="noopener noreferrer"&gt;entire pipeline in the git repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As you can see, we specify several variables within this step. Those, which start with ’CF’ are Codefresh-specific steps and the value is automatically provided by Codefresh once you run the pipeline.&lt;/p&gt;

&lt;p&gt;However, we have to tell Codefresh Coveralls specific variables. You could place the values directly within the step; however, since the secret repository access token should not get accidentally pushed to your public git repository, we will provide the variables within the variables section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image10.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage10.png" alt="codefresh variables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s go ahead and run the pipeline. You can view the steps and commands executing within the output section of the pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image9.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage9-300x167.png" alt="Codefresh pipeline"&gt;&lt;/a&gt;&lt;br&gt;
Moving over to Coveralls, we can now see our code coverage report.&lt;br&gt;
&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image1.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage1-294x300.png" alt="coveralls interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Let’s Recap&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;In this post, we&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;First saw an introduction to Coveralls, its features, and use cases;&lt;/li&gt;
    &lt;li&gt;Then, we prepared our git repository;&lt;/li&gt;
    &lt;li&gt;We set up our Coveralls and our Codefresh Account;&lt;/li&gt;
    &lt;li&gt;Set-up our Codefresh pipeline;&lt;/li&gt;
    &lt;li&gt;And lastly, ran our tests within Codefresh and pushed the coverage reports to Coveralls!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To connect Codefresh to Coveralls through your pipeline &lt;a href="https://codefresh.io/codefresh-signup/?utm_source=Blog&amp;amp;utm_medium=Post&amp;amp;utm_campaign=coveralls" rel="noopener noreferrer"&gt;Create Your Free Codefresh Account today&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;As a bonus, we are going to &lt;strong&gt;add our Coveralls code coverage button to our README&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To do so, you can access various formats directly from the Coveralls UI, within your repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image8.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage8-300x211.png" alt="Add badge to your repository"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding it to our README, and tadaa:&lt;br&gt;
&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/image5.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodefresh.io%2Fwp-content%2Fuploads%2F2020%2F12%2Fimage5-300x144.png" alt="add badge to your repository"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>reports</category>
      <category>container</category>
      <category>coverage</category>
    </item>
    <item>
      <title>#9 DevOps Diary: Tips and Tricks</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Fri, 18 Dec 2020 14:16:54 +0000</pubDate>
      <link>https://dev.to/urlichsanais/9-devops-diary-tips-and-tricks-10jk</link>
      <guid>https://dev.to/urlichsanais/9-devops-diary-tips-and-tricks-10jk</guid>
      <description>&lt;p&gt;Welcome beautiful people! &lt;/p&gt;

&lt;p&gt;Can you believe that this is already week 9! I have something special prepared for next week, so make sure to stay tuned for that. &lt;/p&gt;

&lt;p&gt;In the meantime, we will look at more Kubernetes resources and some great video tutorials and talks that I came across within the past days.&lt;/p&gt;

&lt;h2&gt;
  
  
  Videos🎥
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/qqc3k5Ym1tA"&gt;Red Hat Says Farewell to CentOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/ezX4D1ZK5mA"&gt;How to install Nginx Ingress Controller in Helm 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/yIAa5wHsfw4"&gt;Kelsey, Kubernetes, and GitOps - GitHub Universe 2020&lt;/a&gt; — Kelsey Hightower's presentation at GitHub Universe&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/PM1LUZi8yLE"&gt;5 Simple Tips for Troubleshooting Your Kubernetes Pods&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Blog Posts (and other written content)🗞️
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Get started with Chaos engineering; &lt;a href="https://github.com/litmuschaos/litmus"&gt;specifically with Litmus&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A lot of times we learn about concepts and tools so fast, that we miss out on the basics — &lt;a href="https://medium.com/binbash-inc/when-and-why-use-multiple-k8s-namespaces-237b632bac5"&gt;here is a nice article on Kubernetes namespaces&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://blog.anaisurl.com/9-devops-diary-podcasts-kubernetes/"&gt;View the entire newsletter here&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>devops</category>
      <category>tutorial</category>
      <category>newsletter</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>#8 DevOps Diary: No more Docker?</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Sun, 13 Dec 2020 15:48:57 +0000</pubDate>
      <link>https://dev.to/urlichsanais/8-devops-diary-no-more-docker-434n</link>
      <guid>https://dev.to/urlichsanais/8-devops-diary-no-more-docker-434n</guid>
      <description>&lt;p&gt;Hey everyone, I hope you have/are having a lovely day and Welcome to week 8 🥳&lt;/p&gt;

&lt;p&gt;This week's newsletter is out later than usual since life kind of got in the way. I hope you enjoy it anyway and you are having a great Sunday.&lt;/p&gt;

&lt;h2&gt;
  
  
  News 📣
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/"&gt;Kubernetes is dropping Docker support&lt;/a&gt; — don't freak out. Unless you have a self-managed cluster, it likely does not affect your use of Kubernetes nor your Kubernetes workflow. &lt;/p&gt;

&lt;h2&gt;
  
  
  What does this mean ❓
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/7KUdmFyefSA"&gt;Video Explanation&lt;/a&gt; by TechWorld with Nana "Kubernetes is dropping Docker support - What does it mean for YOU?"&lt;/li&gt;
&lt;li&gt;Let's have a look at some of the alternatives that you can use to Docker — &lt;a href="https://codefresh.io/devops/docker-images-without-docker-practical-guide/"&gt;Docker images without Docker&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Blog Posts (and other written content)🗞️
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adding to &lt;a href="https://blog.anaisurl.com/7-devops-diary/"&gt;#7 of this newsletter&lt;/a&gt;; some amazing people have started collections of free resources on GitHub to help you prepare for the CNCF &lt;a href="https://github.com/walidshaari/Certified-Kubernetes-Security-Specialist"&gt;Certified Kubernetes Security Specialist&lt;/a&gt; - CKS (or just to learn cool stuff about security)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/flant-com/configmaps-in-kubernetes-f9f6d0081dcb"&gt;ConfigMaps in Kubernetes: how they work and what you should remember&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://blog.anaisurl.com/8-devops-diary/"&gt;View the full newsletter on my Blog&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>tutorial</category>
      <category>news</category>
    </item>
    <item>
      <title>Using the DigitalOcean Container Registry with Codefresh</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Wed, 09 Dec 2020 10:58:41 +0000</pubDate>
      <link>https://dev.to/codefreshio/using-the-digitalocean-container-registry-with-codefresh-11bf</link>
      <guid>https://dev.to/codefreshio/using-the-digitalocean-container-registry-with-codefresh-11bf</guid>
      <description>&lt;p&gt;DigitalOcean has &lt;a href="https://www.digitalocean.com/blog/container-registry-generally-available/"&gt;just announced the DigitalOcean Container Registry,&lt;/a&gt; which is directly integrated into the DigitalOcean Dashboard. While you can use any Container Registry in your DigitalOcean resources, the goal of the Container Registry is to provide for easy connection between the Container Registry and &lt;a href="https://www.digitalocean.com/products/kubernetes/"&gt;DigitalOcean Kubernetes&lt;/a&gt; resources.&lt;/p&gt;

&lt;p&gt;DigitalOcean Container Registry Dashboard&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/digital-ocean-registry.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aQd1-zuj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2020/12/digital-ocean-registry.png" alt="digital-ocean-registry"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whether you have already integrated DigitalOcean cloud resources into your Codefresh pipelines or not, you could use the DigitalOcean Container Registry like any &lt;a href="https://codefresh.io/docs/docs/integrations/docker-registries/"&gt;other container registry&lt;/a&gt; in your Codefresh Pipeline.&lt;/p&gt;

&lt;h1&gt;Overview&lt;/h1&gt;

&lt;p&gt;The DigitalOcean Container Registry provides:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Three&lt;a href="https://www.digitalocean.com/docs/container-registry/#plans-and-pricing"&gt; subscription plans&lt;/a&gt; that offer different allowances for repositories, storage, and bandwidth&lt;/li&gt;
    &lt;li&gt;1-click method to&lt;a href="https://www.digitalocean.com/docs/container-registry/how-to/use-registry-docker-kubernetes/#add-secret-control-panel"&gt; configure DigitalOcean Kubernetes Cluster to use the registry&lt;/a&gt;
&lt;/li&gt;
    &lt;li&gt;
&lt;a href="https://www.digitalocean.com/docs/container-registry/how-to/clean-up-container-registry/"&gt;Garbage collection&lt;/a&gt; using the command line or the API&lt;/li&gt;
    &lt;li&gt;Ability to see the current storage usage in the control panel&lt;/li&gt;
    &lt;li&gt;Automatic global load balancing across caching endpoints in multiple geographic regions&lt;/li&gt;
    &lt;li&gt;Ability to store any artifact that is compatible with OCI-based registries, such as&lt;a href="https://helm.sh/docs/topics/registries/"&gt; Helm charts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Furthermore, the DigitalOcean Container Registry is not just for containers. It allows users to store any artifacts that are compatible with the OCI specifications. This allows you to keep Helm Charts in your DigitalOcean Container Registry (note that&lt;a href="https://helm.sh/docs/topics/registries/"&gt; Helm’s OCI support is still experimental&lt;/a&gt;).&lt;/p&gt;

&lt;h1&gt;Building and pushing a Container image with DigitalOcean and Codefresh&lt;/h1&gt;

&lt;p&gt;The set-up will only take 4 steps, assuming that you have a&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href="https://www.digitalocean.com/"&gt;DigitalOcean Account&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Codefresh Account -- If not &lt;a href="https://codefresh.io/codefresh-signup/?utm_source=Blog&amp;amp;utm_medium=Post&amp;amp;utm_campaign=digitaloceanregistry"&gt;Create Your Free Account today&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First, we have to set-up our Container Registry in DigitalOcean. This can be done by opening your account and accessing the “Container Registry” section:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/container-registry-ui.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sn8iIFaT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2020/12/container-registry-ui-1024x467.png" alt="container-registry-ui"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since we are already in DigitalOcean, we can go ahead and create our access token. Open &lt;b&gt;API&lt;/b&gt; in the bottom left of the Account page (below Settings). And create a new token at &lt;b&gt;Tokens/Keys. &lt;/b&gt;The token needs to have both read and write permissions. Make sure to take note of the token since we will need it in the next step.&lt;/p&gt;

&lt;p&gt;Now we can add the DigitalOcean Container registry to our &lt;a href="https://g.codefresh.io/account-admin/account-conf/integration/registryNew"&gt;Docker registries&lt;/a&gt; in Codefresh. For this, &lt;a href="https://g.codefresh.io/account-admin/account-conf/integration/registryNew"&gt;open&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Codefresh Account =&amp;gt; Account Settings (bottom left) =&amp;gt; Docker Registries =&amp;gt; Integrations =&amp;gt; Docker Registries =&amp;gt; Add Registry Provider =&amp;gt; Other Registries&lt;/p&gt;

&lt;p&gt;This should get you to the following screen. As you can see, Codefresh supports a variety of Container Registries:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/Codefresh-registry-settings.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RotbDmJx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2020/12/Codefresh-registry-settings-1024x529.png" alt="Codefresh-registry-settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we have to provide the configuration information for the DigitalOcean Container Registry. For this, you will need our &lt;a href="https://www.digitalocean.com/docs/apis-clis/api/create-personal-access-token/"&gt;DigitalOcean Access Token&lt;/a&gt;. The token is used &lt;a href="https://www.digitalocean.com/docs/container-registry/how-to/set-up-ci-cd/"&gt;both as username and as password&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/registry-settings.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_AaYewom--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2020/12/registry-settings-1024x435.png" alt="registry-settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The URL is going to be &lt;b&gt;registry.digitalocean.com&lt;/b&gt; -- you can then provide the registry name in the advanced options (alternatively, you could include it in your build step before the image name).&lt;/p&gt;

&lt;p&gt;That’s it! Now we can push images from our Codefresh Pipeline directly to the DigitalOcean Container Registry. Note that if DigitalOcean is not set as your default registry, you have to define the registry in your build step:&lt;/p&gt;

&lt;pre&gt;registry: "digital-ocean"&lt;/pre&gt;

&lt;p&gt;Our full build step will look as follow:&lt;/p&gt;

&lt;pre&gt;  build:
    title: "Building Docker image"
    type: "build"
    image_name: "anais-codefresh/react-article-display-do-registry"
    tags:
      - "1.0.0"
    dockerfile: "Dockerfile"
    registry: "digital-ocean"
&lt;/pre&gt;

&lt;p&gt;Different to other platforms, the Codefresh Build Step both builds AND pushes the image to the registry.&lt;/p&gt;

&lt;p&gt;Running the image, we can see the step execute in the output section of our pipeline:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/do-codefresh-pipeline.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M9JdqRR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2020/12/do-codefresh-pipeline-1024x577.png" alt="do-codefresh-pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And view the Container image directly in DigitalOcean&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codefresh.io/wp-content/uploads/2020/12/container-image-in-digital-ocean.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MOWbSmQV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codefresh.io/wp-content/uploads/2020/12/container-image-in-digital-ocean-1024x532.png" alt="container-image-in-digital-ocean"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Try it out TODAY!&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;We made it super easy for you to connect DigitalOcean Container Registry to your Codefresh pipeline. You can find more details in the &lt;a href="https://codefresh.io/docs/docs/integrations/docker-registries/digital-ocean-container-registry/"&gt;Codefresh documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Wait, you are not a Codefresh user yet? &lt;a href="https://codefresh.io/codefresh-signup/?utm_source=Blog&amp;amp;utm_medium=Post&amp;amp;utm_campaign=digitaloceanregistry"&gt;Create Your Free Account today&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;This process works on all Codefresh accounts. You can set it up in minutes to try it out.&lt;/p&gt;

&lt;p&gt;If you have any questions, feel free to ask in&lt;a href="https://community.codefresh.io/"&gt; our community forum&lt;/a&gt;, we would love to hear from you.&lt;/p&gt;

</description>
      <category>digitalocean</category>
      <category>container</category>
      <category>devops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>#7 DevOps Diary: DevSecOps and how to make the best of learning DevOps in 2021</title>
      <dc:creator>AnaisUrlichs</dc:creator>
      <pubDate>Wed, 02 Dec 2020 17:32:05 +0000</pubDate>
      <link>https://dev.to/urlichsanais/7-devops-diary-devsecops-and-how-to-make-the-best-of-learning-devops-in-2021-4c6a</link>
      <guid>https://dev.to/urlichsanais/7-devops-diary-devsecops-and-how-to-make-the-best-of-learning-devops-in-2021-4c6a</guid>
      <description>&lt;p&gt;Hey everyone, I hope you have/are having a lovely day and Welcome to week 7 🥳&lt;/p&gt;

&lt;p&gt;For the better or worse, we have reached December and the year is soon going to be over. What are your goals in the last month? Maybe reaching some last-minute yearly goals of 2020? &lt;/p&gt;

&lt;p&gt;Let me give you some inspiration in this week's newsletter for next year.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration: DevOps 2021, something to look forward to 🎉
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Make a list of conferences that you would like to attend (most of them are likely online or hybrid for most of 2021)&lt;/li&gt;
&lt;li&gt;Join me in #100DaysOfKubernetes&lt;/li&gt;
&lt;li&gt;What is something that you always wanted to learn and were never able to take the time for? Maybe the resources in this newsletter provide some inspiration&lt;/li&gt;
&lt;li&gt;Collaborate with other amazing people in the space; whether on blog posts or videos — I tried and about half of the folks I contacted were quite excited about the idea 🙌🏽&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Videos 🎥
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://twitter.com/CDeliveryFdn"&gt;cd Foundation&lt;/a&gt; has an amazing &lt;a href="https://www.youtube.com/playlist?list=PL2KXbZ9-EY9RodTXtnbAg42gvuLDvyFtb"&gt;webinar series&lt;/a&gt; going on that provide interesting insights into tools, best practices, and more&lt;/li&gt;
&lt;li&gt;Get started learning more about security with this &lt;a href="https://youtu.be/iri7Nv0k13g"&gt;introduction to Snyk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Blog Posts (and other written content)🗞️
&lt;/h2&gt;

&lt;p&gt;Staying with the topic on security,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/snyksec"&gt;Snyk&lt;/a&gt; also has a great &lt;a href="https://snyk.io/devsecops/"&gt;learning hub to get started with DevSecOps&lt;/a&gt; and a comprehensive list of &lt;a href="https://snyk.io/security-resources/"&gt;security-focused resources&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;IBM's &lt;a href="https://www.ibm.com/security/xforce/research-hub?_lrsc=adf77b8c-1f49-430d-9edc-b3db664df4d2"&gt;X-Force Threat Intelligence Research Hub&lt;/a&gt; with tons of research papers&lt;/li&gt;
&lt;li&gt;Found on Reddit, &lt;a href="https://www.practical-devsecops.com/devsecops-university/"&gt;DevSecOps University&lt;/a&gt; has a comprehensive list of resources to get started with — however, the more advanced content is highly focused on AWS. I highly enjoyed this &lt;a href="https://youtu.be/4TxvqZFMaoA"&gt;Cloud Security Architecture&lt;/a&gt; Workshop by &lt;a href="https://twitter.com/daveshackleford"&gt;Dave Shackleford&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Monthly &lt;a href="https://www.reddit.com/r/devops/comments/k4v7s0/monthly_getting_into_devops_thread_202012/"&gt;"Getting into DevOps" thread&lt;/a&gt; on Reddit&lt;/li&gt;
&lt;li&gt;And lastly some &lt;a href="https://sysdig.com/blog/kubernetes-monitoring-best-practices/"&gt;tips on how to evaluate Kubernetes monitoring solutions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://blog.anaisurl.com/7-devops-diary/"&gt;View the full newsletter on my Blog&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>devops</category>
      <category>newsletter</category>
      <category>devsecops</category>
      <category>exam</category>
    </item>
  </channel>
</rss>
