GitHub Actions: How to Avoid Running the Same Workflow Multiple Times

GitHub Actions: How to Avoid Running the Same Workflow Multiple Times

In continuous integration, we often reuse the same GitHub workflow for multiple events. For example, we may need the build workflow when we push a new commit, or when someone creates a new pull request, or before we create a new release. However, we may end up having the same workflow multiple times with this approach: both for a push and a pull request or both for a push and a tag. In this post, we present a solution that helps to avoid running unnecessary duplicate jobs.

A Secure Way to Run npm ci

A Secure Way to Run npm ci

No matter how much you trust in the npmjs package registry in general and in packages you are using in particular, Bad Thingsā„¢ always happen. They happen to the best of us. Even a small Node.js project may have thousands of dependencies, which makes it virtually impossible for a developer to monitor and audit them all.

An NPM package has two main ways to harm you: the first one is when you install it, and the second one is when you actually use it. The first way is possible because of the so-called “lifecycle scripts” run by npm. And even though one of the earliest attacks exploiting lifecycle scripts dates back to 2017, developers still do not take measures to protect their data.

This post explains how to protect sensitive information (such as authentication tokens) when running CI builds.

How to Run Docker in Alpine Container in LXC/LXD

How to Run Docker in Alpine Container in LXC/LXD

When experimenting with Docker Swarm, I decided to set up five more nodes on my local computer. I used Alpine images in the LXC, and tried to use Docker in them. Although docker stared successfully, it was impossible to deploy any services to Alpine nodes, deployment failed with “cgroups: cannot find cgroup mount destination: unknown” error message.

Because I dislike when something that should work, does not work the way I expect it to work, I decided to dig deeper and try to fix the problem.