diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..2326b11 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,57 @@ +workspace: + base: /srv/app + path: src/github.com/appleboy/drone-line + +pipeline: + test: + image: appleboy/golang-testing + pull: true + environment: + TAGS: netgo + GOPATH: /srv/app + commands: + - make dep_install + - make vet + - make lint + - make test + - 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: appleboy/drone-line + tags: [ '${DRONE_TAG}' ] + when: + event: [ tag ] + branch: [ refs/tags/* ] + + docker: + image: plugins/docker + repo: appleboy/drone-line + tags: [ 'latest' ] + when: + event: [ push ] + branch: [ master ] + + github: + image: plugins/github-release + files: + - dist/release/* + when: + event: [ tag ] + branch: [ refs/tags/* ] diff --git a/.gitignore b/.gitignore index 5ec3e1e..34fa2b1 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ vendor drone-scp coverage.txt .env +dist diff --git a/Makefile b/Makefile index 9fdca22..308d372 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-line build fmt vet errcheck lint install update release-dirs release-build release-copy release-check release -VERSION := $(shell git describe --tags --always || git rev-parse --short HEAD) -DEPLOY_ACCOUNT := "appleboy" -DEPLOY_IMAGE := "drone-scp" +DIST := dist +EXECUTABLE := drone-scp + +# 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,92 @@ 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: + go fmt $(PACKAGES) + +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 -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: line_build + +line_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 -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 line image docker tag $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):latest $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag) docker push $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag) clean: - rm -rf coverage.txt $(DEPLOY_IMAGE) + go clean -x -i ./... + rm -rf coverage.txt $(EXECUTABLE) $(DIST) vendor version: @echo $(VERSION) diff --git a/easyssh/easyssh.go b/easyssh/easyssh.go index 3986536..f33c6c3 100644 --- a/easyssh/easyssh.go +++ b/easyssh/easyssh.go @@ -16,7 +16,7 @@ import ( "golang.org/x/crypto/ssh/agent" ) -// Contains main authority information. +// MakeConfig Contains main authority information. // User field should be a name of user on remote server (ex. john in ssh john@example.com). // Server field should be a remote machine address (ex. example.com in ssh john@example.com) // Key is a path to private key on your local machine. @@ -107,7 +107,7 @@ func (ssh_conf *MakeConfig) Stream(command string) (output chan string, done cha return outputChan, done, err } -// Runs command on remote machine and returns its stdout as a string +// Run command on remote machine and returns its stdout as a string func (ssh_conf *MakeConfig) Run(command string) (outStr string, err error) { outChan, doneChan, err := ssh_conf.Stream(command) if err != nil {