on: push: tags: - "v*.*.*" schedule: # At 00:00 on Monday. - cron: '0 0 * * 1' # Mannually trigger only builds binaries. workflow_dispatch: inputs: dry_run: description: 'Skip docker push and release steps' type: boolean default: true skip_test: description: 'Do not run tests during build' type: boolean default: false name: Release env: RUST_TOOLCHAIN: nightly-2023-05-03 SCHEDULED_BUILD_VERSION_PREFIX: v0.4.0 SCHEDULED_PERIOD: nightly CARGO_PROFILE: nightly # Controls whether to run tests, include unit-test, integration-test and sqlness. DISABLE_RUN_TESTS: ${{ inputs.skip_test || false }} jobs: build-macos: name: Build macOS binary strategy: fail-fast: false matrix: # The file format is greptime-- include: - arch: aarch64-apple-darwin os: macos-latest file: greptime-darwin-arm64 continue-on-error: false opts: "-F servers/dashboard" - arch: x86_64-apple-darwin os: macos-latest file: greptime-darwin-amd64 continue-on-error: false opts: "-F servers/dashboard" - arch: aarch64-apple-darwin os: macos-latest file: greptime-darwin-arm64-pyo3 continue-on-error: false opts: "-F pyo3_backend,servers/dashboard" - arch: x86_64-apple-darwin os: macos-latest file: greptime-darwin-amd64-pyo3 continue-on-error: false opts: "-F pyo3_backend,servers/dashboard" runs-on: ${{ matrix.os }} continue-on-error: ${{ matrix.continue-on-error }} if: github.repository == 'GreptimeTeam/greptimedb' steps: - name: Checkout sources uses: actions/checkout@v3 - name: Cache cargo assets id: cache uses: actions/cache@v3 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ matrix.arch }}-build-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Install Protoc for macos if: contains(matrix.arch, 'darwin') run: | brew install protobuf - name: Install etcd for macos if: contains(matrix.arch, 'darwin') run: | brew install etcd brew services start etcd - name: Install rust toolchain uses: dtolnay/rust-toolchain@master with: toolchain: ${{ env.RUST_TOOLCHAIN }} targets: ${{ matrix.arch }} - name: Install latest nextest release uses: taiki-e/install-action@nextest - name: Output package versions run: protoc --version ; cargo version ; rustc --version ; gcc --version ; g++ --version - name: Run tests if: env.DISABLE_RUN_TESTS == 'false' run: make test sqlness-test - name: Run cargo build if: contains(matrix.arch, 'darwin') || contains(matrix.opts, 'pyo3_backend') == false run: cargo build --profile ${{ env.CARGO_PROFILE }} --locked --target ${{ matrix.arch }} ${{ matrix.opts }} - name: Calculate checksum and rename binary shell: bash run: | cd target/${{ matrix.arch }}/${{ env.CARGO_PROFILE }} chmod +x greptime tar -zcvf ${{ matrix.file }}.tgz greptime echo $(shasum -a 256 ${{ matrix.file }}.tgz | cut -f1 -d' ') > ${{ matrix.file }}.sha256sum - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: ${{ matrix.file }} path: target/${{ matrix.arch }}/${{ env.CARGO_PROFILE }}/${{ matrix.file }}.tgz - name: Upload checksum of artifacts uses: actions/upload-artifact@v3 with: name: ${{ matrix.file }}.sha256sum path: target/${{ matrix.arch }}/${{ env.CARGO_PROFILE }}/${{ matrix.file }}.sha256sum - name: Configure tag shell: bash if: github.event_name == 'push' run: | VERSION=${{ github.ref_name }} echo "TAG=${VERSION:1}" >> $GITHUB_ENV - name: Upload to S3 run: | aws s3 cp target/${{ matrix.arch }}/${{ env.CARGO_PROFILE }} s3://${{ secrets.GREPTIMEDB_RELEASE_BUCKET_NAME }}/releases/${TAG} --recursive --exclude "*" --include "*.tgz" env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_CN_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_CN_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: ${{ secrets.AWS_CN_REGION }} build-linux: name: Build linux binary strategy: fail-fast: false matrix: # The file format is greptime-- include: - arch: x86_64-unknown-linux-gnu os: ubuntu-2004-16-cores file: greptime-linux-amd64 continue-on-error: false opts: "-F servers/dashboard" - arch: aarch64-unknown-linux-gnu os: ubuntu-2004-16-cores file: greptime-linux-arm64 continue-on-error: false opts: "-F servers/dashboard" - arch: x86_64-unknown-linux-gnu os: ubuntu-2004-16-cores file: greptime-linux-amd64-pyo3 continue-on-error: false opts: "-F pyo3_backend,servers/dashboard" - arch: aarch64-unknown-linux-gnu os: ubuntu-2004-16-cores file: greptime-linux-arm64-pyo3 continue-on-error: false opts: "-F pyo3_backend,servers/dashboard" runs-on: ${{ matrix.os }} continue-on-error: ${{ matrix.continue-on-error }} if: github.repository == 'GreptimeTeam/greptimedb' steps: - name: Checkout sources uses: actions/checkout@v3 - name: Cache cargo assets id: cache uses: actions/cache@v3 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ matrix.arch }}-build-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Install Protoc for linux if: contains(matrix.arch, 'linux') && endsWith(matrix.arch, '-gnu') run: | # Make sure the protoc is >= 3.15 wget https://github.com/protocolbuffers/protobuf/releases/download/v21.9/protoc-21.9-linux-x86_64.zip unzip protoc-21.9-linux-x86_64.zip -d protoc sudo cp protoc/bin/protoc /usr/local/bin/ sudo cp -r protoc/include/google /usr/local/include/ - name: Install etcd for linux if: contains(matrix.arch, 'linux') && endsWith(matrix.arch, '-gnu') run: | ETCD_VER=v3.5.7 DOWNLOAD_URL=https://github.com/etcd-io/etcd/releases/download curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz mkdir -p /tmp/etcd-download tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download --strip-components=1 rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz sudo cp -a /tmp/etcd-download/etcd* /usr/local/bin/ nohup etcd >/tmp/etcd.log 2>&1 & - name: Install dependencies for linux if: contains(matrix.arch, 'linux') && endsWith(matrix.arch, '-gnu') run: | sudo apt-get -y update sudo apt-get -y install libssl-dev pkg-config g++-aarch64-linux-gnu gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu wget # FIXME(zyy17): Should we specify the version of python when building binary for darwin? - name: Compile Python 3.10.10 from source for linux if: contains(matrix.arch, 'linux') && contains(matrix.opts, 'pyo3_backend') run: | sudo chmod +x ./docker/aarch64/compile-python.sh sudo ./docker/aarch64/compile-python.sh ${{ matrix.arch }} - name: Install rust toolchain uses: dtolnay/rust-toolchain@master with: toolchain: ${{ env.RUST_TOOLCHAIN }} targets: ${{ matrix.arch }} - name: Install latest nextest release uses: taiki-e/install-action@nextest - name: Output package versions run: protoc --version ; cargo version ; rustc --version ; gcc --version ; g++ --version - name: Run tests if: env.DISABLE_RUN_TESTS == 'false' run: make test sqlness-test - name: Run cargo build if: contains(matrix.arch, 'darwin') || contains(matrix.opts, 'pyo3_backend') == false run: cargo build --profile ${{ env.CARGO_PROFILE }} --locked --target ${{ matrix.arch }} ${{ matrix.opts }} - name: Run cargo build with pyo3 for aarch64-linux if: contains(matrix.arch, 'aarch64-unknown-linux-gnu') && contains(matrix.opts, 'pyo3_backend') run: | # TODO(zyy17): We should make PYO3_CROSS_LIB_DIR configurable. export PYTHON_INSTALL_PATH_AMD64=${PWD}/python-3.10.10/amd64 export LD_LIBRARY_PATH=$PYTHON_INSTALL_PATH_AMD64/lib:$LD_LIBRARY_PATH export LIBRARY_PATH=$PYTHON_INSTALL_PATH_AMD64/lib:$LIBRARY_PATH export PATH=$PYTHON_INSTALL_PATH_AMD64/bin:$PATH export PYO3_CROSS_LIB_DIR=${PWD}/python-3.10.10/aarch64 echo "PYO3_CROSS_LIB_DIR: $PYO3_CROSS_LIB_DIR" alias python=$PYTHON_INSTALL_PATH_AMD64/bin/python3 alias pip=$PYTHON_INSTALL_PATH_AMD64/bin/python3-pip cargo build --profile ${{ env.CARGO_PROFILE }} --locked --target ${{ matrix.arch }} ${{ matrix.opts }} - name: Run cargo build with pyo3 for amd64-linux if: contains(matrix.arch, 'x86_64-unknown-linux-gnu') && contains(matrix.opts, 'pyo3_backend') run: | export PYTHON_INSTALL_PATH_AMD64=${PWD}/python-3.10.10/amd64 export LD_LIBRARY_PATH=$PYTHON_INSTALL_PATH_AMD64/lib:$LD_LIBRARY_PATH export LIBRARY_PATH=$PYTHON_INSTALL_PATH_AMD64/lib:$LIBRARY_PATH export PATH=$PYTHON_INSTALL_PATH_AMD64/bin:$PATH echo "implementation=CPython" >> pyo3.config echo "version=3.10" >> pyo3.config echo "implementation=CPython" >> pyo3.config echo "shared=true" >> pyo3.config echo "abi3=true" >> pyo3.config echo "lib_name=python3.10" >> pyo3.config echo "lib_dir=$PYTHON_INSTALL_PATH_AMD64/lib" >> pyo3.config echo "executable=$PYTHON_INSTALL_PATH_AMD64/bin/python3" >> pyo3.config echo "pointer_width=64" >> pyo3.config echo "build_flags=" >> pyo3.config echo "suppress_build_script_link_lines=false" >> pyo3.config cat pyo3.config export PYO3_CONFIG_FILE=${PWD}/pyo3.config alias python=$PYTHON_INSTALL_PATH_AMD64/bin/python3 alias pip=$PYTHON_INSTALL_PATH_AMD64/bin/python3-pip cargo build --profile ${{ env.CARGO_PROFILE }} --locked --target ${{ matrix.arch }} ${{ matrix.opts }} - name: Calculate checksum and rename binary shell: bash run: | cd target/${{ matrix.arch }}/${{ env.CARGO_PROFILE }} chmod +x greptime tar -zcvf ${{ matrix.file }}.tgz greptime echo $(shasum -a 256 ${{ matrix.file }}.tgz | cut -f1 -d' ') > ${{ matrix.file }}.sha256sum - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: ${{ matrix.file }} path: target/${{ matrix.arch }}/${{ env.CARGO_PROFILE }}/${{ matrix.file }}.tgz - name: Upload checksum of artifacts uses: actions/upload-artifact@v3 with: name: ${{ matrix.file }}.sha256sum path: target/${{ matrix.arch }}/${{ env.CARGO_PROFILE }}/${{ matrix.file }}.sha256sum - name: Configure tag shell: bash if: github.event_name == 'push' run: | VERSION=${{ github.ref_name }} echo "TAG=${VERSION:1}" >> $GITHUB_ENV - name: Upload to S3 run: | aws s3 cp target/${{ matrix.arch }}/${{ env.CARGO_PROFILE }} s3://${{ secrets.GREPTIMEDB_RELEASE_BUCKET_NAME }}/releases/${TAG} --recursive --exclude "*" --include "*.tgz" env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_CN_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_CN_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: ${{ secrets.AWS_CN_REGION }} docker: name: Build docker image needs: [build-linux, build-macos] runs-on: ubuntu-latest if: github.repository == 'GreptimeTeam/greptimedb' && !(inputs.dry_run || false) steps: - name: Checkout sources uses: actions/checkout@v3 - name: Login to Dockerhub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Configure scheduled build image tag # the tag would be ${SCHEDULED_BUILD_VERSION_PREFIX}-YYYYMMDD-${SCHEDULED_PERIOD} shell: bash if: github.event_name != 'push' run: | buildTime=`date "+%Y%m%d"` SCHEDULED_BUILD_VERSION=${{ env.SCHEDULED_BUILD_VERSION_PREFIX }}-$buildTime-${{ env.SCHEDULED_PERIOD }} echo "IMAGE_TAG=${SCHEDULED_BUILD_VERSION:1}" >> $GITHUB_ENV - name: Configure tag # If the release tag is v0.1.0, then the image version tag will be 0.1.0. shell: bash if: github.event_name == 'push' run: | VERSION=${{ github.ref_name }} echo "IMAGE_TAG=${VERSION:1}" >> $GITHUB_ENV - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up buildx uses: docker/setup-buildx-action@v2 - name: Download amd64 binary uses: actions/download-artifact@v3 with: name: greptime-linux-amd64-pyo3 path: amd64 - name: Unzip the amd64 artifacts run: | tar xvf amd64/greptime-linux-amd64-pyo3.tgz -C amd64/ && rm amd64/greptime-linux-amd64-pyo3.tgz cp -r amd64 docker/ci - name: Download arm64 binary id: download-arm64 uses: actions/download-artifact@v3 with: name: greptime-linux-arm64-pyo3 path: arm64 - name: Unzip the arm64 artifacts id: unzip-arm64 if: success() || steps.download-arm64.conclusion == 'success' run: | tar xvf arm64/greptime-linux-arm64-pyo3.tgz -C arm64/ && rm arm64/greptime-linux-arm64-pyo3.tgz cp -r arm64 docker/ci - name: Build and push all uses: docker/build-push-action@v3 if: success() || steps.unzip-arm64.conclusion == 'success' # Build and push all platform if unzip-arm64 succeeds with: context: ./docker/ci/ file: ./docker/ci/Dockerfile push: true platforms: linux/amd64,linux/arm64 tags: | greptime/greptimedb:latest greptime/greptimedb:${{ env.IMAGE_TAG }} - name: Build and push amd64 only uses: docker/build-push-action@v3 if: success() || steps.download-arm64.conclusion == 'failure' # Only build and push amd64 platform if download-arm64 fails with: context: ./docker/ci/ file: ./docker/ci/Dockerfile push: true platforms: linux/amd64 tags: | greptime/greptimedb:latest greptime/greptimedb:${{ env.IMAGE_TAG }} release: name: Release artifacts # Release artifacts only when all the artifacts are built successfully. needs: [build-linux, build-macos, docker] runs-on: ubuntu-latest if: github.repository == 'GreptimeTeam/greptimedb' && !(inputs.dry_run || false) steps: - name: Checkout sources uses: actions/checkout@v3 - name: Download artifacts uses: actions/download-artifact@v3 - name: Configure scheduled build version # the version would be ${SCHEDULED_BUILD_VERSION_PREFIX}-${SCHEDULED_PERIOD}-YYYYMMDD, like v0.2.0-nigthly-20230313. shell: bash if: github.event_name != 'push' run: | buildTime=`date "+%Y%m%d"` SCHEDULED_BUILD_VERSION=${{ env.SCHEDULED_BUILD_VERSION_PREFIX }}-${{ env.SCHEDULED_PERIOD }}-$buildTime echo "SCHEDULED_BUILD_VERSION=${SCHEDULED_BUILD_VERSION}" >> $GITHUB_ENV # Only publish release when the release tag is like v1.0.0, v1.0.1, v1.0.2, etc. - name: Set whether it is the latest release run: | if [[ "${{ github.ref_name }}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "prerelease=false" >> $GITHUB_ENV echo "makeLatest=true" >> $GITHUB_ENV else echo "prerelease=true" >> $GITHUB_ENV echo "makeLatest=false" >> $GITHUB_ENV fi - name: Create scheduled build git tag if: github.event_name != 'push' run: | git tag ${{ env.SCHEDULED_BUILD_VERSION }} - name: Publish scheduled release # configure the different release title and tags. uses: ncipollo/release-action@v1 if: github.event_name != 'push' with: name: "Release ${{ env.SCHEDULED_BUILD_VERSION }}" prerelease: ${{ env.prerelease }} makeLatest: ${{ env.makeLatest }} tag: ${{ env.SCHEDULED_BUILD_VERSION }} generateReleaseNotes: true artifacts: | **/greptime-* - name: Publish release uses: ncipollo/release-action@v1 if: github.event_name == 'push' with: name: "${{ github.ref_name }}" prerelease: ${{ env.prerelease }} makeLatest: ${{ env.makeLatest }} generateReleaseNotes: false allowUpdates: true artifacts: | **/greptime-* docker-push-acr: name: Push docker image to alibaba cloud container registry needs: [docker] runs-on: ubuntu-latest if: github.repository == 'GreptimeTeam/greptimedb' && !(inputs.dry_run || false) continue-on-error: true steps: - name: Checkout sources uses: actions/checkout@v3 - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to alibaba cloud container registry uses: docker/login-action@v2 with: registry: registry.cn-hangzhou.aliyuncs.com username: ${{ secrets.ALICLOUD_USERNAME }} password: ${{ secrets.ALICLOUD_PASSWORD }} - name: Configure scheduled build image tag # the tag would be ${SCHEDULED_BUILD_VERSION_PREFIX}-YYYYMMDD-${SCHEDULED_PERIOD} shell: bash if: github.event_name != 'push' run: | buildTime=`date "+%Y%m%d"` SCHEDULED_BUILD_VERSION=${{ env.SCHEDULED_BUILD_VERSION_PREFIX }}-$buildTime-${{ env.SCHEDULED_PERIOD }} echo "IMAGE_TAG=${SCHEDULED_BUILD_VERSION:1}" >> $GITHUB_ENV - name: Configure tag # If the release tag is v0.1.0, then the image version tag will be 0.1.0. shell: bash if: github.event_name == 'push' run: | VERSION=${{ github.ref_name }} echo "IMAGE_TAG=${VERSION:1}" >> $GITHUB_ENV - name: Push image to alibaba cloud container registry # Use 'docker buildx imagetools create' to create a new image base on source image. run: | docker buildx imagetools create \ --tag registry.cn-hangzhou.aliyuncs.com/greptime/greptimedb:latest \ --tag registry.cn-hangzhou.aliyuncs.com/greptime/greptimedb:${{ env.IMAGE_TAG }} \ greptime/greptimedb:${{ env.IMAGE_TAG }}