github.com/alloyci/alloy-runner@v1.0.1-0.20180222164613-925503ccafd6/Makefile (about)

     1  NAME ?= alloy-runner
     2  PACKAGE_NAME ?= $(NAME)
     3  export VERSION := $(shell ./ci/version)
     4  REVISION := $(shell git rev-parse --short=8 HEAD || echo unknown)
     5  BRANCH := $(shell git show-ref | grep "$(REVISION)" | grep -v HEAD | awk '{print $$2}' | sed 's|refs/remotes/origin/||' | sed 's|refs/heads/||' | sort | head -n 1)
     6  BUILT := $(shell date +%Y-%m-%dT%H:%M:%S%:z)
     7  TESTFLAGS ?= -cover
     8  
     9  LATEST_STABLE_TAG := $(shell git -c versionsort.prereleaseSuffix="-rc" -c versionsort.prereleaseSuffix="-RC" tag -l "v*.*.*" --sort=-v:refname | awk '!/rc/' | head -n 1)
    10  export IS_LATEST :=
    11  ifeq ($(shell git describe --exact-match --match $(LATEST_STABLE_TAG) >/dev/null 2>&1; echo $$?), 0)
    12  export IS_LATEST := true
    13  endif
    14  
    15  PACKAGE_CLOUD ?= alloyci/alloy-runner
    16  PACKAGE_CLOUD_URL ?= https://packagecloud.io/
    17  BUILD_PLATFORMS ?= -os '!netbsd' -os '!openbsd'
    18  S3_UPLOAD_PATH ?= master
    19  # Keep in sync with docs/install/linux-repository.md
    20  DEB_PLATFORMS ?= debian/wheezy debian/jessie debian/stretch debian/buster \
    21      ubuntu/trusty ubuntu/xenial ubuntu/zesty ubuntu/artful \
    22      raspbian/wheezy raspbian/jessie raspbian/stretch raspbian/buster \
    23      linuxmint/qiana linuxmint/rebecca linuxmint/rafaela linuxmint/rosa linuxmint/sarah linuxmint/serena linuxmint/sonya
    24  DEB_ARCHS ?= amd64 i386 armel armhf
    25  RPM_PLATFORMS ?= el/6 el/7 \
    26      ol/6 ol/7 \
    27      fedora/25 fedora/26
    28  RPM_ARCHS ?= x86_64 i686 arm armhf
    29  
    30  PKG = gitlab.com/gitlab-org/gitlab-runner
    31  COMMON_PACKAGE_NAMESPACE=$(PKG)/common
    32  
    33  BUILD_DIR := $(CURDIR)
    34  TARGET_DIR := $(BUILD_DIR)/out
    35  
    36  ORIGINAL_GOPATH = $(shell echo $$GOPATH)
    37  LOCAL_GOPATH := $(CURDIR)/.gopath
    38  GOPATH_SETUP := $(LOCAL_GOPATH)/.ok
    39  GOPATH_BIN := $(LOCAL_GOPATH)/bin
    40  PKG_BUILD_DIR := $(LOCAL_GOPATH)/src/$(PKG)
    41  
    42  export GOPATH = $(LOCAL_GOPATH)
    43  export PATH := $(GOPATH_BIN):$(PATH)
    44  
    45  # Packages in vendor/ are included in ./...
    46  # https://github.com/golang/go/issues/11659
    47  OUR_PACKAGES ?= $(subst _$(BUILD_DIR),$(PKG),$(shell go list ./... | grep -v '/vendor/'))
    48  
    49  GO_LDFLAGS ?= -X $(COMMON_PACKAGE_NAMESPACE).NAME=$(PACKAGE_NAME) -X $(COMMON_PACKAGE_NAMESPACE).VERSION=$(VERSION) \
    50                -X $(COMMON_PACKAGE_NAMESPACE).REVISION=$(REVISION) -X $(COMMON_PACKAGE_NAMESPACE).BUILT=$(BUILT) \
    51                -X $(COMMON_PACKAGE_NAMESPACE).BRANCH=$(BRANCH) \
    52                -s -w
    53  GO_FILES ?= $(shell find . -name '*.go' | grep -v './.gopath/')
    54  export CGO_ENABLED ?= 0
    55  
    56  
    57  # Development Tools
    58  GOX = $(GOPATH_BIN)/gox
    59  GOBINDATA = $(GOPATH_BIN)/go-bindata
    60  MOCKERY = $(GOPATH_BIN)/mockery
    61  DEVELOPMENT_TOOLS = $(GOX) $(GOBINDATA) $(MOCKERY)
    62  
    63  MOCKERY_FLAGS = -note="This comment works around https://github.com/vektra/mockery/issues/155"
    64  
    65  .PHONY: clean version mocks
    66  
    67  all: deps build
    68  
    69  help:
    70  	# Commands:
    71  	# make all => deps build
    72  	# make version - show information about current version
    73  	#
    74  	# Development commands:
    75  	# make install - install the version suitable for your OS as alloy-runner
    76  	# make docker - build docker dependencies
    77  	#
    78  	# Testing commands:
    79  	# make test - run project tests
    80  	# make codequality - run code quality analysis
    81  	#
    82  	# Deployment commands:
    83  	# make deps - install all dependencies
    84  	# make build - build project for all supported OSes
    85  	# make package - package project using FPM
    86  	# make packagecloud - send all packages to packagecloud
    87  	# make packagecloud-yank - remove specific version from packagecloud
    88  
    89  version:
    90  	@echo Current version: $(VERSION)
    91  	@echo Current revision: $(REVISION)
    92  	@echo Current branch: $(BRANCH)
    93  	@echo Build platforms: $(BUILD_PLATFORMS)
    94  	@echo DEB platforms: $(DEB_PLATFORMS)
    95  	@echo RPM platforms: $(RPM_PLATFORMS)
    96  	@echo IS_LATEST: $(IS_LATEST)
    97  
    98  deps: $(DEVELOPMENT_TOOLS)
    99  
   100  codequality:
   101  	./scripts/codequality analyze --dev
   102  
   103  out/docker/prebuilt-x86_64.tar.xz: $(GO_FILES) $(GOX)
   104  	# Create directory
   105  	mkdir -p out/docker
   106  
   107  ifneq (, $(shell docker info))
   108  	# Building gitlab-runner-helper
   109  	gox -osarch=linux/amd64 \
   110  		-ldflags "$(GO_LDFLAGS)" \
   111  		-output="dockerfiles/build/gitlab-runner-helper" \
   112  		$(PKG)/apps/gitlab-runner-helper
   113  
   114  	# Build docker images
   115  	docker build -t gitlab/gitlab-runner-helper:x86_64-$(REVISION) -f dockerfiles/build/Dockerfile.x86_64 dockerfiles/build
   116  	-docker rm -f gitlab-runner-prebuilt-x86_64-$(REVISION)
   117  	docker create --name=gitlab-runner-prebuilt-x86_64-$(REVISION) gitlab/gitlab-runner-helper:x86_64-$(REVISION) /bin/sh
   118  	docker export -o out/docker/prebuilt-x86_64.tar gitlab-runner-prebuilt-x86_64-$(REVISION)
   119  	docker rm -f gitlab-runner-prebuilt-x86_64-$(REVISION)
   120  	xz -f -9 out/docker/prebuilt-x86_64.tar
   121  else
   122  	$(warning =============================================)
   123  	$(warning WARNING: downloading prebuilt docker images that will be embedded in gitlab-runner)
   124  	$(warning WARNING: to use images compiled from your code install Docker Engine)
   125  	$(warning WARNING: and remove out/docker/prebuilt-x86_64.tar.xz)
   126  	$(warning =============================================)
   127  	curl -o out/docker/prebuilt-x86_64.tar.xz \
   128  		https://gitlab-runner-downloads.s3.amazonaws.com/master/docker/prebuilt-x86_64.tar.xz
   129  endif
   130  
   131  out/docker/prebuilt-arm.tar.xz: $(GO_FILES) $(GOX)
   132  	# Create directory
   133  	mkdir -p out/docker
   134  
   135  ifneq (, $(shell docker info))
   136  	# Building gitlab-runner-helper
   137  	gox -osarch=linux/arm \
   138  		-ldflags "$(GO_LDFLAGS)" \
   139  		-output="dockerfiles/build/gitlab-runner-helper" \
   140  		$(PKG)/apps/gitlab-runner-helper
   141  
   142  	# Build docker images
   143  	docker run --rm --privileged multiarch/qemu-user-static:register --reset
   144  	docker build -t gitlab/gitlab-runner-helper:arm-$(REVISION) -f dockerfiles/build/Dockerfile.arm dockerfiles/build
   145  	-docker rm -f gitlab-runner-prebuilt-arm-$(REVISION)
   146  	docker create --name=gitlab-runner-prebuilt-arm-$(REVISION) gitlab/gitlab-runner-helper:arm-$(REVISION) /bin/sh
   147  	docker export -o out/docker/prebuilt-arm.tar gitlab-runner-prebuilt-arm-$(REVISION)
   148  	docker rm -f gitlab-runner-prebuilt-arm-$(REVISION)
   149  	xz -f -9 out/docker/prebuilt-arm.tar
   150  else
   151  	$(warning =============================================)
   152  	$(warning WARNING: downloading prebuilt docker images that will be embedded in gitlab-runner)
   153  	$(warning WARNING: to use images compiled from your code install Docker Engine)
   154  	$(warning WARNING: and remove out/docker/prebuilt-arm.tar.xz)
   155  	$(warning =============================================)
   156  	curl -o out/docker/prebuilt-arm.tar.xz \
   157  		https://gitlab-runner-downloads.s3.amazonaws.com/master/docker/prebuilt-arm.tar.xz
   158  endif
   159  
   160  executors/docker/bindata.go: out/docker/prebuilt-x86_64.tar.xz out/docker/prebuilt-arm.tar.xz $(GOBINDATA)
   161  	# Generating embedded data
   162  	go-bindata \
   163  		-pkg docker \
   164  		-nocompress \
   165  		-nomemcopy \
   166  		-nometadata \
   167  		-prefix out/docker/ \
   168  		-o executors/docker/bindata.go \
   169  		out/docker/prebuilt-x86_64.tar.xz \
   170  		out/docker/prebuilt-arm.tar.xz
   171  	go fmt executors/docker/bindata.go
   172  
   173  docker: executors/docker/bindata.go
   174  
   175  build: executors/docker/bindata.go $(GOX)
   176  	# Building $(NAME) in version $(VERSION) for $(BUILD_PLATFORMS)
   177  	gox $(BUILD_PLATFORMS) \
   178  		-ldflags "$(GO_LDFLAGS)" \
   179  		-output="out/binaries/$(NAME)-{{.OS}}-{{.Arch}}" \
   180  		$(PKG)
   181  
   182  build_simple: $(GOPATH_SETUP)
   183  	# Building $(NAME) in version $(VERSION) for current platform
   184  	go build \
   185  		-ldflags "$(GO_LDFLAGS)" \
   186  		-o "out/binaries/$(NAME)" \
   187  		$(PKG)
   188  
   189  build_current: executors/docker/bindata.go build_simple
   190  
   191  check_race_conditions: executors/docker/bindata.go
   192  	@./scripts/check_race_conditions $(OUR_PACKAGES)
   193  
   194  test: executors/docker/bindata.go
   195  	# Running tests...
   196  	go test $(OUR_PACKAGES) $(TESTFLAGS)
   197  
   198  install: executors/docker/bindata.go
   199  	go install --ldflags="$(GO_LDFLAGS)" $(PKG)
   200  
   201  dockerfiles:
   202  	make -C dockerfiles all
   203  
   204  # We rely on user GOPATH 'cause mockery seems not to be able to find dependencies in vendor directory
   205  mocks: $(MOCKERY)
   206  	rm -rf ./helpers/service/mocks
   207  	find . -type f -name 'mock_*' -delete
   208  	GOPATH=$(ORIGINAL_GOPATH) mockery $(MOCKERY_FLAGS) -dir=./vendor/github.com/ayufan/golang-kardianos-service -output=./helpers/service/mocks -name='(Interface|Logger)'
   209  	GOPATH=$(ORIGINAL_GOPATH) mockery $(MOCKERY_FLAGS) -dir=./helpers/docker -all -inpkg
   210  	GOPATH=$(ORIGINAL_GOPATH) mockery $(MOCKERY_FLAGS) -dir=./common -all -inpkg
   211  	GOPATH=$(ORIGINAL_GOPATH) mockery $(MOCKERY_FLAGS) -dir=./shells -name fakeIAMCredentialsProvider -inpkg
   212  
   213  test-docker:
   214  	make test-docker-image IMAGE=centos:6 TYPE=rpm
   215  	make test-docker-image IMAGE=centos:7 TYPE=rpm
   216  	make test-docker-image IMAGE=debian:wheezy TYPE=deb
   217  	make test-docker-image IMAGE=debian:jessie TYPE=deb
   218  	make test-docker-image IMAGE=ubuntu-upstart:precise TYPE=deb
   219  	make test-docker-image IMAGE=ubuntu-upstart:trusty TYPE=deb
   220  	make test-docker-image IMAGE=ubuntu-upstart:utopic TYPE=deb
   221  
   222  test-docker-image:
   223  	tests/test_installation.sh $(IMAGE) out/$(TYPE)/$(PACKAGE_NAME)_amd64.$(TYPE)
   224  	tests/test_installation.sh $(IMAGE) out/$(TYPE)/$(PACKAGE_NAME)_amd64.$(TYPE) Y
   225  
   226  build-and-deploy:
   227  	make build BUILD_PLATFORMS="-os=linux -arch=amd64"
   228  	make package-deb-fpm ARCH=amd64 PACKAGE_ARCH=amd64
   229  	scp out/deb/$(PACKAGE_NAME)_amd64.deb $(SERVER):
   230  	ssh $(SERVER) dpkg -i $(PACKAGE_NAME)_amd64.deb
   231  
   232  build-and-deploy-binary:
   233  	make build BUILD_PLATFORMS="-os=linux -arch=amd64"
   234  	scp out/binaries/$(PACKAGE_NAME)-linux-amd64 $(SERVER):/usr/bin/alloy-runner
   235  
   236  package: package-deps package-prepare package-deb package-rpm
   237  
   238  package-deps:
   239  	# Installing packaging dependencies...
   240  	gem install rake fpm --no-ri --no-rdoc
   241  
   242  package-prepare:
   243  	chmod 755 packaging/root/usr/share/alloy-runner/
   244  	chmod 755 packaging/root/usr/share/alloy-runner/*
   245  
   246  package-deb: package-deps package-prepare
   247  	# Building Debian compatible packages...
   248  	make package-deb-fpm ARCH=amd64 PACKAGE_ARCH=amd64
   249  	make package-deb-fpm ARCH=386 PACKAGE_ARCH=i386
   250  	make package-deb-fpm ARCH=arm PACKAGE_ARCH=armel
   251  	make package-deb-fpm ARCH=arm PACKAGE_ARCH=armhf
   252  
   253  package-rpm: package-deps package-prepare
   254  	# Building RedHat compatible packages...
   255  	make package-rpm-fpm ARCH=amd64 PACKAGE_ARCH=amd64
   256  	make package-rpm-fpm ARCH=386 PACKAGE_ARCH=i686
   257  	make package-rpm-fpm ARCH=arm PACKAGE_ARCH=arm
   258  	make package-rpm-fpm ARCH=arm PACKAGE_ARCH=armhf
   259  
   260  package-deb-fpm:
   261  	@mkdir -p out/deb/
   262  	fpm -s dir -t deb -n $(PACKAGE_NAME) -v $(VERSION) \
   263  		-p out/deb/$(PACKAGE_NAME)_$(PACKAGE_ARCH).deb \
   264  		--deb-priority optional --category admin \
   265  		--force \
   266  		--deb-compression bzip2 \
   267  		--after-install packaging/scripts/postinst.deb \
   268  		--before-remove packaging/scripts/prerm.deb \
   269  		--url https://gitlab.com/AlloyCI/alloy-runner \
   270  		--description "AlloyCI Runner" \
   271  		-m "AlloyCI <support@alloy-ci.com>" \
   272  		--license "MIT" \
   273  		--vendor "Insomniware LLC" \
   274  		--conflicts $(PACKAGE_NAME)-beta \
   275  		--conflicts alloy-ci-multi-runner \
   276  		--conflicts alloy-ci-multi-runner-beta \
   277  		--provides alloy-ci-multi-runner \
   278  		--replaces alloy-ci-multi-runner \
   279  		--depends ca-certificates \
   280  		--depends git \
   281  		--depends curl \
   282  		--depends tar \
   283  		--deb-suggests docker-engine \
   284  		-a $(PACKAGE_ARCH) \
   285  		packaging/root/=/ \
   286  		out/binaries/$(NAME)-linux-$(ARCH)=/usr/bin/alloy-runner
   287  
   288  package-rpm-fpm:
   289  	@mkdir -p out/rpm/
   290  	fpm -s dir -t rpm -n $(PACKAGE_NAME) -v $(VERSION) \
   291  		-p out/rpm/$(PACKAGE_NAME)_$(PACKAGE_ARCH).rpm \
   292  		--rpm-compression bzip2 --rpm-os linux \
   293  		--force \
   294  		--after-install packaging/scripts/postinst.rpm \
   295  		--before-remove packaging/scripts/prerm.rpm \
   296  		--url https://gitlab.com/gitlab-org/alloy-runner \
   297  		--description "AlloyCI Runner" \
   298  		-m "AlloyCI <support@alloy-ci.com>" \
   299  		--license "MIT" \
   300  		--vendor "Insomniware LLC" \
   301  		--conflicts $(PACKAGE_NAME)-beta \
   302  		--conflicts alloy-ci-multi-runner \
   303  		--conflicts alloy-ci-multi-runner-beta \
   304  		--provides alloy-ci-multi-runner \
   305  		--replaces alloy-ci-multi-runner \
   306  		--depends git \
   307  		--depends curl \
   308  		--depends tar \
   309  		-a $(PACKAGE_ARCH) \
   310  		packaging/root/=/ \
   311  		out/binaries/$(NAME)-linux-$(ARCH)=/usr/bin/alloy-runner
   312  
   313  packagecloud: packagecloud-deps packagecloud-deb packagecloud-rpm
   314  
   315  packagecloud-deps:
   316  	# Installing packagecloud dependencies...
   317  	gem install package_cloud --version "~> 0.3.0" --no-ri --no-rdoc
   318  
   319  packagecloud-deb:
   320  	# Sending Debian compatible packages...
   321  	-for DIST in $(DEB_PLATFORMS); do \
   322  		package_cloud push --url $(PACKAGE_CLOUD_URL) $(PACKAGE_CLOUD)/$$DIST out/deb/*.deb; \
   323  	done
   324  
   325  packagecloud-rpm:
   326  	# Sending RedHat compatible packages...
   327  	-for DIST in $(RPM_PLATFORMS); do \
   328  		package_cloud push --url $(PACKAGE_CLOUD_URL) $(PACKAGE_CLOUD)/$$DIST out/rpm/*.rpm; \
   329  	done
   330  
   331  packagecloud-yank:
   332  ifneq ($(YANK),)
   333  	# Removing $(YANK) from packagecloud...
   334  	-for DIST in $(DEB_PLATFORMS); do \
   335  		for ARCH in $(DEB_ARCHS); do \
   336  			package_cloud yank --url $(PACKAGE_CLOUD_URL) $(PACKAGE_CLOUD)/$$DIST $(PACKAGE_NAME)_$(YANK)_$$ARCH.deb & \
   337  		done; \
   338  	done; \
   339  	for DIST in $(RPM_PLATFORMS); do \
   340  		for ARCH in $(RPM_ARCHS); do \
   341  			package_cloud yank --url $(PACKAGE_CLOUD_URL) $(PACKAGE_CLOUD)/$$DIST $(PACKAGE_NAME)-$(YANK)-1.$$ARCH.rpm & \
   342  		done; \
   343  	done; \
   344  	wait
   345  else
   346  	# No version specified in YANK
   347  	@exit 1
   348  endif
   349  
   350  s3-upload:
   351  	export ARTIFACTS_DEST=artifacts; curl -sL https://raw.githubusercontent.com/travis-ci/artifacts/master/install | bash
   352  	./artifacts upload \
   353  		--permissions public-read \
   354  		--working-dir out \
   355  		--target-paths "$(S3_UPLOAD_PATH)/" \
   356  		--max-size $(shell du -bs out/ | cut -f1) \
   357  		$(shell cd out/; find . -type f)
   358  	@echo "\n\033[1m==> Download index file: \033[36mhttps://$$ARTIFACTS_S3_BUCKET.s3.amazonaws.com/$$S3_UPLOAD_PATH/index.html\033[0m\n"
   359  
   360  release_packagecloud:
   361  	# Releasing to https://packages.gitlab.com/runner/
   362  	@./ci/release_packagecloud "$$CI_JOB_NAME"
   363  
   364  release_s3: prepare_windows_zip prepare_zoneinfo prepare_index
   365  	# Releasing to S3
   366  	@./ci/release_s3
   367  
   368  prepare_windows_zip:
   369  	# Prepare ZIP archives for Windows *.exe files
   370  	@cd out/binaries/; \
   371  	for file in $$(find * -type f -name "*windows*.exe" | sed 's/.exe$$//'); do \
   372  		zip $${file}.zip $${file}.exe; \
   373  	done
   374  
   375  prepare_zoneinfo:
   376  	# preparing the zoneinfo file
   377  	@cp $$GOROOT/lib/time/zoneinfo.zip out/
   378  
   379  prepare_index:
   380  	# Preparing index file
   381  	@./ci/prepare_index
   382  
   383  release_docker_images:
   384  	# Releasing Docker images
   385  	@./ci/release_docker_images
   386  
   387  check-tags-in-changelog:
   388  	# Looking for tags in CHANGELOG
   389  	@git status | grep "On branch master" 2>&1 >/dev/null || echo "Check should be done on master branch only. Skipping."
   390  	@for tag in $$(git tag | grep -E "^v[0-9]+\.[0-9]+\.[0-9]+$$" | sed 's|v||' | sort -g); do \
   391  		state="MISSING"; \
   392  		grep "^v $$tag" CHANGELOG.md 2>&1 >/dev/null; \
   393  		[ "$$?" -eq 1 ] || state="OK"; \
   394  		echo "$$tag:   \t $$state"; \
   395  	done
   396  
   397  development_setup:
   398  	test -d tmp/gitlab-test || git clone https://gitlab.com/gitlab-org/gitlab-test.git tmp/gitlab-test
   399  	if prlctl --version ; then $(MAKE) -C tests/ubuntu parallels ; fi
   400  	if vboxmanage --version ; then $(MAKE) -C tests/ubuntu virtualbox ; fi
   401  
   402  # local GOPATH
   403  $(GOPATH_SETUP): $(PKG_BUILD_DIR)
   404  	mkdir -p $(GOPATH_BIN)
   405  	touch $@
   406  
   407  $(PKG_BUILD_DIR):
   408  	mkdir -p $(@D)
   409  	ln -s ../../../.. $@
   410  
   411  # development tools
   412  $(GOX): $(GOPATH_SETUP)
   413  	go get github.com/mitchellh/gox
   414  
   415  $(GOBINDATA): $(GOPATH_SETUP)
   416  	go get github.com/jteeuwen/go-bindata/...
   417  
   418  $(MOCKERY): $(GOPATH_SETUP)
   419  	go get github.com/vektra/mockery/.../
   420  
   421  clean:
   422  	-$(RM) -rf $(LOCAL_GOPATH)
   423  	-$(RM) executors/docker/bindata.go
   424  	-$(RM) -rf $(TARGET_DIR)