Skip to content

Commit

Permalink
feat(repo): initial setup
Browse files Browse the repository at this point in the history
  • Loading branch information
ArtemkaKun authored Nov 23, 2024
1 parent 4d58937 commit 3dcec19
Show file tree
Hide file tree
Showing 23 changed files with 1,277 additions and 2 deletions.
8 changes: 8 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.idea
.github
.git
tests
.dockerignore
Dockerfile
LICENSE
README.md
17 changes: 17 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
version: 2

updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"

- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "daily"

- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "daily"
56 changes: 56 additions & 0 deletions .github/workflows/build_and_push_docker_image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: "Build and push file path validator Docker image"

on:
push:
branches:
- "main"
paths-ignore:
- ".github/**"
- ".idea/**"
- "tests/**"
- "LICENSE"
- "README.md"

permissions:
contents: "read"
packages: "write"
id-token: "write"

env:
REGISTRY: "ghcr.io"
IMAGE_NAME: "articola-tools/file-path-validator"

jobs:
build-and-push:
runs-on: "ubuntu-latest"

# NOTE: building and pushing Docker image of file path validator take around 1 minute.
# If this job takes more than 5 minutes, it means that something is wrong.
timeout-minutes: 5
steps:
- name: "Checkout ${{ github.event.repository.name }}"
uses: "actions/checkout@v4"

- name: "Add short hash of current commit to environment variables"
run: "echo \"CURRENT_COMMIT_SHORT_HASH=$(git rev-parse --short \"$GITHUB_SHA\")\" >> \"$GITHUB_ENV\""

- name: "Set up Docker Buildx"
uses: "docker/setup-buildx-action@v3"

- name: "Login to Docker registry"
uses: "docker/login-action@v3"
with:
registry: "${{ env.REGISTRY }}"
username: "${{ github.actor }}"
password: "${{ secrets.GITHUB_TOKEN }}"

- name: "Build and push file path validator linter Docker image"
uses: "docker/build-push-action@v6"
id: "build-and-push"
with:
context: "."
push: true
tags: "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest,
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.CURRENT_COMMIT_SHORT_HASH }}"
cache-from: "type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest"
cache-to: "type=inline"
218 changes: 218 additions & 0 deletions .github/workflows/validate_new_changes.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
name: "New changes validation"

on:
pull_request: # yamllint disable-line rule:empty-values

permissions:
contents: "read"
packages: "read"

env:
REGISTRY: "ghcr.io"
IMAGE_NAME: "articola-tools/file-path-validator"

jobs:
find-changed-files:
runs-on: "ubuntu-latest"
outputs:
is_yaml_changed: "${{ steps.filter.outputs.yaml }}"
is_dockerfile_changed: "${{ steps.filter.outputs.dockerfile }}"
is_validator_image_changed: "${{ steps.filter.outputs.validator-image }}"
is_go_changed: "${{ steps.filter.outputs.go }}"
is_markdown_changed: "${{ steps.filter.outputs.markdown }}"
permissions:
pull-requests: "read"
steps:
- name: "Checkout ${{ github.event.repository.name }}"
uses: "actions/checkout@v4"
with:
fetch-depth: 1

- name: "Find changed files"
uses: "dorny/paths-filter@v3"
id: "filter"
with:
filters: |
yaml:
- "**/*.yaml"
- "**/*.yml"
dockerfile:
- "**/Dockerfile"
validator-image:
- "**/Dockerfile"
- "**/.dockerignore"
- "**/*.go"
go:
- "**/*.go"
markdown:
- "**/*.md"
validate-file-path-validator-image:
runs-on: "ubuntu-latest"
needs: "find-changed-files"
if: "${{ needs.find-changed-files.outputs.is_validator_image_changed == 'true' }}"

# NOTE: building and running Docker image of file path validator take around 1 minute.
# If this job takes more than 5 minutes, it means that something is wrong.
timeout-minutes: 5
steps:
- name: "Checkout ${{ github.event.repository.name }}"
uses: "actions/checkout@v4"

- name: "Set up Docker Buildx"
uses: "docker/setup-buildx-action@v3"

- name: "Login to Docker registry"
uses: "docker/login-action@v3"
with:
registry: "${{ env.REGISTRY }}"
username: "${{ github.actor }}"
password: "${{ secrets.GITHUB_TOKEN }}"

- name: "Build file path validator Docker image"
uses: "docker/build-push-action@v6"
with:
push: false
load: true

# NOTE: using another name to don't allow docker to download image from the internet in the next step.
tags: "local/file-path-validator-pr:latest"
cache-from: "type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest"
cache-to: "type=inline"

- name: "Check correct snake_case file paths"
run: |
while IFS= read -r file_path; do
docker run --rm local/file-path-validator-pr:latest \
--naming-convention snake_case --path-to-validate "$file_path";
done < ${{ github.workspace }}/tests/correct_snake_case_file_paths.txt
- name: "Check incorrect snake_case file paths"
run: |
while IFS= read -r file_path; do
if docker run --rm local/file-path-validator-pr:latest \
--naming-convention snake_case --path-to-validate "$file_path"; then
echo "Validation unexpectedly succeeded for file path '$file_path'!" >&2
exit 1
fi
done < ${{ github.workspace }}/tests/incorrect_snake_case_file_paths.txt
- name: "Check correct PascalCase file paths"
run: |
while IFS= read -r file_path; do
docker run --rm local/file-path-validator-pr:latest \
--naming-convention PascalCase --path-to-validate "$file_path";
done < ${{ github.workspace }}/tests/correct_pascal_case_file_paths.txt
- name: "Check incorrect PascalCase file paths"
run: |
while IFS= read -r file_path; do
if docker run --rm local/file-path-validator-pr:latest \
--naming-convention PascalCase --path-to-validate "$file_path"; then
echo "Validation unexpectedly succeeded for file path '$file_path'!" >&2
exit 1
fi
done < ${{ github.workspace }}/tests/incorrect_pascal_case_file_paths.txt
- name: "Run Dockerfile security scanner"
run: "docker run --rm --group-add $(getent group docker | cut -d: -f3)
-v /var/run/docker.sock:/var/run/docker.sock
ghcr.io/articola-tools/dockerfile-security-scanner local/file-path-validator-pr:latest"

