# Semaphore Tasks # These tasks should be used to build and develop Semaphore # # Tasks without a `desc:` field are intended mainly to be called # internally by other tasks and therefore are not listed when running `task` or `task -l` version: '2' vars: docker_namespace: ansiblesemaphore docker_image: semaphore tasks: all: desc: Install, Compile, Test and Build Semaphore for local architecture cmds: - task: deps - task: compile - task: test - task: build:local deps: desc: Install all dependencies (except dredd requirements) cmds: - task: deps:tools - task: deps:be - task: deps:fe2 deps:be: desc: Vendor application dependencies cmds: - go mod vendor deps:fe2: desc: Installs npm requirements for front end from package.json dir: web2 cmds: - npm install - npm audit fix deps:integration: desc: Installs requirements for integration testing with dredd dir: web2 cmds: - npm install dredd@13.1.2 - npm audit fix deps:tools: desc: Installs tools needed dir: web2 vars: GORELEASER_VERSION: "0.159.0" GOLINTER_VERSION: "1.31.0" cmds: - go install github.com/gobuffalo/packr/...@v1.10.4 - go install github.com/haya14busa/goverage@latest - go install github.com/snikch/goodman/cmd/goodman@latest - go install github.com/go-swagger/go-swagger/cmd/swagger@latest - '{{ if ne OS "windows" }} sh -c "curl -L https://github.com/goreleaser/goreleaser/releases/download/v{{ .GORELEASER_VERSION }}/goreleaser_$(uname -s)_$(uname -m).tar.gz | tar -xz -C $(go env GOPATH)/bin goreleaser"{{ else }} {{ end }}' - '{{ if ne OS "windows" }} chmod +x $(go env GOPATH)/bin/goreleaser{{ else }} {{ end }}' - '{{ if eq OS "windows" }} echo "NOTICE: You must download goreleaser manually to build this application https://github.com/goreleaser/goreleaser/releases "{{ else }}:{{ end }}' - '{{ if ne OS "windows" }} sh -c "curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v{{ .GOLINTER_VERSION }}"{{ else }}{{ end }}' - '{{ if eq OS "windows" }} echo "NOTICE: You need to install golangci-lint manually to build this application https://github.com/golangci/golangci-lint#install"{{ else }}{{ end }}' compile: desc: Generates compiled frontend and backend resources (must be in this order) cmds: - task: compile:fe2 - task: compile:be compile:fe2: desc: Build vue.js project dir: web2 sources: - src/*.* - src/**/*.* - public/index.html - public/favicon.ico - package.json - package-lock.json - babel.config.js - vue.config.js generates: - dist/css/*.css - dist/js/*.js - dist/index.html - dist/favicon.ico cmds: - npm run build compile:be: desc: Runs Packr for static assets sources: - web2/dist/* - db/migrations/* generates: - db/db-packr.go - api/api-packr.go cmds: - mkdir -p web2/dist - go run util/version_gen/generator.go {{ if .TAG }}{{ .TAG }}{{ else }}{{ if .SEMAPHORE_VERSION }}{{ .SEMAPHORE_VERSION }}{{ else }}{{ .BRANCH }}-{{ .SHA }}-{{ .TIMESTAMP }}{{ if .DIRTY }}-dirty{{ end }}{{ end }}{{end}} - packr vars: TAG: sh: git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed -n 's/^\([^^~]\{1,\}\)\(\^0\)\{0,1\}$/\1/p' BRANCH: sh: git rev-parse --abbrev-ref HEAD DIRTY: # We must exclude the package-lock file as npm install can change it! sh: git diff --exit-code --stat -- . ':(exclude)web2/package-lock.json' ':(exclude)web2/package.json' || true SHA: sh: git log --pretty=format:'%h' -n 1 TIMESTAMP: sh: date +%s compile:api:hooks: dir: ./.dredd/hooks cmds: - go build -o ../compiled_hooks{{ if eq OS "windows" }}.exe{{ end }} build: desc: Build a full set of release binaries and packages cmds: - task: release build:local: desc: Build a binary for the current architecture dir: cli cmds: - go build -o ../bin/semaphore{{ if eq OS "windows" }}.exe{{ end }} release: desc: creates a release without performing validations or publishing artifacts cmds: - goreleaser --snapshot --rm-dist release:prod: cmds: - goreleaser lint: cmds: - task: lint:be lint:be: # --errors cmds: - golangci-lint run --skip-files "\w*(-packr.go)" --disable goconst --timeout 240s ./... test: cmds: - task: test:be test:be: desc: Run go code tests cmds: - go vet ./... - swagger validate ./api-docs.yml # 2> /dev/null makes goverage less noisy about pattern matching # if no tests exist but will still print failing test results - goverage -v -coverprofile=coverage.out ./... 2> /dev/null test:api: desc: test the api with dredd cmds: - ./web2/node_modules/.bin/dredd --config .dredd/dredd.yml ci:artifacts: cmds: - rsync -a bin/ $CIRCLE_ARTIFACTS/ # docker(-compose) commands dc:dev: desc: build and start a development stack using docker-compose cmds: - task: docker vars: context: dev args: build semaphore_dev compose: true - task: dc:up vars: context: dev # convenience function to build and start a production like stack dc:prod: desc: build and start a production like stack using docker-compose cmds: - task: docker vars: context: prod args: build semaphore compose: true - task: dc:up vars: context: prod dc:up: desc: start a docker-compose instance, requires context cmds: - task: docker vars: compose: true args: up --abort-on-container-exit context: "{{ .context }}" dc:build: desc: build a set of docker-compose containers, requires context cmds: - task: docker vars: compose: true args: build context: "{{ .context }}" dc:down: desc: down a docker-compose instance, requires context cmds: - task: docker vars: compose: true args: down context: "{{ .context }}" dc:stop: desc: stop a docker-compose instance, requires context cmds: - task: docker vars: compose: true args: stop context: "{{ .context }}" dc:build:dredd: desc: build a dredd container to the local testing with docker-compose stack cmds: - task: docker vars: context: dev compose: true prefix: -dredd args: build dc:up:dredd: desc: build a dredd container to the local testing with docker-compose stack cmds: - task: docker vars: context: dev compose: true prefix: -dredd args: up docker:build: desc: Build an image for Semaphore, requires context vars: tag: "{{ if .tag }}{{ .tag }}{{ else }}latest{{ end }}" cmds: - task: docker vars: context: "{{ .context }}" action: build tag: "{{ .tag }}" args: -t "{{ .docker_namespace }}/{{ .docker_image }}:{{ .tag }}" . deps:docker: desc: Install docker testing dependencies. These must be installed explicitly and are not included in the general deps task. status: - test -f /usr/local/bin/goss - test -f /usr/local/bin/dgoss - test -f /usr/local/bin/hadolint cmds: - sudo curl -L https://github.com/aelsabbahy/goss/releases/download/v0.3.5/goss-linux-amd64 -o /usr/local/bin/goss - sudo chmod +rx /usr/local/bin/goss - sudo curl -L https://raw.githubusercontent.com/aelsabbahy/goss/v0.3.5/extras/dgoss/dgoss -o /usr/local/bin/dgoss - sudo chmod +rx /usr/local/bin/dgoss - sudo curl -L https://github.com/hadolint/hadolint/releases/download/v1.5.0/hadolint-Linux-x86_64 -o /usr/local/bin/hadolint - sudo chmod +rx /usr/local/bin/hadolint docker:test: desc: Test docker containers by building them, running tests and deleting deps: ['deps:docker'] cmds: - task: docker:lint vars: context: "{{ .context }}" - task: docker:build vars: tag: "{{ .context }}-test" - task: docker:goss - docker rmi "{{ .docker_namespace }}/{{ .docker_image }}:{{ .context }}-test" docker:goss: dir: "deployment/docker/{{ .context}}" deps: ['deps:docker'] cmds: - GOSS_FILES_STRATEGY='cp' dgoss run -it "{{ .docker_namespace }}/{{ .docker_image }}:{{ .context }}-test" docker:lint: desc: hadolint a dockerfile. Ignores version pinning warning dir: "deployment/docker/{{ .context}}" cmds: - hadolint Dockerfile --ignore DL3018 docker:push: desc: push a docker image to a repo. Defaults to the official docker hub cmds: - docker push {{ .docker_namespace }}/{{ .docker_image }}:{{ .tag }} # templated command to reduce code duplication docker: vars: docker_root: deployment/docker/ cmds: - docker{{ if .compose }}-compose{{ end }} {{ if .action }}{{ .action }}{{ end }} -f {{ .docker_root }}{{ .context }}/{{ if .compose }}docker-compose{{ if .prefix }}{{ .prefix }}{{ end }}.yml{{ else }}Dockerfile{{ if .prefix }}{{ .prefix }}{{ end }}{{ end }} {{if .args }}{{ .args }}{{ end }}