diff --git a/.github/actions/build-dev-builder-image/action.yml b/.github/actions/build-dev-builder-image/action.yml index e4a88a5d11..c1755113a6 100644 --- a/.github/actions/build-dev-builder-image/action.yml +++ b/.github/actions/build-dev-builder-image/action.yml @@ -42,10 +42,21 @@ runs: username: ${{ inputs.dockerhub-image-registry-username }} password: ${{ inputs.dockerhub-image-registry-token }} - - name: Build and push dev builder image to dockerhub + - name: Build and push ubuntu dev builder image to dockerhub shell: bash run: make dev-builder \ + BASE_IMAGE=ubuntu \ + BUILDX_MULTI_PLATFORM_BUILD=true \ + IMAGE_REGISTRY=${{ inputs.dockerhub-image-registry }} \ + IMAGE_NAMESPACE=${{ inputs.dockerhub-image-namespace }} \ + IMAGE_TAG=${{ inputs.version }} + + - name: Build and push centos dev builder image to dockerhub + shell: bash + run: + make dev-builder \ + BASE_IMAGE=centos \ BUILDX_MULTI_PLATFORM_BUILD=true \ IMAGE_REGISTRY=${{ inputs.dockerhub-image-registry }} \ IMAGE_NAMESPACE=${{ inputs.dockerhub-image-namespace }} \ @@ -59,11 +70,23 @@ runs: username: ${{ inputs.acr-image-registry-username }} password: ${{ inputs.acr-image-registry-password }} - - name: Build and push dev builder image to ACR + - name: Build and push ubuntu dev builder image to ACR shell: bash continue-on-error: true run: # buildx will cache the images that already built, so it will not take long time to build the images again. make dev-builder \ + BASE_IMAGE=ubuntu \ + BUILDX_MULTI_PLATFORM_BUILD=true \ + IMAGE_REGISTRY=${{ inputs.acr-image-registry }} \ + IMAGE_NAMESPACE=${{ inputs.acr-image-namespace }} \ + IMAGE_TAG=${{ inputs.version }} + + - name: Build and push centos dev builder image to ACR + shell: bash + continue-on-error: true + run: # buildx will cache the images that already built, so it will not take long time to build the images again. + make dev-builder \ + BASE_IMAGE=centos \ BUILDX_MULTI_PLATFORM_BUILD=true \ IMAGE_REGISTRY=${{ inputs.acr-image-registry }} \ IMAGE_NAMESPACE=${{ inputs.acr-image-namespace }} \ diff --git a/.github/actions/build-greptime-binary/action.yml b/.github/actions/build-greptime-binary/action.yml index aecd931f0e..f9e47f424f 100644 --- a/.github/actions/build-greptime-binary/action.yml +++ b/.github/actions/build-greptime-binary/action.yml @@ -43,7 +43,7 @@ runs: shell: bash run: | cd ${{ inputs.working-dir }} && \ - make build-greptime-by-buildx \ + make build-by-dev-builder \ CARGO_PROFILE=${{ inputs.cargo-profile }} \ FEATURES=${{ inputs.features }} \ BASE_IMAGE=${{ inputs.base-image }} @@ -52,7 +52,7 @@ runs: uses: ./.github/actions/upload-artifacts with: artifacts-dir: ${{ inputs.artifacts-dir }} - target-file: ./greptime + target-file: ./target/${{ inputs.cargo-profile }}/greptime version: ${{ inputs.version }} release-to-s3-bucket: ${{ inputs.release-to-s3-bucket }} aws-access-key-id: ${{ inputs.aws-access-key-id }} diff --git a/.github/actions/build-images/action.yml b/.github/actions/build-images/action.yml index 88196a5748..c339adc0ee 100644 --- a/.github/actions/build-images/action.yml +++ b/.github/actions/build-images/action.yml @@ -40,7 +40,7 @@ runs: image-registry-password: ${{ inputs.image-registry-password }} image-name: ${{ inputs.image-name }} image-tag: ${{ inputs.version }} - docker-file: docker/ci/Dockerfile + docker-file: docker/ci/ubuntu/Dockerfile amd64-artifact-name: greptime-linux-amd64-pyo3-${{ inputs.version }} arm64-artifact-name: greptime-linux-arm64-pyo3-${{ inputs.version }} platforms: linux/amd64,linux/arm64 @@ -56,7 +56,7 @@ runs: image-registry-password: ${{ inputs.image-registry-password }} image-name: ${{ inputs.image-name }}-centos image-tag: ${{ inputs.version }} - docker-file: docker/ci/Dockerfile-centos + docker-file: docker/ci/centos/Dockerfile amd64-artifact-name: greptime-linux-amd64-centos-${{ inputs.version }} platforms: linux/amd64 push-latest-tag: ${{ inputs.push-latest-tag }} diff --git a/.github/actions/build-linux-artifacts/action.yml b/.github/actions/build-linux-artifacts/action.yml index 018ee19153..381f45126f 100644 --- a/.github/actions/build-linux-artifacts/action.yml +++ b/.github/actions/build-linux-artifacts/action.yml @@ -87,6 +87,11 @@ runs: upload-to-s3: ${{ inputs.upload-to-s3 }} working-dir: ${{ inputs.working-dir }} + - name: Clean up the target directory # Clean up the target directory for the centos7 base image, or it will still use the objects of last build. + shell: bash + run: | + rm -rf ./target/ + - name: Build greptime on centos base image uses: ./.github/actions/build-greptime-binary if: ${{ inputs.arch == 'amd64' && inputs.dev-mode == 'false' }} # Only build centos7 base image for amd64. diff --git a/.github/actions/upload-artifacts/action.yml b/.github/actions/upload-artifacts/action.yml index 34132d211e..e02a392ba7 100644 --- a/.github/actions/upload-artifacts/action.yml +++ b/.github/actions/upload-artifacts/action.yml @@ -66,17 +66,13 @@ runs: name: ${{ inputs.artifacts-dir }}.sha256sum path: ${{ inputs.working-dir }}/${{ inputs.artifacts-dir }}.sha256sum - - name: Configure AWS credentials - if: ${{ inputs.upload-to-s3 == 'true' }} - uses: aws-actions/configure-aws-credentials@v2 - with: - aws-access-key-id: ${{ inputs.aws-access-key-id }} - aws-secret-access-key: ${{ inputs.aws-secret-access-key }} - aws-region: ${{ inputs.aws-region }} - - name: Upload artifacts to S3 if: ${{ inputs.upload-to-s3 == 'true' }} uses: nick-invision/retry@v2 + env: + AWS_ACCESS_KEY_ID: ${{ inputs.aws-access-key-id }} + AWS_SECRET_ACCESS_KEY: ${{ inputs.aws-secret-access-key }} + AWS_DEFAULT_REGION: ${{ inputs.aws-region }} with: max_attempts: 20 timeout_minutes: 5 diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index c54fd889b6..a0182d19ba 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -334,11 +334,11 @@ jobs: if: ${{ needs.release-images-to-dockerhub.outputs.build-result == 'success' }} with: payload: | - {"text": "GreptimeDB ${{ env.NEXT_RELEASE_VERSION }} build successful"} + {"text": "GreptimeDB's ${{ env.NEXT_RELEASE_VERSION }} build has completed successfully."} - name: Notifiy nightly build failed result uses: slackapi/slack-github-action@v1.23.0 if: ${{ needs.release-images-to-dockerhub.outputs.build-result != 'success' }} with: payload: | - {"text": "GreptimeDB ${{ env.NEXT_RELEASE_VERSION }} build failed, please check 'https://github.com/GreptimeTeam/greptimedb/actions/workflows/${{ env.NEXT_RELEASE_VERSION }}-build.yml'"} + {"text": "GreptimeDB's ${{ env.NEXT_RELEASE_VERSION }} build has failed, please check 'https://github.com/GreptimeTeam/greptimedb/actions/workflows/${{ env.NEXT_RELEASE_VERSION }}-build.yml'."} diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 234c200158..d776e6c52d 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -299,11 +299,11 @@ jobs: if: ${{ needs.release-images-to-dockerhub.outputs.nightly-build-result == 'success' }} with: payload: | - {"text": "GreptimeDB nightly build successful"} + {"text": "GreptimeDB's ${{ env.NEXT_RELEASE_VERSION }} build has completed successfully."} - name: Notifiy nightly build failed result uses: slackapi/slack-github-action@v1.23.0 if: ${{ needs.release-images-to-dockerhub.outputs.nightly-build-result != 'success' }} with: payload: | - {"text": "GreptimeDB nightly build failed, please check 'https://github.com/GreptimeTeam/greptimedb/actions/workflows/nightly-build.yml'"} + {"text": "GreptimeDB's ${{ env.NEXT_RELEASE_VERSION }} build has failed, please check 'https://github.com/GreptimeTeam/greptimedb/actions/workflows/${{ env.NEXT_RELEASE_VERSION }}-build.yml'."} diff --git a/Makefile b/Makefile index f8e932e78a..e285529646 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,8 @@ BUILDX_BUILDER_NAME ?= gtbuilder BASE_IMAGE ?= ubuntu RUST_TOOLCHAIN ?= $(shell cat rust-toolchain.toml | grep channel | cut -d'"' -f2) CARGO_REGISTRY_CACHE ?= ${HOME}/.cargo/registry +ARCH := $(shell uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/') +OUTPUT_DIR := $(shell if [ "$(RELEASE)" = "true" ]; then echo "release"; elif [ ! -z "$(CARGO_PROFILE)" ]; then echo "$(CARGO_PROFILE)" ; else echo "debug"; fi) # The arguments for running integration tests. ETCD_VERSION ?= v3.5.9 @@ -43,6 +45,10 @@ ifneq ($(strip $(TARGET)),) CARGO_BUILD_OPTS += --target ${TARGET} endif +ifneq ($(strip $(RELEASE)),) + CARGO_BUILD_OPTS += --release +endif + ifeq ($(BUILDX_MULTI_PLATFORM_BUILD), true) BUILDX_MULTI_PLATFORM_BUILD_OPTS := --platform linux/amd64,linux/arm64 --push else @@ -52,26 +58,20 @@ endif ##@ Build .PHONY: build -build: ## Build debug version greptime. If USE_DEV_BUILDER is true, the binary will be built in dev-builder. -ifeq ($(USE_DEV_BUILDER), true) - docker run --network=host \ - -v ${PWD}:/greptimedb -v ${CARGO_REGISTRY_CACHE}:/root/.cargo/registry \ - -w /greptimedb ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/dev-builder:latest \ - make build CARGO_PROFILE=${CARGO_PROFILE} FEATURES=${FEATURES} TARGET_DIR=${TARGET_DIR} -else +build: ## Build debug version greptime. cargo build ${CARGO_BUILD_OPTS} -endif -.PHONY: release -release: ## Build release version greptime. If USE_DEV_BUILDER is true, the binary will be built in dev-builder. -ifeq ($(USE_DEV_BUILDER), true) +.POHNY: build-by-dev-builder +build-by-dev-builder: ## Build greptime by dev-builder. docker run --network=host \ -v ${PWD}:/greptimedb -v ${CARGO_REGISTRY_CACHE}:/root/.cargo/registry \ - -w /greptimedb ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/dev-builder:latest \ - make release CARGO_PROFILE=${CARGO_PROFILE} FEATURES=${FEATURES} TARGET_DIR=${TARGET_DIR} -else - cargo build --release ${CARGO_BUILD_OPTS} -endif + -w /greptimedb ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/dev-builder-${BASE_IMAGE}:latest \ + make build \ + CARGO_PROFILE=${CARGO_PROFILE} \ + FEATURES=${FEATURES} \ + TARGET_DIR=${TARGET_DIR} \ + TARGET=${TARGET} \ + RELEASE=${RELEASE} .PHONY: clean clean: ## Clean the project. @@ -90,30 +90,27 @@ check-toml: ## Check all TOML files. taplo format --check .PHONY: docker-image -docker-image: multi-platform-buildx ## Build docker image. +docker-image: build-by-dev-builder ## Build docker image. + mkdir -p ${ARCH} && \ + cp ./target/${OUTPUT_DIR}/greptime ${ARCH}/greptime && \ + docker build -f docker/ci/${BASE_IMAGE}/Dockerfile -t ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/greptimedb:${IMAGE_TAG} . && \ + rm -r ${ARCH} + +.PHONY: docker-image-buildx +docker-image-buildx: multi-platform-buildx ## Build docker image by buildx. docker buildx build --builder ${BUILDX_BUILDER_NAME} \ - --build-arg="CARGO_PROFILE=${CARGO_PROFILE}" --build-arg="FEATURES=${FEATURES}" \ - -f docker/${BASE_IMAGE}/Dockerfile \ + --build-arg="CARGO_PROFILE=${CARGO_PROFILE}" \ + --build-arg="FEATURES=${FEATURES}" \ + --build-arg="OUTPUT_DIR=${OUTPUT_DIR}" \ + -f docker/buildx/${BASE_IMAGE}/Dockerfile \ -t ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/greptimedb:${IMAGE_TAG} ${BUILDX_MULTI_PLATFORM_BUILD_OPTS} . -.PHONY: build-greptime-by-buildx -build-greptime-by-buildx: multi-platform-buildx ## Build greptime binary by docker buildx. The binary will be copied to the current directory. - docker buildx build --builder ${BUILDX_BUILDER_NAME} \ - --target=builder \ - --build-arg="CARGO_PROFILE=${CARGO_PROFILE}" --build-arg="FEATURES=${FEATURES}" \ - -f docker/${BASE_IMAGE}/Dockerfile \ - -t ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/greptimedb-builder:${IMAGE_TAG} ${BUILDX_MULTI_PLATFORM_BUILD_OPTS} . - - docker run --rm -v ${PWD}:/data \ - --entrypoint cp ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/greptimedb-builder:${IMAGE_TAG} \ - /out/target/${CARGO_PROFILE}/greptime /data/greptime - .PHONY: dev-builder dev-builder: multi-platform-buildx ## Build dev-builder image. docker buildx build --builder ${BUILDX_BUILDER_NAME} \ --build-arg="RUST_TOOLCHAIN=${RUST_TOOLCHAIN}" \ - -f docker/dev-builder/Dockerfile \ - -t ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/dev-builder:${IMAGE_TAG} ${BUILDX_MULTI_PLATFORM_BUILD_OPTS} . + -f docker/dev-builder/${BASE_IMAGE}/Dockerfile \ + -t ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/dev-builder-${BASE_IMAGE}:${IMAGE_TAG} ${BUILDX_MULTI_PLATFORM_BUILD_OPTS} . .PHONY: multi-platform-buildx multi-platform-buildx: ## Create buildx multi-platform builder. @@ -155,7 +152,7 @@ stop-etcd: ## Stop single node etcd for testing purpose. run-it-in-container: start-etcd ## Run integration tests in dev-builder. docker run --network=host \ -v ${PWD}:/greptimedb -v ${CARGO_REGISTRY_CACHE}:/root/.cargo/registry -v /tmp:/tmp \ - -w /greptimedb ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/dev-builder:latest \ + -w /greptimedb ${IMAGE_REGISTRY}/${IMAGE_NAMESPACE}/dev-builder-${BASE_IMAGE}:latest \ make test sqlness-test BUILD_JOBS=${BUILD_JOBS} ##@ General diff --git a/docker/centos/Dockerfile b/docker/buildx/centos/Dockerfile similarity index 86% rename from docker/centos/Dockerfile rename to docker/buildx/centos/Dockerfile index 843fd827f8..9f4f525f5e 100644 --- a/docker/centos/Dockerfile +++ b/docker/buildx/centos/Dockerfile @@ -2,6 +2,7 @@ FROM centos:7 as builder ARG CARGO_PROFILE ARG FEATURES +ARG OUTPUT_DIR ENV LANG en_US.utf8 WORKDIR /greptimedb @@ -13,7 +14,8 @@ RUN yum install -y epel-release \ openssl-devel \ centos-release-scl \ rh-python38 \ - rh-python38-python-devel + rh-python38-python-devel \ + which # Install protoc RUN curl -LO https://github.com/protocolbuffers/protobuf/releases/download/v3.15.8/protoc-3.15.8-linux-x86_64.zip @@ -35,17 +37,18 @@ RUN --mount=target=.,rw \ # Export the binary to the clean image. FROM centos:7 as base -ARG CARGO_PROFILE +ARG OUTPUT_DIR RUN yum install -y epel-release \ openssl \ openssl-devel \ centos-release-scl \ rh-python38 \ - rh-python38-python-devel + rh-python38-python-devel \ + which WORKDIR /greptime -COPY --from=builder /out/target/${CARGO_PROFILE}/greptime /greptime/bin/ +COPY --from=builder /out/target/${OUTPUT_DIR}/greptime /greptime/bin/ ENV PATH /greptime/bin/:$PATH ENTRYPOINT ["greptime"] diff --git a/docker/ubuntu/Dockerfile b/docker/buildx/ubuntu/Dockerfile similarity index 91% rename from docker/ubuntu/Dockerfile rename to docker/buildx/ubuntu/Dockerfile index cdb09f774e..e005a0015e 100644 --- a/docker/ubuntu/Dockerfile +++ b/docker/buildx/ubuntu/Dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:22.04 as builder ARG CARGO_PROFILE ARG FEATURES +ARG OUTPUT_DIR ENV LANG en_US.utf8 WORKDIR /greptimedb @@ -25,7 +26,7 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --no-mo ENV PATH /root/.cargo/bin/:$PATH # Build the project in release mode. -RUN --mount=target=.,rw \ +RUN --mount=target=. \ --mount=type=cache,target=/root/.cargo/registry \ make build \ CARGO_PROFILE=${CARGO_PROFILE} \ @@ -36,7 +37,7 @@ RUN --mount=target=.,rw \ # TODO(zyy17): Maybe should use the more secure container image. FROM ubuntu:22.04 as base -ARG CARGO_PROFILE +ARG OUTPUT_DIR RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get \ -y install ca-certificates \ @@ -50,7 +51,7 @@ COPY ./docker/python/requirements.txt /etc/greptime/requirements.txt RUN python3 -m pip install -r /etc/greptime/requirements.txt WORKDIR /greptime -COPY --from=builder /out/target/${CARGO_PROFILE}/greptime /greptime/bin/ +COPY --from=builder /out/target/${OUTPUT_DIR}/greptime /greptime/bin/ ENV PATH /greptime/bin/:$PATH ENTRYPOINT ["greptime"] diff --git a/docker/ci/Dockerfile-centos b/docker/ci/centos/Dockerfile similarity index 100% rename from docker/ci/Dockerfile-centos rename to docker/ci/centos/Dockerfile diff --git a/docker/ci/Dockerfile b/docker/ci/ubuntu/Dockerfile similarity index 100% rename from docker/ci/Dockerfile rename to docker/ci/ubuntu/Dockerfile diff --git a/docker/dev-builder/centos/Dockerfile b/docker/dev-builder/centos/Dockerfile new file mode 100644 index 0000000000..111c5ca428 --- /dev/null +++ b/docker/dev-builder/centos/Dockerfile @@ -0,0 +1,29 @@ +FROM centos:7 as builder + +ENV LANG en_US.utf8 + +# Install dependencies +RUN ulimit -n 1024000 && yum groupinstall -y 'Development Tools' +RUN yum install -y epel-release \ + openssl \ + openssl-devel \ + centos-release-scl \ + rh-python38 \ + rh-python38-python-devel \ + which + +# Install protoc +RUN curl -LO https://github.com/protocolbuffers/protobuf/releases/download/v3.15.8/protoc-3.15.8-linux-x86_64.zip +RUN unzip protoc-3.15.8-linux-x86_64.zip -d /usr/local/ + +# Install Rust +SHELL ["/bin/bash", "-c"] +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --no-modify-path --default-toolchain none -y +ENV PATH /opt/rh/rh-python38/root/usr/bin:/usr/local/bin:/root/.cargo/bin/:$PATH + +# Install Rust toolchains. +ARG RUST_TOOLCHAIN +RUN rustup toolchain install ${RUST_TOOLCHAIN} + +# Install nextest. +RUN cargo install cargo-nextest --locked diff --git a/docker/dev-builder/Dockerfile b/docker/dev-builder/ubuntu/Dockerfile similarity index 100% rename from docker/dev-builder/Dockerfile rename to docker/dev-builder/ubuntu/Dockerfile