From ffd05a21016358385f0fd376549bf216e0ff7791 Mon Sep 17 00:00:00 2001 From: Tim Hughes Date: Thu, 29 Oct 2015 21:43:13 +0000 Subject: [PATCH 1/6] adding a rpm spec file and init script --- golang-github-adnanh-webhook.spec | 180 ++++++++++++++++++++++++++++++ webhook.init | 111 ++++++++++++++++++ 2 files changed, 291 insertions(+) create mode 100644 golang-github-adnanh-webhook.spec create mode 100644 webhook.init diff --git a/golang-github-adnanh-webhook.spec b/golang-github-adnanh-webhook.spec new file mode 100644 index 0000000..a108277 --- /dev/null +++ b/golang-github-adnanh-webhook.spec @@ -0,0 +1,180 @@ +%if 0%{?fedora} || 0%{?rhel} == 6 +%global with_devel 1 +%global with_bundled 0 +%global with_debug 1 +%global with_check 1 +%global with_unit_test 0 +%else +%global with_devel 0 +%global with_bundled 0 +%global with_debug 0 +%global with_check 0 +%global with_unit_test 0 +%endif + +%if 0%{?with_debug} +%global _dwz_low_mem_die_limit 0 +%else +%global debug_package %{nil} +%endif + +%global provider github +%global provider_tld com +%global project adnanh +%global repo webhook +# https://github.com/adnanh/webhook +%global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo} +%global import_path %{provider_prefix} +%if 0%{?_commit:1} +# rpmbuild -ba --define "_commit 409b441c31f83279af0db289123eb4b0b14809a6" *.spec +%global commit %{_commit} +%else +%global commit 409b441c31f83279af0db289123eb4b0b14809a6 +%endif +%global shortcommit %(c=%{commit}; echo ${c:0:7}) + +Name: golang-%{provider}-%{project}-%{repo} +Version: 0 +Release: 0.1.git%{shortcommit}%{?dist} +Summary: webhook is a lightweight configurable webhook server written in Go +License: MIT +URL: https://%{provider_prefix} +Source0: https://%{provider_prefix}/archive/%{commit}/%{repo}-%{shortcommit}.tar.gz + +# e.g. el6 has ppc64 arch without gcc-go, so EA tag is required +ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}} +# If go_compiler is not set to 1, there is no virtual provide. Use golang instead. +BuildRequires: %{?go_compiler:compiler(go-compiler)}%{!?go_compiler:golang} + +%if ! 0%{?with_bundled} +BuildRequires: golang(github.com/codegangsta/negroni) +BuildRequires: golang(github.com/gorilla/mux) +#BuildRequires: golang(gopkg.in/fsnotify.v1) +BuildRequires: golang(github.com/go-fsnotify/fsnotify) +%endif + +%description +%{summary} + +%if 0%{?with_devel} +%package devel +Summary: %{summary} +BuildArch: noarch + +%if 0%{?with_check} && ! 0%{?with_bundled} +%endif + + +Provides: golang(%{import_path}/hook) = %{version}-%{release} + +%description devel +%{summary} + +This package contains library source intended for +building other packages which use import path with +%{import_path} prefix. +%endif + +%if 0%{?with_unit_test} && 0%{?with_devel} +%package unit-test-devel +Summary: Unit tests for %{name} package +%if 0%{?with_check} +#Here comes all BuildRequires: PACKAGE the unit tests +#in %%check section need for running +%endif + +# test subpackage tests code from devel subpackage +Requires: %{name}-devel = %{version}-%{release} + +%description unit-test-devel +%{summary} + +This package contains unit tests for project +providing packages with %{import_path} prefix. +%endif + +%prep +%setup -q -n %{repo}-%{commit} + +%build +mkdir -p src/github.com/adnanh +ln -s ../../../ src/github.com/adnanh/webhook + +%if ! 0%{?with_bundled} +export GOPATH=$(pwd):%{gopath} +%else +export GOPATH=$(pwd):$(pwd)/Godeps/_workspace:%{gopath} +%endif + +%gobuild -o bin/webhook %{import_path} + +%install +install -d -p %{buildroot}%{_bindir} +install -p -m 0755 bin/webhook %{buildroot}%{_bindir} + +# source codes for building projects +%if 0%{?with_devel} +install -d -p %{buildroot}/%{gopath}/src/%{import_path}/ +echo "%%dir %%{gopath}/src/%%{import_path}/." >> devel.file-list +# find all *.go but no *_test.go files and generate devel.file-list +for file in $(find . -iname "*.go" \! -iname "*_test.go") ; do + echo "%%dir %%{gopath}/src/%%{import_path}/$(dirname $file)" >> devel.file-list + install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file) + cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file + echo "%%{gopath}/src/%%{import_path}/$file" >> devel.file-list +done +%endif + +# testing files for this project +%if 0%{?with_unit_test} && 0%{?with_devel} +install -d -p %{buildroot}/%{gopath}/src/%{import_path}/ +# find all *_test.go files and generate unit-test-devel.file-list +for file in $(find . -iname "*_test.go" -iname "hooks.json.example"); do + echo "%%dir %%{gopath}/src/%%{import_path}/$(dirname $file)" >> devel.file-list + install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file) + cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file + echo "%%{gopath}/src/%%{import_path}/$file" >> unit-test-devel.file-list +done +%endif + +%if 0%{?with_devel} +sort -u -o devel.file-list devel.file-list +%endif + +%check +%if 0%{?with_check} && 0%{?with_unit_test} && 0%{?with_devel} +%if ! 0%{?with_bundled} +export GOPATH=%{buildroot}/%{gopath}:%{gopath} +%else +export GOPATH=%{buildroot}/%{gopath}:$(pwd)/Godeps/_workspace:%{gopath} +%endif + +%gotest %{import_path}/hook +%endif + +#define license tag if not already defined +%{!?_licensedir:%global license %doc} + +%files +%license LICENSE +%doc README.md hooks.json.example +%{_bindir}/webhook + +%if 0%{?with_devel} +%files devel -f devel.file-list +%license LICENSE +%doc README.md +%dir %{gopath}/src/%{provider}.%{provider_tld}/%{project} +%endif + +%if 0%{?with_unit_test} && 0%{?with_devel} +%files unit-test-devel -f unit-test-devel.file-list +%license LICENSE +%doc README.md +%endif + +%changelog +* Thu Oct 29 2015 Tim Hughes - 0-0.1.git409b441 +- First package for Fedora + + diff --git a/webhook.init b/webhook.init new file mode 100644 index 0000000..6a14f7c --- /dev/null +++ b/webhook.init @@ -0,0 +1,111 @@ +#!/bin/sh +# +# Start the Webhook daemon +# +# chkconfig: 35 82 16 +# description: webhook is a lightweight configurable tool written in Go, that \ +# allows you to easily create HTTP endpoints (hooks) on your server, which \ +# you can use to execute configured commands. + +### BEGIN INIT INFO +# Provides: webhook +# Required-Start: $syslog $local_fs +# Required-Stop: $syslog $local_fs +# Should-Start: 0 1 2 6 +# Should-Stop: 3 5 +# Default-Start: 0 1 2 6 +# Default-Stop: 3 5 +# Short-Description: webhook allows you to easily create HTTP endpoints (hooks) on your server +# Description: webhook allows you to easily create HTTP endpoints (hooks) on your server +### END INIT INFO + +# Source function library. +. /etc/rc.d/init.d/functions + +exec="/usr/bin/webhook" +prog="webhook" +config="/etc/webhook/hooks.json" + +[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog + + + + +lockfile=/var/lock/subsys/$prog +pidfile=/var/run/$prog.pid + +start() { + [ -x $exec ] || exit 5 + [ -f $config ] || exit 6 + echo -n $"Starting $prog: " + # if not running, start it up here, usually something like "daemon $exec" + ((exec $exec -hooks=$config $OPTIONS &>/dev/null)&) + retval=$? + echo + [ $retval -eq 0 ] && touch $lockfile + return $retval +} + +stop() { + echo -n $"Stopping $prog: " + killproc $prog + retval=$? + echo + [ $retval -eq 0 ] && rm -f $lockfile + return $retval +} + +restart() { + stop + start +} + +reload() { + restart +} + +force_reload() { + restart +} + +rh_status() { + # run checks to determine if the service is running or use generic status + status $prog +} + +rh_status_q() { + rh_status >/dev/null 2>&1 +} + + +case "$1" in + start) + rh_status_q && exit 0 + $1 + ;; + stop) + rh_status_q || exit 0 + $1 + ;; + restart) + $1 + ;; + reload) + rh_status_q || exit 7 + $1 + ;; + force-reload) + force_reload + ;; + status) + rh_status + ;; + condrestart|try-restart) + rh_status_q || exit 0 + restart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + exit 2 +esac +exit $? From 8173f4a346d026e4363ec201b9948112f00b7b4a Mon Sep 17 00:00:00 2001 From: Tim Hughes Date: Thu, 29 Oct 2015 21:50:46 +0000 Subject: [PATCH 2/6] add travis.yml --- .travis.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..6e7c9ee --- /dev/null +++ b/.travis.yml @@ -0,0 +1,30 @@ +branches: + only: + - master +notifications: + email: + on_success: never + on_failure: always +sudo: required +services: +- docker +before_install: +- echo "deb http://us.archive.ubuntu.com/ubuntu trusty main universe" | sudo tee -a /etc/apt/sources.list +- sudo apt-get update +- docker pull fedora:22 +before_script: +- docker run -i --privileged -d -v $HOME/build/$TRAVIS_REPO_SLUG:$HOME/build/$TRAVIS_REPO_SLUG --name test_fedora fedora:22 bash +- docker exec -i test_fedora bash -c "dnf install -y rpmdevtools make mock git python-pip" +- docker exec -i test_fedora bash -c "dnf install -y go-compilers-golang-compiler" +- docker exec -i test_fedora bash -c "dnf install -y https://kojipkgs.fedoraproject.org//packages/golang-github-go-fsnotify-fsnotify/1.2.0/0.1.git96c060f.fc22/noarch/golang-github-go-fsnotify-fsnotify-devel-1.2.0-0.1.git96c060f.fc22.noarch.rpm" +- docker exec -i test_fedora bash -c "dnf install -y https://kojipkgs.fedoraproject.org//packages/golang-github-codegangsta-negroni/0.1/1.gitc7477ad.fc22/noarch/golang-github-codegangsta-negroni-devel-0.1-1.gitc7477ad.fc22.noarch.rpm" +- docker exec -i test_fedora bash -c "dnf install -y https://kojipkgs.fedoraproject.org//packages/golang-github-gorilla-mux/0/0.18.git8096f47.fc22/noarch/golang-github-gorilla-mux-devel-0-0.18.git8096f47.fc22.noarch.rpm" +- docker exec -i test_fedora bash -c "useradd -g root fedora; usermod -a -G mock fedora" +- docker exec -i test_fedora bash -c "pip install git+https://github.com/shawnsi/docker-rpmbuild" +script: +- docker exec -i test_fedora bash -c "pip install git+https://github.com/shawnsi/docker-rpmbuild" +- docker exec -u fedora i test_fedora bash -c "cd $HOME/build/$TRAVIS_REPO_SLUG ; make build_rpm" + + + + From 033764601df3783bc9687fd75982a9d3a45b76b9 Mon Sep 17 00:00:00 2001 From: Tim Hughes Date: Thu, 29 Oct 2015 21:51:43 +0000 Subject: [PATCH 3/6] typo in travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6e7c9ee..9bc507a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ before_script: - docker exec -i test_fedora bash -c "pip install git+https://github.com/shawnsi/docker-rpmbuild" script: - docker exec -i test_fedora bash -c "pip install git+https://github.com/shawnsi/docker-rpmbuild" -- docker exec -u fedora i test_fedora bash -c "cd $HOME/build/$TRAVIS_REPO_SLUG ; make build_rpm" +- docker exec -u fedora -i test_fedora bash -c "cd $HOME/build/$TRAVIS_REPO_SLUG ; make build_rpm" From bfe4c148a5986fde55c226fad07f06173b81fa85 Mon Sep 17 00:00:00 2001 From: Tim Hughes Date: Thu, 29 Oct 2015 21:58:29 +0000 Subject: [PATCH 4/6] add in make target --- Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Makefile b/Makefile index 232c7a6..3ac7fef 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,9 @@ DOCKER_IMAGE_NAME=adnanh/webhook CONTAINER_NAME=webhook +COMMIT := $(shell git rev-parse HEAD) +SHORTCOMMIT := $(shell git rev-parse HEAD|cut -c-7) +TEMPDIR := $(shell mktemp -d) + docker-build: Dockerfile docker build --force-rm=true --tag=${DOCKER_IMAGE_NAME} . @@ -8,3 +12,8 @@ docker-run: @echo "Here's an example command on how to run a webhook container:" @echo "docker run -d -p 9000:9000 -v /etc/webhook:/etc/webhook --name=${CONTAINER_NAME} \\" @echo " ${DOCKER_IMAGE_NAME} -verbose -hooks=/etc/webhook/hooks.json -hotreload" + +build_rpm: + git archive --format=tar.gz --prefix webhook-$(COMMIT)/ --output $(TEMPDIR)/webhook-$(SHORTCOMMIT).tar.gz $(COMMIT) + rpmbuild -ta --define "_commit $(COMMIT)" $(TEMPDIR)/webhook-$(SHORTCOMMIT).tar.gz + From 64b32564086bd81c3d5f000fc1799cb76a5fa28c Mon Sep 17 00:00:00 2001 From: Tim Hughes Date: Thu, 29 Oct 2015 22:04:19 +0000 Subject: [PATCH 5/6] enable unit tests and add in init script and example hooks.json file to rpmspec --- golang-github-adnanh-webhook.spec | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/golang-github-adnanh-webhook.spec b/golang-github-adnanh-webhook.spec index a108277..be36131 100644 --- a/golang-github-adnanh-webhook.spec +++ b/golang-github-adnanh-webhook.spec @@ -3,7 +3,7 @@ %global with_bundled 0 %global with_debug 1 %global with_check 1 -%global with_unit_test 0 +%global with_unit_test 1 %else %global with_devel 0 %global with_bundled 0 @@ -111,6 +111,10 @@ export GOPATH=$(pwd):$(pwd)/Godeps/_workspace:%{gopath} %install install -d -p %{buildroot}%{_bindir} install -p -m 0755 bin/webhook %{buildroot}%{_bindir} +install -d -p %{buildroot}%{_initrddir} +install -p -m 0755 webhook.init %{buildroot}%{_initrddir}/webhook +install -d -p %{buildroot}%{_sysconfdir}/webhook/ +install -p -m 0640 hooks.json.example %{buildroot}%{_sysconfdir}/webhook/ # source codes for building projects %if 0%{?with_devel} @@ -129,7 +133,7 @@ done %if 0%{?with_unit_test} && 0%{?with_devel} install -d -p %{buildroot}/%{gopath}/src/%{import_path}/ # find all *_test.go files and generate unit-test-devel.file-list -for file in $(find . -iname "*_test.go" -iname "hooks.json.example"); do +for file in $(find . -iname "*_test.go" -or -iname "hooks.json.example"); do echo "%%dir %%{gopath}/src/%%{import_path}/$(dirname $file)" >> devel.file-list install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file) cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file @@ -158,7 +162,9 @@ export GOPATH=%{buildroot}/%{gopath}:$(pwd)/Godeps/_workspace:%{gopath} %files %license LICENSE %doc README.md hooks.json.example +%config(noreplace)%{_sysconfdir}/webhook/* %{_bindir}/webhook +%{_initrddir}/webhook %if 0%{?with_devel} %files devel -f devel.file-list From d1b4ef767af014342d9cc160056f7977a7b89310 Mon Sep 17 00:00:00 2001 From: Tim Hughes Date: Fri, 30 Oct 2015 01:17:06 +0000 Subject: [PATCH 6/6] Add travis test status badge to README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f3f403..54fdb91 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Join the chat at https://gitter.im/adnanh/webhook](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/adnanh/webhook?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Flattr this](https://button.flattr.com/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=adnanh&url=https%3A%2F%2Fwww.github.com%2Fadnanh%2Fwebhook) +[![Join the chat at https://gitter.im/adnanh/webhook](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/adnanh/webhook?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Flattr this](https://button.flattr.com/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=adnanh&url=https%3A%2F%2Fwww.github.com%2Fadnanh%2Fwebhook) [![Build Status](https://travis-ci.org/adnanh/webhook.svg?branch=master)](https://travis-ci.org/adnanh/webhook) # What is webhook? [webhook](https://github.com/adnanh/webhook/) is a lightweight configurable tool written in Go, that allows you to easily create HTTP endpoints (hooks) on your server, which you can use to execute configured commands. You can also pass data from the HTTP request (such as headers, payload or query variables) to your commands. [webhook](https://github.com/adnanh/webhook/) also allows you to specify rules which have to be satisfied in order for the hook to be triggered.