Skip to content

Commit

Permalink
feat(docker): Add Docker configuration. (#18)
Browse files Browse the repository at this point in the history
* add Docker and Makefile

* add changelog entry

* remove unnecessary docker readme

* add push docker workflow from template

* adjust workflow

* fix workflow

* update README

* push docker image when creating a new tag
  • Loading branch information
MalteHerrmann authored Jun 14, 2024
1 parent 034cbb2 commit a61520d
Show file tree
Hide file tree
Showing 7 changed files with 192 additions and 7 deletions.
5 changes: 3 additions & 2 deletions .clconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
"lint",
"test",
"config",
"crud"
"crud",
"docker"
],
"change_types": {
"Features": "features",
"Improvements": "improvements",
"Features": "features",
"Bug Fixes": "bug\\s*fixes"
},
"expected_spellings": {
Expand Down
32 changes: 32 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Include any files or directories that you don't want to be copied to your
# container here (e.g., local build artifacts, temporary files, etc.).
#
# For more help, visit the .dockerignore file reference guide at
# https://docs.docker.com/go/build-context-dockerignore/

**/.DS_Store
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/charts
**/docker-compose*
**/compose.y*ml
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/secrets.dev.yaml
**/values.dev.yaml
/bin
/target
LICENSE
README.md
55 changes: 55 additions & 0 deletions .github/workflows/push-docker.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# This YAML file was taken from the GitHub documentation:
# https://docs.github.com/en/actions/publishing-packages/publishing-docker-images#prerequisites
#
name: Create and publish a Docker image

# Configures this workflow to run every time a change is pushed to the branch called `release`.
on:
push:
tags:
- '*' # Push events to every tag

# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}

# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.
jobs:
build-and-push-image:
runs-on: ubuntu-latest
# Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
permissions:
contents: read
packages: write
attestations: write
id-token: write
#
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.
- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.
# It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository.
# It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
- name: Build and push Docker image
id: push
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ This changelog was created using the `clu` binary

### Features

- (docker) [#18](https://github.com/MalteHerrmann/changelog-utils/pull/18) Add Docker configuration.
- (crud) [#16](https://github.com/MalteHerrmann/changelog-utils/pull/16) Add `release` command.
- (crud) [#12](https://github.com/MalteHerrmann/changelog-utils/pull/12) Implement adding new entries.
- (config) [#7](https://github.com/MalteHerrmann/changelog-utils/pull/7) Add `init` and `config` subcommands.
Expand Down
65 changes: 65 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# syntax=docker/dockerfile:1

ARG RUST_VERSION=1.78.0

################################################################################
# Create a stage for building the application.

FROM rust:${RUST_VERSION}-alpine AS build
ARG APP_NAME
WORKDIR /app

# Install host build dependencies.
RUN apk add --no-cache clang lld musl-dev git

# Build the application.
# Leverage a cache mount to /usr/local/cargo/registry/
# for downloaded dependencies, a cache mount to /usr/local/cargo/git/db
# for git repository dependencies, and a cache mount to /app/target/ for
# compiled dependencies which will speed up subsequent builds.
# Leverage a bind mount to the src directory to avoid having to copy the
# source code into the container. Once built, copy the executable to an
# output directory before the cache mounted /app/target is unmounted.
RUN --mount=type=bind,source=src,target=src \
--mount=type=bind,source=Cargo.toml,target=Cargo.toml \
--mount=type=bind,source=Cargo.lock,target=Cargo.lock \
--mount=type=cache,target=/app/target/ \
--mount=type=cache,target=/usr/local/cargo/git/db \
--mount=type=cache,target=/usr/local/cargo/registry/ \
cargo build --locked --release && \
cp ./target/release/clu /bin/clu

################################################################################
# Create a new stage for running the application that contains the minimal
# runtime dependencies for the application. This often uses a different base
# image from the build stage where the necessary files are copied from the build
# stage.
#
# The example below uses the alpine image as the foundation for running the app.
# By specifying the "3.18" tag, it will use version 3.18 of alpine. If
# reproducability is important, consider using a digest
# (e.g., alpine@sha256:664888ac9cfd28068e062c991ebcff4b4c7307dc8dd4df9e728bedde5c449d91).
FROM alpine:3.18 AS final

WORKDIR /data

# Create a non-privileged user that the app will run under.
# See https://docs.docker.com/go/dockerfile-user-best-practices/
ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/nonexistent" \
--shell "/sbin/nologin" \
--no-create-home \
--uid "${UID}" \
appuser
USER appuser

# Copy the executable from the "build" stage.
COPY --from=build /bin/clu /bin/clu

ENTRYPOINT ["/bin/clu"]

# What the container should run when it is started.
CMD ["help"]
20 changes: 20 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Run tests
test:
cargo test

# Build binary locally
build:
cargo build .

# Install binary
install:
cargo install --path .

# Run Docker image
docker-run:
docker run -v $(PWD):/data MalteHerrmann/changelog-utils lint

# Build docker image
docker-build:
docker build -t MalteHerrmann/changelog-utils .

21 changes: 16 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@ To install the application from source, run
cargo install --git https://github.com/MalteHerrmann/changelog-utils
```

The application is also available to be used with a Docker image.
It can be built locally by executing `make docker-build`
or downloaded from the [GitHub container registry](https://github.com/MalteHerrmann/changelog-utils/pkgs/container/changelog-utils)
by running

```bash
docker pull ghcr.io/malteherrmann/changelog-utils:[TAG]}
```

## Usage

The available subcommands can be listed when running
Expand All @@ -20,11 +29,13 @@ The available subcommands can be listed when running
Usage: clu <COMMAND>

Commands:
fix Applies all possible auto-fixes to the changelog
lint Checks if the changelog contents adhere to the defined rules
init Initializes the changelog configuration in the current directory
config Adjust the changelog configuration like allowed categories, change types or other
help Print this message or the help of the given subcommand(s)
add Adds a new entry to the unreleased section of the changelog
fix Applies all possible auto-fixes to the changelog
lint Checks if the changelog contents adhere to the defined rules
init Initializes the changelog configuration in the current directory
config Adjust the changelog configuration like allowed categories, change types or other
release Turns the Unreleased section into a new release with the given version
help Print this message or the help of the given subcommand(s)

Options:
-h, --help Print help
Expand Down

0 comments on commit a61520d

Please sign in to comment.