From 62d3655da43d712e32c1cb2f1a406c157e477478 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Thu, 26 Jul 2018 13:40:52 +0200 Subject: [PATCH 01/10] docker: inital copy of the grafana-docker files. --- .circleci/config.yml | 28 ++++++++- packaging/docker/Dockerfile | 38 ++++++++++++ packaging/docker/build.sh | 22 +++++++ packaging/docker/push_to_docker_hub.sh | 17 ++++++ packaging/docker/run.sh | 82 ++++++++++++++++++++++++++ 5 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 packaging/docker/Dockerfile create mode 100755 packaging/docker/build.sh create mode 100755 packaging/docker/push_to_docker_hub.sh create mode 100755 packaging/docker/run.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 44f34d42926..01cd36261fc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -89,7 +89,7 @@ jobs: name: run linters command: 'gometalinter.v2 --enable-gc --vendor --deadline 10m --disable-all --enable=deadcode --enable=ineffassign --enable=structcheck --enable=unconvert --enable=varcheck ./...' - run: - name: run go vet + name: run go vet command: 'go vet ./pkg/...' test-frontend: @@ -159,6 +159,16 @@ jobs: - store_artifacts: path: dist + build-deploy-docker-master: + docker: + - image: docker:stable-git + steps: + - checkout + - setup_remote_docker + - run: docker info + - run: echo $GRAFANA_VERSION + - run: ./build.sh ${GRAFANA_VERSION} + build-enterprise: docker: - image: grafana/build-container:v0.1 @@ -246,7 +256,7 @@ workflows: test-and-build: jobs: - build-all: - filters: *filter-only-master + filters: *filter-not-release - build-enterprise: filters: *filter-only-master - codespell: @@ -270,7 +280,19 @@ workflows: - gometalinter - mysql-integration-test - postgres-integration-test - filters: *filter-only-master + filters: *filter-only-master + - build-deploy-docker-master: + requires: + - build-all + - test-backend + - test-frontend + - codespell + - gometalinter + - mysql-integration-test + - postgres-integration-test + filters: + branches: + only: grafana-docker - deploy-enterprise-master: requires: - build-all diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile new file mode 100644 index 00000000000..6e4a5896b75 --- /dev/null +++ b/packaging/docker/Dockerfile @@ -0,0 +1,38 @@ +FROM debian:stretch-slim + +ARG GRAFANA_URL="https://s3-us-west-2.amazonaws.com/grafana-releases/master/grafana-latest.linux-x64.tar.gz" +ARG GF_UID="472" +ARG GF_GID="472" + +ENV PATH=/usr/share/grafana/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ + GF_PATHS_CONFIG="/etc/grafana/grafana.ini" \ + GF_PATHS_DATA="/var/lib/grafana" \ + GF_PATHS_HOME="/usr/share/grafana" \ + GF_PATHS_LOGS="/var/log/grafana" \ + GF_PATHS_PLUGINS="/var/lib/grafana/plugins" \ + GF_PATHS_PROVISIONING="/etc/grafana/provisioning" + +RUN apt-get update && apt-get install -qq -y tar libfontconfig curl ca-certificates && \ + mkdir -p "$GF_PATHS_HOME/.aws" && \ + curl "$GRAFANA_URL" | tar xfvz - --strip-components=1 -C "$GF_PATHS_HOME" && \ + apt-get autoremove -y && \ + rm -rf /var/lib/apt/lists/* && \ + groupadd -r -g $GF_GID grafana && \ + useradd -r -u $GF_UID -g grafana grafana && \ + mkdir -p "$GF_PATHS_PROVISIONING/datasources" \ + "$GF_PATHS_PROVISIONING/dashboards" \ + "$GF_PATHS_LOGS" \ + "$GF_PATHS_PLUGINS" \ + "$GF_PATHS_DATA" && \ + cp "$GF_PATHS_HOME/conf/sample.ini" "$GF_PATHS_CONFIG" && \ + cp "$GF_PATHS_HOME/conf/ldap.toml" /etc/grafana/ldap.toml && \ + chown -R grafana:grafana "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" && \ + chmod 777 "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" + +EXPOSE 3000 + +COPY ./run.sh /run.sh + +USER grafana +WORKDIR / +ENTRYPOINT [ "/run.sh" ] \ No newline at end of file diff --git a/packaging/docker/build.sh b/packaging/docker/build.sh new file mode 100755 index 00000000000..ac1dd41feec --- /dev/null +++ b/packaging/docker/build.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +_grafana_tag=$1 +_grafana_version=$(echo ${_grafana_tag} | cut -d "v" -f 2) +_docker_repo=${2:-grafana/grafana} + + +echo ${_grafana_version} + +if [ "$_grafana_version" != "" ]; then + echo "Building version ${_grafana_version}" + docker build \ + --build-arg GRAFANA_URL="https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-${_grafana_version}.linux-amd64.tar.gz" \ + --tag "${_docker_repo}:${_grafana_version}" \ + --no-cache=true . + docker tag ${_docker_repo}:${_grafana_version} ${_docker_repo}:latest +else + echo "Building latest for master" + docker build \ + --tag "grafana/grafana:master" \ + . +fi diff --git a/packaging/docker/push_to_docker_hub.sh b/packaging/docker/push_to_docker_hub.sh new file mode 100755 index 00000000000..4b23996f67f --- /dev/null +++ b/packaging/docker/push_to_docker_hub.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +_grafana_tag=$1 +_grafana_version=$(echo ${_grafana_tag} | cut -d "v" -f 2) + +if [ "$_grafana_version" != "" ]; then + echo "pushing grafana/grafana:${_grafana_version}" + docker push grafana/grafana:${_grafana_version} + + if echo "$_grafana_version" | grep -viqF beta; then + echo "pushing grafana/grafana:latest" + docker push grafana/grafana:latest + fi +else + echo "pushing grafana/grafana:master" + docker push grafana/grafana:master +fi diff --git a/packaging/docker/run.sh b/packaging/docker/run.sh new file mode 100755 index 00000000000..44411f0f6b6 --- /dev/null +++ b/packaging/docker/run.sh @@ -0,0 +1,82 @@ +#!/bin/bash -e + +PERMISSIONS_OK=0 + +if [ ! -r "$GF_PATHS_CONFIG" ]; then + echo "GF_PATHS_CONFIG='$GF_PATHS_CONFIG' is not readable." + PERMISSIONS_OK=1 +fi + +if [ ! -w "$GF_PATHS_DATA" ]; then + echo "GF_PATHS_DATA='$GF_PATHS_DATA' is not writable." + PERMISSIONS_OK=1 +fi + +if [ ! -r "$GF_PATHS_HOME" ]; then + echo "GF_PATHS_HOME='$GF_PATHS_HOME' is not readable." + PERMISSIONS_OK=1 +fi + +if [ $PERMISSIONS_OK -eq 1 ]; then + echo "You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later" +fi + +if [ ! -d "$GF_PATHS_PLUGINS" ]; then + mkdir "$GF_PATHS_PLUGINS" +fi + +if [ ! -z ${GF_AWS_PROFILES+x} ]; then + > "$GF_PATHS_HOME/.aws/credentials" + + for profile in ${GF_AWS_PROFILES}; do + access_key_varname="GF_AWS_${profile}_ACCESS_KEY_ID" + secret_key_varname="GF_AWS_${profile}_SECRET_ACCESS_KEY" + region_varname="GF_AWS_${profile}_REGION" + + if [ ! -z "${!access_key_varname}" -a ! -z "${!secret_key_varname}" ]; then + echo "[${profile}]" >> "$GF_PATHS_HOME/.aws/credentials" + echo "aws_access_key_id = ${!access_key_varname}" >> "$GF_PATHS_HOME/.aws/credentials" + echo "aws_secret_access_key = ${!secret_key_varname}" >> "$GF_PATHS_HOME/.aws/credentials" + if [ ! -z "${!region_varname}" ]; then + echo "region = ${!region_varname}" >> "$GF_PATHS_HOME/.aws/credentials" + fi + fi + done + + chmod 600 "$GF_PATHS_HOME/.aws/credentials" +fi + +# Convert all environment variables with names ending in _FILE into the content of +# the file that they point at and use the name without the trailing _FILE. +# This can be used to carry in Docker secrets. +for VAR_NAME in $(env | grep '^GF_[^=]\+_FILE=.\+' | sed -r "s/([^=]*)_FILE=.*/\1/g"); do + VAR_NAME_FILE="$VAR_NAME"_FILE + if [ "${!VAR_NAME}" ]; then + echo >&2 "ERROR: Both $VAR_NAME and $VAR_NAME_FILE are set (but are exclusive)" + exit 1 + fi + echo "Getting secret $VAR_NAME from ${!VAR_NAME_FILE}" + export "$VAR_NAME"="$(< "${!VAR_NAME_FILE}")" + unset "$VAR_NAME_FILE" +done + +export HOME="$GF_PATHS_HOME" + +if [ ! -z "${GF_INSTALL_PLUGINS}" ]; then + OLDIFS=$IFS + IFS=',' + for plugin in ${GF_INSTALL_PLUGINS}; do + IFS=$OLDIFS + grafana-cli --pluginsDir "${GF_PATHS_PLUGINS}" plugins install ${plugin} + done +fi + +exec grafana-server \ + --homepath="$GF_PATHS_HOME" \ + --config="$GF_PATHS_CONFIG" \ + "$@" \ + cfg:default.log.mode="console" \ + cfg:default.paths.data="$GF_PATHS_DATA" \ + cfg:default.paths.logs="$GF_PATHS_LOGS" \ + cfg:default.paths.plugins="$GF_PATHS_PLUGINS" \ + cfg:default.paths.provisioning="$GF_PATHS_PROVISIONING" From bfe41d3cf15654f86e7c879b8e927f4daeaacff5 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Thu, 26 Jul 2018 16:46:36 +0200 Subject: [PATCH 02/10] build: new workflow for PR:s and branches. --- .circleci/config.yml | 104 ++++++++++++++++++++++++++++------------- scripts/build/build.sh | 22 ++++----- 2 files changed, 81 insertions(+), 45 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 01cd36261fc..6dc3cdf378b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,9 +5,11 @@ aliases: ignore: /.*/ tags: only: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/ - - &filter-not-release + - &filter-not-release-or-master tags: ignore: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/ + branches: + ignore: master - &filter-only-master branches: only: master @@ -156,18 +158,39 @@ jobs: - dist/grafana* - scripts/*.sh - scripts/publish - - store_artifacts: - path: dist - build-deploy-docker-master: - docker: - - image: docker:stable-git - steps: - - checkout - - setup_remote_docker - - run: docker info - - run: echo $GRAFANA_VERSION - - run: ./build.sh ${GRAFANA_VERSION} + build: + docker: + - image: grafana/build-container:1.0.0 + working_directory: /go/src/github.com/grafana/grafana + steps: + - checkout + - run: + name: prepare build tools + command: '/tmp/bootstrap.sh' + - run: + name: build and package grafana + command: './scripts/build/build.sh' + - run: + name: sign packages + command: './scripts/build/sign_packages.sh' + - run: + name: sha-sum packages + command: 'go run build.go sha-dist' + - persist_to_workspace: + root: . + paths: + - dist/grafana* + + build-docker: + docker: + - image: docker:stable-git + steps: + - checkout + - setup_remote_docker + - run: docker info + - run: echo $GRAFANA_VERSION + - run: cd packaging/docker && ./build.sh ${GRAFANA_VERSION} build-enterprise: docker: @@ -253,24 +276,24 @@ jobs: workflows: version: 2 - test-and-build: + build-master: jobs: - build-all: - filters: *filter-not-release + filters: *filter-only-master - build-enterprise: filters: *filter-only-master - codespell: - filters: *filter-not-release + filters: *filter-only-master - gometalinter: - filters: *filter-not-release + filters: *filter-only-master - test-frontend: - filters: *filter-not-release + filters: *filter-only-master - test-backend: - filters: *filter-not-release + filters: *filter-only-master - mysql-integration-test: - filters: *filter-not-release + filters: *filter-only-master - postgres-integration-test: - filters: *filter-not-release + filters: *filter-only-master - deploy-master: requires: - build-all @@ -281,18 +304,6 @@ workflows: - mysql-integration-test - postgres-integration-test filters: *filter-only-master - - build-deploy-docker-master: - requires: - - build-all - - test-backend - - test-frontend - - codespell - - gometalinter - - mysql-integration-test - - postgres-integration-test - filters: - branches: - only: grafana-docker - deploy-enterprise-master: requires: - build-all @@ -331,3 +342,32 @@ workflows: - mysql-integration-test - postgres-integration-test filters: *filter-only-release + + build-branches-and-prs: + jobs: + - build: + filters: *filter-not-release-or-master + - codespell: + filters: *filter-not-release-or-master + - gometalinter: + filters: *filter-not-release-or-master + - test-frontend: + filters: *filter-not-release-or-master + - test-backend: + filters: *filter-not-release-or-master + - mysql-integration-test: + filters: *filter-not-release-or-master + - postgres-integration-test: + filters: *filter-not-release-or-master + - build-docker: + requires: + - build + - test-backend + - test-frontend + - codespell + - gometalinter + - mysql-integration-test + - postgres-integration-test + filters: + branches: + only: grafana-docker diff --git a/scripts/build/build.sh b/scripts/build/build.sh index cee80822cac..a02f079dd72 100755 --- a/scripts/build/build.sh +++ b/scripts/build/build.sh @@ -14,12 +14,14 @@ echo "current dir: $(pwd)" if [ "$CIRCLE_TAG" != "" ]; then echo "Building releases from tag $CIRCLE_TAG" - CC=${CCX64} go run build.go -includeBuildNumber=false build + OPT="-includeBuildNumber=false" else echo "Building incremental build for $CIRCLE_BRANCH" - CC=${CCX64} go run build.go -buildNumber=${CIRCLE_BUILD_NUM} build + OPT="-buildNumber=${CIRCLE_BUILD_NUM}" fi +CC=${CCX64} go run build.go ${OPT} build + yarn install --pure-lockfile --no-progress echo "current dir: $(pwd)" @@ -28,14 +30,8 @@ if [ -d "dist" ]; then rm -rf dist fi -if [ "$CIRCLE_TAG" != "" ]; then - echo "Building frontend from tag $CIRCLE_TAG" - go run build.go -includeBuildNumber=false build-frontend - echo "Packaging a release from tag $CIRCLE_TAG" - go run build.go -goos linux -pkg-arch amd64 -includeBuildNumber=false package-only latest -else - echo "Building frontend for $CIRCLE_BRANCH" - go run build.go -buildNumber=${CIRCLE_BUILD_NUM} build-frontend - echo "Packaging incremental build for $CIRCLE_BRANCH" - go run build.go -goos linux -pkg-arch amd64 -buildNumber=${CIRCLE_BUILD_NUM} package-only latest -fi +echo "Building frontend" +go run build.go ${OPT} build-frontend + +echo "Packaging" +go run build.go -goos linux -pkg-arch amd64 ${OPT} package-only latest From e3a907214d822fd4db0f89cf1489165b742ec7ad Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Sat, 28 Jul 2018 23:00:59 +0200 Subject: [PATCH 03/10] build: builds docker image from local grafna tgz. --- .circleci/config.yml | 1 + packaging/docker/Dockerfile | 11 +++++++---- packaging/docker/build.sh | 1 - 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6dc3cdf378b..74c4ee6c3ef 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -190,6 +190,7 @@ jobs: - setup_remote_docker - run: docker info - run: echo $GRAFANA_VERSION + - run: cp dist/grafana-latest.linux-x64.tar.gz packaging/docker - run: cd packaging/docker && ./build.sh ${GRAFANA_VERSION} build-enterprise: diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index 6e4a5896b75..3025b03f920 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -1,6 +1,6 @@ FROM debian:stretch-slim -ARG GRAFANA_URL="https://s3-us-west-2.amazonaws.com/grafana-releases/master/grafana-latest.linux-x64.tar.gz" +ARG GRAFANA_TGZ="grafana-latest.linux-x64.tar.gz" ARG GF_UID="472" ARG GF_GID="472" @@ -12,9 +12,12 @@ ENV PATH=/usr/share/grafana/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bi GF_PATHS_PLUGINS="/var/lib/grafana/plugins" \ GF_PATHS_PROVISIONING="/etc/grafana/provisioning" -RUN apt-get update && apt-get install -qq -y tar libfontconfig curl ca-certificates && \ +COPY ${GRAFANA_TGZ} /tmp/grafana.tar.gz + +RUN apt-get update && apt-get install -qq -y tar libfontconfig ca-certificates && \ mkdir -p "$GF_PATHS_HOME/.aws" && \ - curl "$GRAFANA_URL" | tar xfvz - --strip-components=1 -C "$GF_PATHS_HOME" && \ + tar xfvz /tmp/grafana.tar.gz --strip-components=1 -C "$GF_PATHS_HOME" && \ + rm /tmp/grafana.tar.gz && \ apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/* && \ groupadd -r -g $GF_GID grafana && \ @@ -35,4 +38,4 @@ COPY ./run.sh /run.sh USER grafana WORKDIR / -ENTRYPOINT [ "/run.sh" ] \ No newline at end of file +ENTRYPOINT [ "/run.sh" ] diff --git a/packaging/docker/build.sh b/packaging/docker/build.sh index ac1dd41feec..df0a809c754 100755 --- a/packaging/docker/build.sh +++ b/packaging/docker/build.sh @@ -10,7 +10,6 @@ echo ${_grafana_version} if [ "$_grafana_version" != "" ]; then echo "Building version ${_grafana_version}" docker build \ - --build-arg GRAFANA_URL="https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-${_grafana_version}.linux-amd64.tar.gz" \ --tag "${_docker_repo}:${_grafana_version}" \ --no-cache=true . docker tag ${_docker_repo}:${_grafana_version} ${_docker_repo}:latest From e8489304760d781498d49b31bbfb90515382c9f8 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Sun, 29 Jul 2018 12:04:31 +0200 Subject: [PATCH 04/10] build: attach built resources. --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 74c4ee6c3ef..5fe09fbb349 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -187,6 +187,8 @@ jobs: - image: docker:stable-git steps: - checkout + - attach_workspace: + at: . - setup_remote_docker - run: docker info - run: echo $GRAFANA_VERSION From 580e2c36d1575d205aad8b3c33f3d1b8b90a9b41 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Mon, 30 Jul 2018 14:05:56 +0200 Subject: [PATCH 05/10] build: imported latest changes from grafana-docker. --- .circleci/config.yml | 7 +++-- packaging/docker/build-deploy.sh | 13 +++++++++ packaging/docker/build.sh | 37 +++++++++++++++----------- packaging/docker/deploy_to_k8s.sh | 6 +++++ packaging/docker/push_to_docker_hub.sh | 22 +++++++++------ packaging/docker/run.sh | 8 +++--- 6 files changed, 62 insertions(+), 31 deletions(-) create mode 100755 packaging/docker/build-deploy.sh create mode 100755 packaging/docker/deploy_to_k8s.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 5fe09fbb349..d59e4984454 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -182,7 +182,7 @@ jobs: paths: - dist/grafana* - build-docker: + grafana-docker-master: docker: - image: docker:stable-git steps: @@ -191,9 +191,8 @@ jobs: at: . - setup_remote_docker - run: docker info - - run: echo $GRAFANA_VERSION - run: cp dist/grafana-latest.linux-x64.tar.gz packaging/docker - - run: cd packaging/docker && ./build.sh ${GRAFANA_VERSION} + - run: cd packaging/docker && ./build-deploy.sh "grafana-docker-${CIRCLE_SHA1}" build-enterprise: docker: @@ -362,7 +361,7 @@ workflows: filters: *filter-not-release-or-master - postgres-integration-test: filters: *filter-not-release-or-master - - build-docker: + - grafana-docker-master: requires: - build - test-backend diff --git a/packaging/docker/build-deploy.sh b/packaging/docker/build-deploy.sh new file mode 100755 index 00000000000..923b1b8f3c0 --- /dev/null +++ b/packaging/docker/build-deploy.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +_grafana_version=$1 +./build.sh "$_grafana_version" +docker login -u "$DOCKER_USER" -p "$DOCKER_PASS" + +#./push_to_docker_hub.sh "$_grafana_version" +echo "Would have deployed $_grafana_version" + +if echo "$_grafana_version" | grep -q "^master-"; then + apk add --no-cache curl + ./deploy_to_k8s.sh "grafana/grafana-dev:$_grafana_version" +fi diff --git a/packaging/docker/build.sh b/packaging/docker/build.sh index df0a809c754..579d65eebb3 100755 --- a/packaging/docker/build.sh +++ b/packaging/docker/build.sh @@ -1,21 +1,28 @@ #!/bin/sh _grafana_tag=$1 -_grafana_version=$(echo ${_grafana_tag} | cut -d "v" -f 2) -_docker_repo=${2:-grafana/grafana} - -echo ${_grafana_version} - -if [ "$_grafana_version" != "" ]; then - echo "Building version ${_grafana_version}" - docker build \ - --tag "${_docker_repo}:${_grafana_version}" \ - --no-cache=true . - docker tag ${_docker_repo}:${_grafana_version} ${_docker_repo}:latest +# If the tag starts with v, treat this as a official release +if echo "$_grafana_tag" | grep -q "^v"; then + _grafana_version=$(echo "${_grafana_tag}" | cut -d "v" -f 2) + _grafana_url="https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-${_grafana_version}.linux-amd64.tar.gz" + _docker_repo=${2:-grafana/grafana} else - echo "Building latest for master" - docker build \ - --tag "grafana/grafana:master" \ - . + _grafana_version=$_grafana_tag + _grafana_url="https://s3-us-west-2.amazonaws.com/grafana-releases/master/grafana-${_grafana_version}.linux-x64.tar.gz" + _docker_repo=${2:-grafana/grafana-dev} +fi + +echo "Building ${_docker_repo}:${_grafana_version} from ${_grafana_url}" + +docker build \ + --build-arg GRAFANA_URL="${_grafana_url}" \ + --tag "${_docker_repo}:${_grafana_version}" \ + --no-cache=true . + +# Tag as 'latest' for official release; otherwise tag as grafana/grafana:master +if echo "$_grafana_tag" | grep -q "^v"; then + docker tag "${_docker_repo}:${_grafana_version}" "${_docker_repo}:latest" +else + docker tag "${_docker_repo}:${_grafana_version}" "grafana/grafana:master" fi diff --git a/packaging/docker/deploy_to_k8s.sh b/packaging/docker/deploy_to_k8s.sh new file mode 100755 index 00000000000..26cf88ef688 --- /dev/null +++ b/packaging/docker/deploy_to_k8s.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +curl -s --header "Content-Type: application/json" \ + --data "{\"build_parameters\": {\"CIRCLE_JOB\": \"deploy\", \"IMAGE_NAMES\": \"$1\"}}" \ + --request POST \ + https://circleci.com/api/v1.1/project/github/raintank/deployment_tools/tree/master?circle-token=$CIRCLE_TOKEN diff --git a/packaging/docker/push_to_docker_hub.sh b/packaging/docker/push_to_docker_hub.sh index 4b23996f67f..e779b04d68d 100755 --- a/packaging/docker/push_to_docker_hub.sh +++ b/packaging/docker/push_to_docker_hub.sh @@ -1,16 +1,22 @@ #!/bin/sh _grafana_tag=$1 -_grafana_version=$(echo ${_grafana_tag} | cut -d "v" -f 2) -if [ "$_grafana_version" != "" ]; then - echo "pushing grafana/grafana:${_grafana_version}" - docker push grafana/grafana:${_grafana_version} +# If the tag starts with v, treat this as a official release +if echo "$_grafana_tag" | grep -q "^v"; then + _grafana_version=$(echo "${_grafana_tag}" | cut -d "v" -f 2) + _docker_repo=${2:-grafana/grafana} +else + _grafana_version=$_grafana_tag + _docker_repo=${2:-grafana/grafana-dev} +fi - if echo "$_grafana_version" | grep -viqF beta; then - echo "pushing grafana/grafana:latest" - docker push grafana/grafana:latest - fi +echo "pushing ${_docker_repo}:${_grafana_version}" +docker push "${_docker_repo}:${_grafana_version}" + +if echo "$_grafana_tag" | grep -q "^v"; then + echo "pushing ${_docker_repo}:latest" + docker push "${_docker_repo}:latest" else echo "pushing grafana/grafana:master" docker push grafana/grafana:master diff --git a/packaging/docker/run.sh b/packaging/docker/run.sh index 44411f0f6b6..2d2318a9210 100755 --- a/packaging/docker/run.sh +++ b/packaging/docker/run.sh @@ -46,11 +46,11 @@ if [ ! -z ${GF_AWS_PROFILES+x} ]; then chmod 600 "$GF_PATHS_HOME/.aws/credentials" fi -# Convert all environment variables with names ending in _FILE into the content of -# the file that they point at and use the name without the trailing _FILE. +# Convert all environment variables with names ending in __FILE into the content of +# the file that they point at and use the name without the trailing __FILE. # This can be used to carry in Docker secrets. -for VAR_NAME in $(env | grep '^GF_[^=]\+_FILE=.\+' | sed -r "s/([^=]*)_FILE=.*/\1/g"); do - VAR_NAME_FILE="$VAR_NAME"_FILE +for VAR_NAME in $(env | grep '^GF_[^=]\+__FILE=.\+' | sed -r "s/([^=]*)__FILE=.*/\1/g"); do + VAR_NAME_FILE="$VAR_NAME"__FILE if [ "${!VAR_NAME}" ]; then echo >&2 "ERROR: Both $VAR_NAME and $VAR_NAME_FILE are set (but are exclusive)" exit 1 From 424aa6e564fc6419c9192a4ee6cf74550f5aad67 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Mon, 30 Jul 2018 16:35:30 +0200 Subject: [PATCH 06/10] build: removes unused args to docker build. --- packaging/docker/build.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packaging/docker/build.sh b/packaging/docker/build.sh index 579d65eebb3..c303c71cd5f 100755 --- a/packaging/docker/build.sh +++ b/packaging/docker/build.sh @@ -5,18 +5,15 @@ _grafana_tag=$1 # If the tag starts with v, treat this as a official release if echo "$_grafana_tag" | grep -q "^v"; then _grafana_version=$(echo "${_grafana_tag}" | cut -d "v" -f 2) - _grafana_url="https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-${_grafana_version}.linux-amd64.tar.gz" _docker_repo=${2:-grafana/grafana} else _grafana_version=$_grafana_tag - _grafana_url="https://s3-us-west-2.amazonaws.com/grafana-releases/master/grafana-${_grafana_version}.linux-x64.tar.gz" _docker_repo=${2:-grafana/grafana-dev} fi -echo "Building ${_docker_repo}:${_grafana_version} from ${_grafana_url}" +echo "Building ${_docker_repo}:${_grafana_version}" docker build \ - --build-arg GRAFANA_URL="${_grafana_url}" \ --tag "${_docker_repo}:${_grafana_version}" \ --no-cache=true . From 99a9dbb04f161eac59cc7450c0daf5934a70129a Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Mon, 30 Jul 2018 18:52:49 +0200 Subject: [PATCH 07/10] build: complete docker build for master and releases. --- .circleci/config.yml | 46 +++++++++++++++++++++--------- packaging/docker/README.md | 45 +++++++++++++++++++++++++++++ packaging/docker/build-deploy.sh | 3 +- packaging/docker/custom/Dockerfile | 16 +++++++++++ 4 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 packaging/docker/README.md create mode 100644 packaging/docker/custom/Dockerfile diff --git a/.circleci/config.yml b/.circleci/config.yml index d59e4984454..818f30f7eea 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -192,7 +192,19 @@ jobs: - setup_remote_docker - run: docker info - run: cp dist/grafana-latest.linux-x64.tar.gz packaging/docker - - run: cd packaging/docker && ./build-deploy.sh "grafana-docker-${CIRCLE_SHA1}" + - run: cd packaging/docker && ./build-deploy.sh "master-${CIRCLE_SHA1}" + + grafana-docker-release: + docker: + - image: docker:stable-git + steps: + - checkout + - attach_workspace: + at: . + - setup_remote_docker + - run: docker info + - run: cp dist/grafana-latest.linux-x64.tar.gz packaging/docker + - run: cd packaging/docker && ./build-deploy.sh "${CIRCLE_TAG}" build-enterprise: docker: @@ -306,6 +318,16 @@ workflows: - mysql-integration-test - postgres-integration-test filters: *filter-only-master + - grafana-docker-master: + requires: + - build-all + - test-backend + - test-frontend + - codespell + - gometalinter + - mysql-integration-test + - postgres-integration-test + filters: *filter-only-master - deploy-enterprise-master: requires: - build-all @@ -344,6 +366,16 @@ workflows: - mysql-integration-test - postgres-integration-test filters: *filter-only-release + - grafana-docker-release: + requires: + - build-all + - test-backend + - test-frontend + - codespell + - gometalinter + - mysql-integration-test + - postgres-integration-test + filters: *filter-only-release build-branches-and-prs: jobs: @@ -361,15 +393,3 @@ workflows: filters: *filter-not-release-or-master - postgres-integration-test: filters: *filter-not-release-or-master - - grafana-docker-master: - requires: - - build - - test-backend - - test-frontend - - codespell - - gometalinter - - mysql-integration-test - - postgres-integration-test - filters: - branches: - only: grafana-docker diff --git a/packaging/docker/README.md b/packaging/docker/README.md new file mode 100644 index 00000000000..d80cd87aebc --- /dev/null +++ b/packaging/docker/README.md @@ -0,0 +1,45 @@ +# Grafana Docker image + +[![CircleCI](https://circleci.com/gh/grafana/grafana-docker.svg?style=svg)](https://circleci.com/gh/grafana/grafana-docker) + +## Running your Grafana container + +Start your container binding the external port `3000`. + +```bash +docker run -d --name=grafana -p 3000:3000 grafana/grafana +``` + +Try it out, default admin user is admin/admin. + +## How to use the container + +Further documentation can be found at http://docs.grafana.org/installation/docker/ + +## Changelog + +### v5.1.5, v5.2.0-beta2 +* Fix: config keys ending with _FILE are not respected [#170](https://github.com/grafana/grafana-docker/issues/170) + +### v5.2.0-beta1 +* Support for Docker Secrets + +### v5.1.0 +* Major restructuring of the container +* Usage of `chown` removed +* File permissions incompatibility with previous versions + * user id changed from 104 to 472 + * group id changed from 107 to 472 +* Runs as the grafana user by default (instead of root) +* All default volumes removed + +### v4.2.0 +* Plugins are now installed into ${GF_PATHS_PLUGINS} +* Building the container now requires a full url to the deb package instead of just version +* Fixes bug caused by installing multiple plugins + +### v4.0.0-beta2 +* Plugins dir (`/var/lib/grafana/plugins`) is no longer a separate volume + +### v3.1.1 +* Make it possible to install specific plugin version https://github.com/grafana/grafana-docker/issues/59#issuecomment-260584026 \ No newline at end of file diff --git a/packaging/docker/build-deploy.sh b/packaging/docker/build-deploy.sh index 923b1b8f3c0..e20ae2c2a41 100755 --- a/packaging/docker/build-deploy.sh +++ b/packaging/docker/build-deploy.sh @@ -4,8 +4,7 @@ _grafana_version=$1 ./build.sh "$_grafana_version" docker login -u "$DOCKER_USER" -p "$DOCKER_PASS" -#./push_to_docker_hub.sh "$_grafana_version" -echo "Would have deployed $_grafana_version" +./push_to_docker_hub.sh "$_grafana_version" if echo "$_grafana_version" | grep -q "^master-"; then apk add --no-cache curl diff --git a/packaging/docker/custom/Dockerfile b/packaging/docker/custom/Dockerfile new file mode 100644 index 00000000000..79eba5f29e9 --- /dev/null +++ b/packaging/docker/custom/Dockerfile @@ -0,0 +1,16 @@ +ARG GRAFANA_VERSION="latest" + +FROM grafana/grafana:${GRAFANA_VERSION} + +USER grafana + +ARG GF_INSTALL_PLUGINS="" + +RUN if [ ! -z "${GF_INSTALL_PLUGINS}" ]; then \ + OLDIFS=$IFS; \ + IFS=','; \ + for plugin in ${GF_INSTALL_PLUGINS}; do \ + IFS=$OLDIFS; \ + grafana-cli --pluginsDir "$GF_PATHS_PLUGINS" plugins install ${plugin}; \ + done; \ +fi From b61ac546f157a0b00d49ce11f5d86f8345034a38 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Mon, 30 Jul 2018 18:54:34 +0200 Subject: [PATCH 08/10] build: disables external docker build for master and release. --- .circleci/config.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 818f30f7eea..e2deab62c1b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -260,9 +260,6 @@ jobs: - run: name: Trigger Windows build command: './scripts/trigger_windows_build.sh ${APPVEYOR_TOKEN} ${CIRCLE_SHA1} master' - - run: - name: Trigger Docker build - command: './scripts/trigger_docker_build.sh ${TRIGGER_GRAFANA_PACKER_CIRCLECI_TOKEN} master-$(echo "${CIRCLE_SHA1}" | cut -b1-7)' - run: name: Publish to Grafana.com command: | @@ -284,9 +281,6 @@ jobs: - run: name: Trigger Windows build command: './scripts/trigger_windows_build.sh ${APPVEYOR_TOKEN} ${CIRCLE_SHA1} release' - - run: - name: Trigger Docker build - command: './scripts/trigger_docker_build.sh ${TRIGGER_GRAFANA_PACKER_CIRCLECI_TOKEN} ${CIRCLE_TAG}' workflows: version: 2 From 0ff54d257ade3d5a4fb3369dc2c6509378533a39 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Thu, 2 Aug 2018 17:42:28 +0200 Subject: [PATCH 09/10] build: makes it easier to build a local docker container. --- .gitignore | 1 + Makefile | 8 +++++++- packaging/docker/Dockerfile | 9 +++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 11df66360d9..2484176a469 100644 --- a/.gitignore +++ b/.gitignore @@ -58,6 +58,7 @@ debug.test /examples/*/dist /packaging/**/*.rpm /packaging/**/*.deb +/packaging/**/*.tar.gz # Ignore OSX indexing .DS_Store diff --git a/Makefile b/Makefile index c1d755d247d..9e136688eb7 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,12 @@ build-js: build: build-go build-js +build-docker-dev: + @echo "\033[92mInfo:\033[0m the frontend code is expected to be built already." + go run build.go -goos linux -pkg-arch amd64 ${OPT} build package-only latest + cp dist/grafana-latest.linux-x64.tar.gz packaging/docker + cd packaging/docker && docker build --tag grafana/grafana:dev . + test-go: go test -v ./pkg/... @@ -36,4 +42,4 @@ run: ./bin/grafana-server protoc: - protoc -I pkg/tsdb/models pkg/tsdb/models/*.proto --go_out=plugins=grpc:pkg/tsdb/models/. \ No newline at end of file + protoc -I pkg/tsdb/models pkg/tsdb/models/*.proto --go_out=plugins=grpc:pkg/tsdb/models/. diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index 3025b03f920..aaaf333fc6b 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -12,14 +12,15 @@ ENV PATH=/usr/share/grafana/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bi GF_PATHS_PLUGINS="/var/lib/grafana/plugins" \ GF_PATHS_PROVISIONING="/etc/grafana/provisioning" +RUN apt-get update && apt-get install -qq -y tar libfontconfig ca-certificates && \ + apt-get autoremove -y && \ + rm -rf /var/lib/apt/lists/* + COPY ${GRAFANA_TGZ} /tmp/grafana.tar.gz -RUN apt-get update && apt-get install -qq -y tar libfontconfig ca-certificates && \ - mkdir -p "$GF_PATHS_HOME/.aws" && \ +RUN mkdir -p "$GF_PATHS_HOME/.aws" && \ tar xfvz /tmp/grafana.tar.gz --strip-components=1 -C "$GF_PATHS_HOME" && \ rm /tmp/grafana.tar.gz && \ - apt-get autoremove -y && \ - rm -rf /var/lib/apt/lists/* && \ groupadd -r -g $GF_GID grafana && \ useradd -r -u $GF_UID -g grafana grafana && \ mkdir -p "$GF_PATHS_PROVISIONING/datasources" \ From 3096905d393b860f63c117c7a2e1dcd5a000f088 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Mon, 6 Aug 2018 14:04:41 +0200 Subject: [PATCH 10/10] docs: how to build a docker image. --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 322523d703b..b2baf0ece59 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,15 @@ bra run Open grafana in your browser (default: `http://localhost:3000`) and login with admin user (default: `user/pass = admin/admin`). +### Building a docker image (on linux/amd64) + +This builds a docker image from your local sources: + +1. Build the frontend `go run build.go build-frontend` +2. Build the docker image `make build-docker-dev` + +The resulting image will be tagged as `grafana/grafana:dev` + ### Dev config Create a custom.ini in the conf directory to override default configuration options.