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)