Skip to content

Commit

Permalink
feat: hadolint provider
Browse files Browse the repository at this point in the history
The `hadolint` provider is a fairly simple plugin that uses
the new `augmentGraph` handler. Simply add the `hadolint` 
provider to your project config, and a linting test will
be created for each `container` module in the project. See
the `hadolint` provider and `hadolint` module type reference
docs for details and more usage options.
  • Loading branch information
edvald committed Dec 12, 2019
1 parent b2509e9 commit 715abe0
Show file tree
Hide file tree
Showing 25 changed files with 948 additions and 27 deletions.
3 changes: 1 addition & 2 deletions examples/demo-project/backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
FROM golang:1.8.3-alpine
MAINTAINER Aurelien PERRIER <[email protected]>

ENV webserver_path /go/src/github.com/perriea/webserver/
ENV PATH $PATH:$webserver_path
Expand All @@ -9,6 +8,6 @@ COPY webserver/ .

RUN go build .

ENTRYPOINT ./webserver
ENTRYPOINT ["./webserver"]

EXPOSE 8080
4 changes: 2 additions & 2 deletions examples/demo-project/frontend/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ ENV PORT=8080
EXPOSE ${PORT}
WORKDIR /app

ADD package.json /app
COPY package.json /app
RUN npm install

ADD . /app
COPY . /app

CMD ["npm", "start"]
7 changes: 7 additions & 0 deletions examples/hadolint/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# hadolint project

A simple variation on the [demo-project](../demo-project/README.md) that adds the [hadolint provider](https://docs.garden.io/reference/providers/hadolint.md). This generates an additional Dockerfile linting test for each `container` module in your project that contains a Dockerfile.

To test it, run `garden dev` in this directory, and wait for the initial processing to complete. Notice the two tests that are added and run by the `hadolint` provider.

Now try editing `backend/Dockerfile`, adding the line `MAINTAINER [email protected]`. You should quickly see a linting error in your console, telling you that the `MAINTAINER` field is deprecated.
4 changes: 4 additions & 0 deletions examples/hadolint/backend/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
Dockerfile
garden.yml
app.yaml
27 changes: 27 additions & 0 deletions examples/hadolint/backend/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so

# Folders
_obj
_test

# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out

*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*

_testmain.go

*.exe
*.test
*.prof

.vscode/settings.json
webserver/*server*
13 changes: 13 additions & 0 deletions examples/hadolint/backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM golang:1.8.3-alpine

ENV webserver_path /go/src/github.com/perriea/webserver/
ENV PATH $PATH:$webserver_path

WORKDIR $webserver_path
COPY webserver/ .

RUN go build .

ENTRYPOINT ["./webserver"]

EXPOSE 8080
14 changes: 14 additions & 0 deletions examples/hadolint/backend/garden.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
kind: Module
name: backend
description: Backend service container
type: container
services:
- name: backend
ports:
- name: http
containerPort: 8080
# Maps service:80 -> container:8080
servicePort: 80
ingresses:
- path: /hello-backend
port: http
17 changes: 17 additions & 0 deletions examples/hadolint/backend/webserver/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package main

import (
"fmt"
"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello from Go!")
}

func main() {
http.HandleFunc("/hello-backend", handler)
fmt.Println("Server running...")

http.ListenAndServe(":8080", nil)
}
4 changes: 4 additions & 0 deletions examples/hadolint/frontend/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
Dockerfile
garden.yml
app.yaml
12 changes: 12 additions & 0 deletions examples/hadolint/frontend/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM node:9-alpine

ENV PORT=8080
EXPOSE ${PORT}
WORKDIR /app

COPY package.json /app
RUN npm install

COPY . /app

CMD ["npm", "start"]
27 changes: 27 additions & 0 deletions examples/hadolint/frontend/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
const express = require('express');
const request = require('request-promise')
const app = express();

const backendServiceEndpoint = `http://backend/hello-backend`

app.get('/hello-frontend', (req, res) => res.send('Hello from the frontend!'));

app.get('/call-backend', (req, res) => {
// Query the backend and return the response
request.get(backendServiceEndpoint)
.then(message => {
message = `Backend says: '${message}'`
res.json({
message,
})
})
.catch(err => {
res.statusCode = 500
res.json({
error: err,
message: "Unable to reach service at " + backendServiceEndpoint,
})
});
});

module.exports = { app }
27 changes: 27 additions & 0 deletions examples/hadolint/frontend/garden.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
kind: Module
name: frontend
description: Frontend service container
type: container
services:
- name: frontend
ports:
- name: http
containerPort: 8080
healthCheck:
httpGet:
path: /hello-frontend
port: http
ingresses:
- path: /hello-frontend
port: http
- path: /call-backend
port: http
dependencies:
- backend
tests:
- name: unit
args: [npm, test]
- name: integ
args: [npm, run, integ]
dependencies:
- frontend
3 changes: 3 additions & 0 deletions examples/hadolint/frontend/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const { app } = require('./app');

app.listen(process.env.PORT, '0.0.0.0', () => console.log('Frontend service started'));
22 changes: 22 additions & 0 deletions examples/hadolint/frontend/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "frontend",
"version": "1.0.0",
"description": "Simple Node.js docker service",
"main": "main.js",
"scripts": {
"start": "node main.js",
"test": "echo OK",
"integ": "node_modules/mocha/bin/mocha test/integ.js"
},
"author": "garden.io <[email protected]>",
"license": "ISC",
"dependencies": {
"express": "^4.16.2",
"request": "^2.83.0",
"request-promise": "^4.2.2"
},
"devDependencies": {
"mocha": "^5.1.1",
"supertest": "^3.0.0"
}
}
17 changes: 17 additions & 0 deletions examples/hadolint/frontend/test/integ.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const supertest = require("supertest")
const { app } = require("../app")

describe('GET /call-backend', () => {
const agent = supertest.agent(app)

it('should respond with a message from the backend service', (done) => {
agent
.get("/call-backend")
.expect(200, { message: "Backend says: 'Hello from Go!'" })
.end((err) => {
if (err) return done(err)
done()
})
})
})

17 changes: 17 additions & 0 deletions examples/hadolint/garden.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
kind: Project
name: demo-project
environments:
- name: local
- name: testing
providers:
- name: local-kubernetes
environments: [local]
- name: kubernetes
environments: [testing]
context: gke_garden-dev-200012_europe-west1-b_garden-dev-1
namespace: demo-project-testing-${local.env.CIRCLE_BUILD_NUM || local.username}
defaultHostname: demo-project-testing.dev-1.sys.garden
buildMode: cluster-docker
clusterDocker:
enableBuildKit: true
- name: hadolint
Loading

0 comments on commit 715abe0

Please sign in to comment.