➕ The server works :)
This commit is contained in:
commit
900ec8b911
|
@ -0,0 +1,27 @@
|
||||||
|
FROM python:3-alpine
|
||||||
|
|
||||||
|
RUN apk --update add git less openssh nginx curl gcc libc-dev && \
|
||||||
|
rm -rf /var/lib/apt/lists/* && \
|
||||||
|
rm /var/cache/apk/*
|
||||||
|
|
||||||
|
RUN pip install requests --no-cache-dir
|
||||||
|
|
||||||
|
RUN mkdir /hook && mkdir /docs && mkdir /site
|
||||||
|
|
||||||
|
# Configure nginx
|
||||||
|
RUN mkdir /run/nginx
|
||||||
|
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
|
||||||
|
COPY nginx.conf /etc/nginx/conf.d/organiser-un-tfjm.conf
|
||||||
|
RUN rm /etc/nginx/conf.d/default.conf
|
||||||
|
|
||||||
|
COPY ./entrypoint.sh /hook
|
||||||
|
COPY ./docker-hook /hook
|
||||||
|
COPY ./update.sh /hook
|
||||||
|
|
||||||
|
WORKDIR /docs
|
||||||
|
|
||||||
|
RUN umask 0002
|
||||||
|
|
||||||
|
ENTRYPOINT ["/hook/entrypoint.sh"]
|
||||||
|
|
||||||
|
EXPOSE 80
|
|
@ -0,0 +1,104 @@
|
||||||
|
#! /usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""Automatic Docker Deployment via Webhooks."""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from subprocess import Popen
|
||||||
|
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
|
||||||
|
from http.server import HTTPServer
|
||||||
|
from http.server import BaseHTTPRequestHandler
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
import requests
|
||||||
|
|
||||||
|
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',
|
||||||
|
level=logging.DEBUG,
|
||||||
|
stream=sys.stdout)
|
||||||
|
|
||||||
|
class RequestHandler(BaseHTTPRequestHandler):
|
||||||
|
"""A POST request handler which expects a token in its path."""
|
||||||
|
|
||||||
|
def do_POST(self):
|
||||||
|
try:
|
||||||
|
logging.info("Path: %s", self.path)
|
||||||
|
header_length = int(self.headers.get('content-length', "0"))
|
||||||
|
json_payload = self.rfile.read(header_length)
|
||||||
|
env = dict(os.environ)
|
||||||
|
json_params = {}
|
||||||
|
if len(json_payload) > 0:
|
||||||
|
json_params = json.loads(json_payload)
|
||||||
|
env.update(('REPOSITORY_' + var.upper(), str(val))
|
||||||
|
for var, val in json_params['repository'].items())
|
||||||
|
|
||||||
|
logging.info("Start executing '%s'" % args.cmd)
|
||||||
|
try:
|
||||||
|
Popen(args.cmd, env=env).wait()
|
||||||
|
self.send_response(200, "OK")
|
||||||
|
if 'callback_url' in json_params:
|
||||||
|
# Make a callback to Docker Hub
|
||||||
|
data = {'state': 'success'}
|
||||||
|
headers = {'Content-type': 'application/json',
|
||||||
|
'Accept': 'text/plain'}
|
||||||
|
requests.post(json_params['callback_url'],
|
||||||
|
data=json.dumps(data),
|
||||||
|
headers=headers)
|
||||||
|
except OSError as err:
|
||||||
|
self.send_response(500, "OSError")
|
||||||
|
logging.error("You probably didn't use 'sh ./script.sh'.")
|
||||||
|
logging.error(err)
|
||||||
|
if 'callback_url' in json_params:
|
||||||
|
# Make a callback to Docker Hub
|
||||||
|
data = {'state': 'failure',
|
||||||
|
'description': str(err)}
|
||||||
|
headers = {'Content-type': 'application/json',
|
||||||
|
'Accept': 'text/plain'}
|
||||||
|
requests.post(json_params['callback_url'],
|
||||||
|
data=json.dumps(data),
|
||||||
|
headers=headers)
|
||||||
|
self.end_headers()
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(e)
|
||||||
|
|
||||||
|
|
||||||
|
def get_parser():
|
||||||
|
"""Get a command line parser for docker-hook."""
|
||||||
|
parser = ArgumentParser(description=__doc__,
|
||||||
|
formatter_class=ArgumentDefaultsHelpFormatter)
|
||||||
|
|
||||||
|
parser.add_argument("-t", "--token",
|
||||||
|
dest="token",
|
||||||
|
required=False,
|
||||||
|
help=("Secure auth token (can be choosen "
|
||||||
|
"arbitrarily)"))
|
||||||
|
parser.add_argument("-c", "--cmd",
|
||||||
|
dest="cmd",
|
||||||
|
required=True,
|
||||||
|
nargs="*",
|
||||||
|
help="Command to execute when triggered")
|
||||||
|
parser.add_argument("--addr",
|
||||||
|
dest="addr",
|
||||||
|
default="0.0.0.0",
|
||||||
|
help="address where it listens")
|
||||||
|
parser.add_argument("--port",
|
||||||
|
dest="port",
|
||||||
|
type=int,
|
||||||
|
default=8555,
|
||||||
|
metavar="PORT",
|
||||||
|
help="port where it listens")
|
||||||
|
return parser
|
||||||
|
|
||||||
|
|
||||||
|
def main(addr, port):
|
||||||
|
"""Start a HTTPServer which waits for requests."""
|
||||||
|
httpd = HTTPServer((addr, port), RequestHandler)
|
||||||
|
httpd.serve_forever()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = get_parser()
|
||||||
|
if len(sys.argv) == 1:
|
||||||
|
parser.print_help()
|
||||||
|
sys.exit(1)
|
||||||
|
args = parser.parse_args()
|
||||||
|
main(args.addr, args.port)
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
[ -d .git ] || git clone ${MKDOCS_SERVER_GIT_URL} /docs
|
||||||
|
|
||||||
|
git pull
|
||||||
|
pip install -r requirements.txt
|
||||||
|
mkdocs build -d /site
|
||||||
|
nginx&
|
||||||
|
python /hook/docker-hook -c sh /hook/update.sh
|
|
@ -0,0 +1,17 @@
|
||||||
|
upstream trigger-ci {
|
||||||
|
server 127.0.0.1:8555;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name organisation;
|
||||||
|
root /site;
|
||||||
|
error_page 404 /404.html;
|
||||||
|
|
||||||
|
location /trigger-ci.json {
|
||||||
|
proxy_pass http://trigger-ci;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_redirect off;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue