diff --git a/scripts/containers/mssql.sh b/scripts/containers/mssql.sh index ce154c71a85..c5c56c8ebaa 100644 --- a/scripts/containers/mssql.sh +++ b/scripts/containers/mssql.sh @@ -19,6 +19,13 @@ MSSQL_CONTAINER_NAME="hasura-dev-mssql-$MSSQL_PORT" MSSQL_CONN_STR="DRIVER={ODBC Driver 17 for SQL Server};SERVER=127.0.0.1,$MSSQL_PORT;Uid=sa;Pwd=$MSSQL_PASSWORD;" MSSQL_DOCKER="docker exec -it $MSSQL_CONTAINER_NAME sqlcmd -S localhost -U sa -P $MSSQL_PASSWORD" +if [[ `uname -m` == 'arm64' ]]; then + MSSQL_PLATFORM=linux/arm64 + MSSQL_CONTAINER_IMAGE=mcr.microsoft.com/azure-sql-edge +else + MSSQL_PLATFORM=linux/amd64 + MSSQL_CONTAINER_IMAGE=hasura/mssql-server-2019-cu10-ubuntu-20.04:latest +fi ###################### # Functions # @@ -27,7 +34,9 @@ MSSQL_DOCKER="docker exec -it $MSSQL_CONTAINER_NAME sqlcmd -S localhost -U sa -P function mssql_launch_container(){ echo_pretty "Launching MSSQL container: $MSSQL_CONTAINER_NAME" docker run --name $MSSQL_CONTAINER_NAME \ - -p 127.0.0.1:"$MSSQL_PORT":1433 -d hasura/mssql-server-2019-cu10-ubuntu-20.04:latest + --platform "$MSSQL_PLATFORM" \ + -e ACCEPT_EULA=1 \ + -p 127.0.0.1:"$MSSQL_PORT":1433 -d "$MSSQL_CONTAINER_IMAGE" } function mssql_wait { diff --git a/scripts/containers/mysql.sh b/scripts/containers/mysql.sh index 5819ebc5110..bae786be538 100644 --- a/scripts/containers/mysql.sh +++ b/scripts/containers/mysql.sh @@ -19,6 +19,8 @@ MYSQL_PASSWORD=hasuraMySQL1 MYSQL_CONTAINER_NAME="hasura-dev-mysql-$MYSQL_PORT" # space deliberately omitted between -u and -p params https://hub.docker.com/_/mysql MYSQL_DOCKER="docker exec -it $MYSQL_CONTAINER_NAME mysql -u$MYSQL_USER -p$MYSQL_PASSWORD" +MYSQL_CONTAINER_IMAGE=mysql:8.0 +MYSQL_PLATFORM=linux/amd64 # for M1 arch we use the rosetta emulation ###################### # Functions # @@ -29,8 +31,9 @@ function mysql_launch_container(){ docker run --name $MYSQL_CONTAINER_NAME \ -e MYSQL_ROOT_PASSWORD=$MYSQL_PASSWORD \ -e MYSQL_DATABASE=hasura \ + --platform "$MYSQL_PLATFORM" \ -p 127.0.0.1:$MYSQL_PORT:3306 \ - -d mysql:8.0 -h "127.0.0.1" + -d "$MYSQL_CONTAINER_IMAGE" -h "127.0.0.1" } function mysql_wait { diff --git a/scripts/containers/postgres b/scripts/containers/postgres index d8ce32f25e3..ddf3cc07edd 100644 --- a/scripts/containers/postgres +++ b/scripts/containers/postgres @@ -15,9 +15,15 @@ fi PG_PASSWORD=postgres PG_CONTAINER_NAME="hasura-dev-postgres-$PG_PORT" -PG_DB_URL="postgres://postgres:$PG_PASSWORD@127.0.0.1:$PG_PORT/postgres" +PG_DB_URL="postgresql://postgres:$PG_PASSWORD@127.0.0.1:$PG_PORT/postgres" PG_DOCKER="docker exec -u postgres -it $PG_CONTAINER_NAME psql $PG_DB_URL" +if [[ `uname -m` == 'arm64' ]]; then + PG_CONTAINER_IMAGE=sayitsocial/postgis:raspi +else + PG_CONTAINER_IMAGE=circleci/postgres:11.5-alpine-postgis +fi + # NOTE FWIW: # Brandon tried these options to speed up integration tests, but to little effect: # fsync=off @@ -66,7 +72,7 @@ function pg_launch_container(){ -p 127.0.0.1:"$PG_PORT":$PG_PORT \ --expose="$PG_PORT" \ -e POSTGRES_PASSWORD="$PG_PASSWORD" \ - -d circleci/postgres:11.5-alpine-postgis \ + -d "$PG_CONTAINER_IMAGE" \ $CONF_FLAGS # graphql-engine calls the pg_dump executable. To avoid a version mismatch (and diff --git a/scripts/dev.sh b/scripts/dev.sh index c5a49737da3..471f0971356 100755 --- a/scripts/dev.sh +++ b/scripts/dev.sh @@ -202,7 +202,17 @@ function pg_start() { function mssql_start() { mssql_launch_container MSSQL_RUNNING=1 - mssql_wait + if [[ `uname -m` == 'arm64' ]]; then + # mssql_wait uses the tool sqlcmd to wait for a database connection which unfortunately + # is not available for the azure-sql-edge docker image - which is the only image from microsoft + # that runs on M1 computers. So we sleep for 20 seconds, cross fingers and hope for the best + # see https://github.com/microsoft/mssql-docker/issues/668 + + echo "Sleeping for 20 sec while mssql comes up..." + sleep 20 + else + mssql_wait + fi } function citus_start() { diff --git a/server/COMPILING-ON-M1.md b/server/COMPILING-ON-M1.md new file mode 100644 index 00000000000..b7b4c262313 --- /dev/null +++ b/server/COMPILING-ON-M1.md @@ -0,0 +1,101 @@ +# Compile a native arm64 graphql-engine executable on M1 using brew and ghc-8.10.7 + +1. Install ghc-8.10.7 and cabal-install via ghcup + +2. Install dependencies: + + ```sh + brew install google-cloud-sdk + brew install node@14 + brew install openssl + brew install pcre + brew install unixodbc + brew install libpq + brew install mysql-client@5.7 + brew install libffi + brew install llvm@11 + ``` + + And add them to your environment: + + ```sh + echo 'export PATH="/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin:$PATH"' >> ~/.zshrc + echo 'export PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc + echo 'export PATH="/opt/homebrew/opt/node@14/bin:$PATH"' >> ~/.zshrc + echo 'export PATH="/opt/homebrew/opt/mysql-client@5.7/bin:$PATH"' >> ~/.zshrc + echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc + echo 'export PATH="/opt/homebrew/opt/llvm@11/bin:$PATH"' >> ~/.zshrc + ``` + + +3. Install console assets + + ```sh + cd console + npm ci + npm run server-build + cd .. + ``` + +4. Install python + + ```sh + export PKG_CONFIG_PATH="/opt/homebrew/opt/libffi/lib/pkgconfig" + export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib" + + cd server + python3 -m venv .python-venv + source .python-venv/bin/activate + pip3 install -r tests-py/requirements.txt + (cd tests-py/remote_schemas/nodejs && npm ci) + ``` + +5. Add the C dependencies in the `cabal.project.dev-sh.local` and `cabal.project.local` files (according to where the dependencies were installed by homebrew): + + ```sh + package mysql + extra-include-dirs: + /opt/homebrew/opt/openssl/include + /opt/homebrew/opt/mysql-client@5.7/include + extra-lib-dirs: + /opt/homebrew/opt/openssl/lib + /opt/homebrew/opt/mysql-client@5.7/lib + + package odbc + extra-include-dirs: /opt/homebrew/opt/unixodbc/include + extra-lib-dirs: /opt/homebrew/opt/unixodbc/lib + + package pcre-light + extra-include-dirs: /opt/homebrew/opt/pcre/include + extra-lib-dirs: /opt/homebrew/opt/pcre/lib + + package postgresql-libpq + extra-include-dirs: + /opt/homebrew/opt/libpq/include + /opt/homebrew/opt/openssl/include + extra-lib-dirs: + /opt/homebrew/opt/libpq/lib + /opt/homebrew/opt/openssl/lib + + package pg-client + extra-include-dirs: + /opt/homebrew/opt/libpq/include + /opt/homebrew/opt/openssl/include + extra-lib-dirs: + /opt/homebrew/opt/libpq/lib + /opt/homebrew/opt/openssl/lib + ``` + + Note: If you don't have special requirements of a `cabal.project.local` you can just add a symbolic link to `cabal.project.dev-sh.local`: + + ```sh + ln -s cabal.project.dev-sh.local cabal.project.local + ``` + + +6. Building the server should now work: + + ```sh + cabal v2-update + cabal v2-build graphql-engine -j4 + ```