validate-dockerfile-changes:
runs-on: "ubuntu-latest"
needs: "find-changed-files"
if: "${{ needs.find-changed-files.outputs.is_dockerfile_changed == 'true' }}"

# NOTE: validating Dockerfile changes takes around 1 minute.
# If this job takes more than 5 minutes, it means that something is wrong.
timeout-minutes: 5
steps:
- name: "Checkout ${{ github.event.repository.name }}"
uses: "actions/checkout@v4"

- name: "Login to Docker registry"
uses: "docker/login-action@v3"
with:
registry: "${{ env.REGISTRY }}"
username: "${{ github.actor }}"
password: "${{ secrets.GITHUB_TOKEN }}"

- name: "Run Dockerfile linter"
run: "docker run --rm -v ${{ github.workspace }}:/linter_workdir/repo
${{ env.REGISTRY }}/articola-tools/dockerfile-linter:latest"

validate-yaml-changes:
runs-on: "ubuntu-latest"
needs: "find-changed-files"

if: "${{ needs.find-changed-files.outputs.is_yaml_changed == 'true' }}"

# NOTE: validating YAML changes takes around 1 minute.
# If this job takes more than 5 minutes, it means that something is wrong.
timeout-minutes: 5
steps:
- name: "Checkout ${{ github.event.repository.name }}"
uses: "actions/checkout@v4"

- name: "Login to Docker registry"
uses: "docker/login-action@v3"
with:
registry: "${{ env.REGISTRY }}"
username: "${{ github.actor }}"
password: "${{ secrets.GITHUB_TOKEN }}"

- name: "Run YAML linter"
run: "docker run --rm -v ${{ github.workspace }}:/linter_workdir/repo
${{ env.REGISTRY }}/articola-tools/yaml-linter:latest"

validate-markdown-changes:
runs-on: "ubuntu-latest"
needs: "find-changed-files"
if: "${{ needs.find-changed-files.outputs.is_markdown_changed == 'true' }}"

# NOTE: validating Markdown changes takes around 1 minute.
# If this job takes more than 5 minutes, it means that something is wrong.
timeout-minutes: 5
steps:
- name: "Checkout ${{ github.event.repository.name }}"
uses: "actions/checkout@v4"

- name: "Login to Docker registry"
uses: "docker/login-action@v3"
with:
registry: "${{ env.REGISTRY }}"
username: "${{ github.actor }}"
password: "${{ secrets.GITHUB_TOKEN }}"

- name: "Run Dockerfile linter"
run: "docker run --rm -v ${{ github.workspace }}:/linter_workdir/repo
${{ env.REGISTRY }}/articola-tools/markdown-linter:latest"

validate-go-changes:
runs-on: "ubuntu-latest"
needs: "find-changed-files"
if: "${{ needs.find-changed-files.outputs.is_go_changed == 'true' }}"

# NOTE: validating Go changes takes around 1 minute.
# If this job takes more than 5 minutes, it means that something is wrong.
timeout-minutes: 5
steps:
- name: "Checkout ${{ github.event.repository.name }}"
uses: "actions/checkout@v4"

- name: "Build code"
run: "go build -ldflags \"-s -w\" -o file_path_validator ./cmd/file_path_validator/"

- name: "Run unit tests"
run: "go test ./..."

- name: "Login to Docker registry"
uses: "docker/login-action@v3"
with:
registry: "${{ env.REGISTRY }}"
username: "${{ github.actor }}"
password: "${{ secrets.GITHUB_TOKEN }}"

- name: "Run linter"
run: "docker run --rm -v ./:/linter_workdir ghcr.io/articola-tools/go-linter:latest"
23 changes: 23 additions & 0 deletions .github/workflows/validate_pr_name.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: "PR name validation"

on:
pull_request:
types: ["opened", "edited", "reopened", "ready_for_review"]

env:
REGISTRY: "ghcr.io"

jobs:
validate-pr-name:
runs-on: "ubuntu-latest"
steps:
- name: "Login to Docker registry"
uses: "docker/login-action@v3"
with:
registry: "${{ env.REGISTRY }}"
username: "${{ github.actor }}"
password: "${{ secrets.GITHUB_TOKEN }}"

- name: "Validate PR name"
run: "docker run --rm ${{ env.REGISTRY }}/articola-tools/pr-name-validator:latest
'${{ github.event.pull_request.title }}'"
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions .idea/file-name-validator.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM golang:1.23.3 AS build

COPY ./ /file-path-validator

WORKDIR /file-path-validator

RUN go mod download && go build -ldflags "-s -w" -o file_path_validator ./cmd/file_path_validator/


FROM gcr.io/distroless/static-debian12:nonroot-8701094b7fe8ff30d0777bbdfcc9a65caff6f40b

COPY --from=build /file-path-validator/file_path_validator /file_path_validator

HEALTHCHECK --timeout=1s --retries=1 CMD /file_path_validator || exit 1

ENTRYPOINT ["/file_path_validator"]
Loading

0 comments on commit 3dcec19

Please sign in to comment.