Skip to content

Commit

Permalink
feat(CI): Adds Travis CI support
Browse files Browse the repository at this point in the history
Signed-off-by: Prabhav Thali <[email protected]>
  • Loading branch information
prabhav-thali committed Jun 14, 2021
1 parent 54af6f4 commit aea9d82
Show file tree
Hide file tree
Showing 5 changed files with 195 additions and 23 deletions.
147 changes: 147 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
language: go

go:
- 1.12.8

os: linux
dist: focal

git:
depth: false

services:
- docker

env:
global:
- TAG=nightly
- RECREATE_TAGS=false
- NO_COMMIT=''
- REGISTRY=quay.io
- ORGANIZATION=eclipse
- IMAGE=che-machine-exec

install:
- git remote set-url origin https://[email protected]/eclipse-che/che-machine-exec.git
- export SHORT_SHA=$(git rev-parse --short HEAD)
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- echo "$QUAY_PASSWORD" | docker login quay.io -u "$QUAY_USERNAME " --password-stdin

jobs:
include:
- stage: Code Coverage Report
if: type = push
arch: amd64
install:
- export GO111MODULE="on"
- go get ${gobuild_args} ./...
script:
- |
echo "" > coverage.txt
export CHE_WORKSPACE_ID=test_id; go test -v ./... -coverprofile coverage.txt
bash <(curl -s https://codecov.io/bash)
- &unit-test
stage: Unit tests and Docker build PR
if: type = pull_request
install:
- export GO111MODULE="on"
- go get ${gobuild_args} ./...
script: bash .travis/pr_check.sh
name: PR check on amd64
arch: amd64
- <<: *unit-test
name: PR check on arm64
arch: arm64
- <<: *unit-test
name: PR check on ppc64le
arch: ppc64le
- <<: *unit-test
name: PR check on s390x
arch: s390x

- &nightly-build
stage: Build and push both short SHA tag and nightly tag
if: type = push AND branch = main AND env(TAG) = "nightly"
script:
- bash .travis/build_image.sh
name: Build image on amd64
arch: amd64

- <<: *nightly-build
name: Build image on arm64
arch: arm64

- <<: *nightly-build
name: Build image on ppc64le
arch: ppc64le

- <<: *nightly-build
name: Build image on s390x
arch: s390x

- stage: Publish multiarch image with nightly & short_sha tag
if: type = push AND branch = main AND env(TAG) = "nightly"
script: bash .travis/publish_multiarch.sh

- stage: Check existing tags
if: type = api AND env(TAG) != "nightly"
arch: amd64
script:
- |
set +e
VERSION=$TAG
EXISTING_TAG=$(git ls-remote --exit-code origin refs/tags/${VERSION})
if [[ -n ${EXISTING_TAG} ]]; then
if [[ ${RECREATE_TAGS} == "true" ]]; then
echo "[INFO] Removing tag for ${VERSION} version. New tag will be recreated during release."
git push origin :$VERSION
else
echo "[ERROR] Cannot proceed with release - tag ${EXISTING_TAG} already exists."
exit 1
fi
else
echo "[INFO] No existing tags detected for $VERSION"
fi
- &release-build
stage: Build images for release version
if: type = api AND env(TAG) != "nightly"
script:
- bash .travis/build_image.sh
name: Build image on amd64
arch: amd64

- <<: *release-build
name: Build image on arm64
arch: arm64

- <<: *release-build
name: Build image on ppc64le
arch: ppc64le

- <<: *release-build
name: Build image on s390x
arch: s390x

- stage: Publish multiarch image with release tag
if: type = api AND env(TAG) != "nightly"
script: bash .travis/publish_multiarch.sh

- stage: Tag release and notify on mattermost
if: type = api AND env(TAG) != "nightly"
script:
- git config --global user.name "Mykhailo Kuznietsov"
- git config --global user.email "[email protected]"
- bash make-release.sh --version $TAG --tag-release $NO_COMMIT
after_success:
- |
set -e
echo "{\"username\":\"che-bot\",\"channel\":\"eclipse-che-releases\",\"text\":\":white_check_mark: Che Machine Exec ${TAG} has been released: https://quay.io/eclipse/che-machine-exec:${TAG}\"}" > mattermost.json
curl -i -X POST -H 'Content-Type: application/json' -d @mattermost.json $MATTERMOST_WEBHOOK_URL
after_failure:
- |
set -e
echo "{\"username\":\"che-bot\",\"channel\":\"eclipse-che-releases\",\"text\":\":no_entry_sign: Che Machine Exec ${TAG} release has failed: https://github.com/eclipse-che/che-machine-exec/actions/workflows/release.yml\"}" > mattermost.json
curl -i -X POST -H 'Content-Type: application/json' -d @mattermost.json $MATTERMOST_WEBHOOK_URL
12 changes: 12 additions & 0 deletions .travis/build_image.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/bash
set -e

# Build images
docker build -f build/dockerfiles/Dockerfile -t "${REGISTRY}/${ORGANIZATION}/${IMAGE}:$TAG-${TRAVIS_CPU_ARCH}" .
docker push "${REGISTRY}/${ORGANIZATION}/${IMAGE}:$TAG-${TRAVIS_CPU_ARCH}"

# Tag image with short_sha in case of nightly build
if [[ "$TAG" == "nightly" ]]; then
docker tag "${REGISTRY}/${ORGANIZATION}/${IMAGE}:$TAG-${TRAVIS_CPU_ARCH}" "${REGISTRY}/${ORGANIZATION}/${IMAGE}:${SHORT_SHA}-${TRAVIS_CPU_ARCH}"
docker push "${REGISTRY}/${ORGANIZATION}/${IMAGE}:${SHORT_SHA}-${TRAVIS_CPU_ARCH}"
fi
11 changes: 11 additions & 0 deletions .travis/pr_check.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash

set -e

# Build che-machine-exec binary and execute unit tests
CGO_ENABLED=0 GOOS=linux go build -mod=vendor -a -ldflags '-w -s' -a -installsuffix cgo -o che-machine-exec .
export CHE_WORKSPACE_ID=test_id
go test ./... -test.v

# Build image with pr-check tag
docker build -f build/dockerfiles/Dockerfile -t "${REGISTRY}/${ORGANIZATION}/${IMAGE}:pr-check-${TRAVIS_CPU_ARCH}" .
18 changes: 18 additions & 0 deletions .travis/publish_multiarch.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash
set -e

# Create amend with images built on individual architectures
AMEND=""
AMEND+=" --amend ${REGISTRY}/${ORGANIZATION}/${IMAGE}:$TAG-amd64";
AMEND+=" --amend ${REGISTRY}/${ORGANIZATION}/${IMAGE}:$TAG-arm64";
AMEND+=" --amend ${REGISTRY}/${ORGANIZATION}/${IMAGE}:$TAG-ppc64le";
AMEND+=" --amend ${REGISTRY}/${ORGANIZATION}/${IMAGE}:$TAG-s390x";

# Create manifest and push multiarch image
docker manifest create "${REGISTRY}/${ORGANIZATION}/${IMAGE}:${TAG}" $AMEND
docker manifest push "${REGISTRY}/${ORGANIZATION}/${IMAGE}:${TAG}"

if [[ "$TAG" == "nightly" ]]; then
docker manifest create "${REGISTRY}/${ORGANIZATION}/${IMAGE}:${SHORT_SHA}" $AMEND
docker manifest push "${REGISTRY}/${ORGANIZATION}/${IMAGE}:${SHORT_SHA}"
fi
30 changes: 7 additions & 23 deletions make-release.sh
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
#!/bin/bash
# Release process automation script.
# Used to create branch/tag, update VERSION files
# and and trigger release by force pushing changes to the release branch
# and trigger release by force pushing changes to the release branch

# set to 1 to actually trigger changes in the release branch
TRIGGER_RELEASE=0
# set to 1 to actually tag changes
TAG_RELEASE=0
NOCOMMIT=0

REGISTRY="quay.io"
DOCKERFILE="build/dockerfiles/Dockerfile"
ORGANIZATION="eclipse"
IMAGE="che-machine-exec"

while [[ "$#" -gt 0 ]]; do
case $1 in
'-t'|'--trigger-release') TRIGGER_RELEASE=1; shift 0;;
'-t'|'--tag-release') TAG_RELEASE=1; shift 0;;
'-v'|'--version') VERSION="$2"; shift 1;;
'-n'|'--no-commit') NOCOMMIT=1; shift 0;;
esac
Expand All @@ -23,23 +18,15 @@ done

