diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..28fb2f8 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,80 @@ +workspace: + base: /srv/app + path: src/github.com/appleboy/drone-jenkins + +pipeline: + clone: + image: plugins/git + tags: true + + # restore the cache from an sftp server + restore_cache: + image: appleboy/drone-sftp-cache + pull: true + restore: true + mount: [ .glide, vendor ] + ignore_branch: true + + test: + image: appleboy/golang-testing + pull: true + environment: + TAGS: netgo + GOPATH: /srv/app + commands: + - make dep_install + - make vet + - make lint + - make test + - make coverage + - make build + # build binary for docker image + - make static_build + when: + event: [ push, tag, pull_request ] + + release: + image: appleboy/golang-testing + pull: true + environment: + TAGS: netgo + GOPATH: /srv/app + commands: + - make release + when: + event: [ tag ] + branch: [ refs/tags/* ] + + docker: + image: plugins/docker + repo: ${DRONE_REPO} + tags: [ '${DRONE_TAG}' ] + when: + event: [ tag ] + branch: [ refs/tags/* ] + + docker: + image: plugins/docker + repo: ${DRONE_REPO} + tags: [ 'latest' ] + when: + event: [ push ] + branch: [ master ] + + github: + image: plugins/github-release + files: + - dist/release/* + when: + event: [ tag ] + branch: [ refs/tags/* ] + + # rebuild the cache on the sftp server + rebuild_cache: + image: appleboy/drone-sftp-cache + pull: true + rebuild: true + mount: [ .glide, vendor ] + ignore_branch: true + when: + branch: master diff --git a/.drone.yml.sig b/.drone.yml.sig new file mode 100644 index 0000000..8c351b2 --- /dev/null +++ b/.drone.yml.sig @@ -0,0 +1 @@ +eyJhbGciOiJIUzI1NiJ9.d29ya3NwYWNlOgogIGJhc2U6IC9zcnYvYXBwCiAgcGF0aDogc3JjL2dpdGh1Yi5jb20vYXBwbGVib3kvZHJvbmUtamVua2lucwoKcGlwZWxpbmU6CiAgY2xvbmU6CiAgICBpbWFnZTogcGx1Z2lucy9naXQKICAgIHRhZ3M6IHRydWUKCiAgIyByZXN0b3JlIHRoZSBjYWNoZSBmcm9tIGFuIHNmdHAgc2VydmVyCiAgcmVzdG9yZV9jYWNoZToKICAgIGltYWdlOiBhcHBsZWJveS9kcm9uZS1zZnRwLWNhY2hlCiAgICBwdWxsOiB0cnVlCiAgICByZXN0b3JlOiB0cnVlCiAgICBtb3VudDogWyAuZ2xpZGUsIHZlbmRvciBdCiAgICBpZ25vcmVfYnJhbmNoOiB0cnVlCgogIHRlc3Q6CiAgICBpbWFnZTogYXBwbGVib3kvZ29sYW5nLXRlc3RpbmcKICAgIHB1bGw6IHRydWUKICAgIGVudmlyb25tZW50OgogICAgICBUQUdTOiBuZXRnbwogICAgICBHT1BBVEg6IC9zcnYvYXBwCiAgICBjb21tYW5kczoKICAgICAgLSBtYWtlIGRlcF9pbnN0YWxsCiAgICAgIC0gbWFrZSB2ZXQKICAgICAgLSBtYWtlIGxpbnQKICAgICAgLSBtYWtlIHRlc3QKICAgICAgLSBtYWtlIGNvdmVyYWdlCiAgICAgIC0gbWFrZSBidWlsZAogICAgICAjIGJ1aWxkIGJpbmFyeSBmb3IgZG9ja2VyIGltYWdlCiAgICAgIC0gbWFrZSBzdGF0aWNfYnVpbGQKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2gsIHRhZywgcHVsbF9yZXF1ZXN0IF0KCiAgcmVsZWFzZToKICAgIGltYWdlOiBhcHBsZWJveS9nb2xhbmctdGVzdGluZwogICAgcHVsbDogdHJ1ZQogICAgZW52aXJvbm1lbnQ6CiAgICAgIFRBR1M6IG5ldGdvCiAgICAgIEdPUEFUSDogL3Nydi9hcHAKICAgIGNvbW1hbmRzOgogICAgICAtIG1ha2UgcmVsZWFzZQogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgdGFnIF0KICAgICAgYnJhbmNoOiBbIHJlZnMvdGFncy8qIF0KCiAgZG9ja2VyOgogICAgaW1hZ2U6IHBsdWdpbnMvZG9ja2VyCiAgICByZXBvOiAke0RST05FX1JFUE99CiAgICB0YWdzOiBbICcke0RST05FX1RBR30nIF0KICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHRhZyBdCiAgICAgIGJyYW5jaDogWyByZWZzL3RhZ3MvKiBdCgogIGRvY2tlcjoKICAgIGltYWdlOiBwbHVnaW5zL2RvY2tlcgogICAgcmVwbzogJHtEUk9ORV9SRVBPfQogICAgdGFnczogWyAnbGF0ZXN0JyBdCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoIF0KICAgICAgYnJhbmNoOiBbIG1hc3RlciBdCgogIGdpdGh1YjoKICAgIGltYWdlOiBwbHVnaW5zL2dpdGh1Yi1yZWxlYXNlCiAgICBmaWxlczoKICAgICAgLSBkaXN0L3JlbGVhc2UvKgogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgdGFnIF0KICAgICAgYnJhbmNoOiBbIHJlZnMvdGFncy8qIF0KCiAgIyByZWJ1aWxkIHRoZSBjYWNoZSBvbiB0aGUgc2Z0cCBzZXJ2ZXIKICByZWJ1aWxkX2NhY2hlOgogICAgaW1hZ2U6IGFwcGxlYm95L2Ryb25lLXNmdHAtY2FjaGUKICAgIHB1bGw6IHRydWUKICAgIHJlYnVpbGQ6IHRydWUKICAgIG1vdW50OiBbIC5nbGlkZSwgdmVuZG9yIF0KICAgIGlnbm9yZV9icmFuY2g6IHRydWUKICAgIHdoZW46CiAgICAgIGJyYW5jaDogbWFzdGVyCg.6JgOuyvwKlOK6Hs1hD2dFaWGrtnRjVClYH-jQk-Wgq4 \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 49e667e..6e69b8e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ before_install: - curl https://glide.sh/get | sh install: - - make install + - make dep_install script: - make test diff --git a/Makefile b/Makefile index 1dc61f4..65fb1fb 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,17 @@ -.PHONY: install build test html update docker_build docker_image docker docker_deploy clean +.PHONY: test drone-jenkins build fmt vet errcheck lint install update release-dirs release-build release-copy release-check release coverage -VERSION := $(shell git describe --tags --always || git rev-parse --short HEAD) -DEPLOY_ACCOUNT := "appleboy" -DEPLOY_IMAGE := "drone-jenkins" +DIST := dist +EXECUTABLE := drone-jenkins + +# for dockerhub +DEPLOY_ACCOUNT := appleboy +DEPLOY_IMAGE := $(EXECUTABLE) + +TARGETS ?= linux darwin windows +PACKAGES ?= $(shell go list ./... | grep -v /vendor/) +SOURCES ?= $(shell find . -name "*.go" -type f) +TAGS ?= +LDFLAGS += -X 'main.Version=$(VERSION)' ifneq ($(shell uname), Darwin) EXTLDFLAGS = -extldflags "-static" $(null) @@ -10,39 +19,96 @@ else EXTLDFLAGS = endif -install: - glide install +ifneq ($(DRONE_TAG),) + VERSION ?= $(DRONE_TAG) +else + VERSION ?= $(shell git describe --tags --always || git rev-parse --short HEAD) +endif -build: - go build -ldflags="$(EXTLDFLAGS)-s -w -X main.Version=$(VERSION)" +all: build + +fmt: + find . -name "*.go" -type f -not -path "./vendor/*" | xargs gofmt -s -w + +vet: + go vet $(PACKAGES) + +errcheck: + @which errcheck > /dev/null; if [ $$? -ne 0 ]; then \ + go get -u github.com/kisielk/errcheck; \ + fi + errcheck $(PACKAGES) + +lint: + @which golint > /dev/null; if [ $$? -ne 0 ]; then \ + go get -u github.com/golang/lint/golint; \ + fi + for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done; test: - go test -v -coverprofile=coverage.txt + for PKG in $(PACKAGES); do go test -v -cover -coverprofile $$GOPATH/src/$$PKG/coverage.txt $$PKG || exit 1; done; html: go tool cover -html=coverage.txt -update: +dep_install: + glide install + +dep_update: glide up -docker_build: - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags netgo -ldflags="-X main.Version=$(VERSION)" +install: $(SOURCES) + go install -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' + +build: $(EXECUTABLE) + +$(EXECUTABLE): $(SOURCES) + go build -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o $@ + +release: release-dirs release-build release-copy release-check + +release-dirs: + mkdir -p $(DIST)/binaries $(DIST)/release + +release-build: + @which gox > /dev/null; if [ $$? -ne 0 ]; then \ + go get -u github.com/mitchellh/gox; \ + fi + gox -os="$(TARGETS)" -arch="amd64 386" -tags="$(TAGS)" -ldflags="-s -w $(LDFLAGS)" -output="$(DIST)/binaries/$(EXECUTABLE)-$(VERSION)-{{.OS}}-{{.Arch}}" + +release-copy: + $(foreach file,$(wildcard $(DIST)/binaries/$(EXECUTABLE)-*),cp $(file) $(DIST)/release/$(notdir $(file));) + +release-check: + cd $(DIST)/release; $(foreach file,$(wildcard $(DIST)/release/$(EXECUTABLE)-*),sha256sum $(notdir $(file)) > $(notdir $(file)).sha256;) + +# for docker. +static_build: + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o $(DEPLOY_IMAGE) docker_image: - docker build --rm -t $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE) . + docker build -t $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE) . -docker: docker_build docker_image +docker: static_build docker_image docker_deploy: ifeq ($(tag),) @echo "Usage: make $@ tag=" @exit 1 endif + # deploy image docker tag $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):latest $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag) docker push $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag) +coverage: + sed -i '/main.go/d' coverage.txt + curl -s https://codecov.io/bash > .codecov && \ + chmod +x .codecov && \ + ./.codecov -f coverage.txt + clean: - rm -rf coverage.txt $(DEPLOY_IMAGE) + go clean -x -i ./... + rm -rf coverage.txt $(EXECUTABLE) $(DIST) vendor version: @echo $(VERSION)