usage ()
{
echo "Usage: $0 --version [VERSION TO RELEASE] [--trigger-release]"
echo "Example: $0 --version 7.7.0 --trigger-release"; echo
echo "Usage: $0 --version [VERSION TO RELEASE] [--tag-release]"
echo "Example: $0 --version 7.7.0 --tag-release"; echo
}

if [[ ! ${VERSION} ]]; then
usage
exit 1
fi

releaseMachineExec() {
# docker buildx includes automated push to registry, so build using tag we want published, not just local ${IMAGE}
docker buildx build \
--tag "${REGISTRY}/${ORGANIZATION}/${IMAGE}:${VERSION}" --push \
-f ./${DOCKERFILE} . --platform "linux/amd64,linux/ppc64le,linux/arm64" | cat
echo "Pushed ${REGISTRY}/${ORGANIZATION}/${IMAGE}:${VERSION}"
}

# derive branch from version
BRANCH=${VERSION%.*}.x

Expand Down Expand Up @@ -73,10 +60,7 @@ if [[ ${NOCOMMIT} -eq 0 ]]; then
git push origin "${BRANCH}"
fi

if [[ $TRIGGER_RELEASE -eq 1 ]]; then
# push new branch to release branch to trigger CI build
releaseMachineExec

if [[ $TAG_RELEASE -eq 1 ]]; then
# tag the release
git checkout "${BRANCH}"
git tag "${VERSION}"
Expand Down

0 comments on commit aea9d82

Please sign in to comment.