diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..164e365c --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,14 @@ +FROM mcr.microsoft.com/devcontainers/dotnet:1-8.0-bookworm + +# Install SQL Tools: SQLPackage and sqlcmd +COPY mssql/installSQLtools.sh installSQLtools.sh +RUN bash ./installSQLtools.sh \ + && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts + +# [Optional] Uncomment this section to install additional OS packages. +# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ +# && apt-get -y install --no-install-recommends + +# [Optional] Uncomment this line to install global node packages. +RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install 21 && nvm use 21 && npm install -g typescript" 2>&1 +# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..337d1091 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,59 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet-mssql +{ + "name": ".NET (C#), Node.js (TypeScript) & MS SQL", + "dockerComposeFile": "docker-compose.yml", + "service": "app", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Set *default* container specific settings.json values on container create. + "settings": { + "mssql.connections": [ + { + "server": "localhost,1433", + "database": "", + "authenticationType": "SqlLogin", + "user": "sa", + "password": "P@ssw0rd", + "emptyPasswordInput": false, + "savePassword": false, + "profileName": "mssql-container" + } + ] + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "ms-dotnettools.csharp", + "ms-mssql.mssql", + "ms-vscode.js-debug-nightly" + ] + } + }, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [5000, 5001], + // "portsAttributes": { + // "5001": { + // "protocol": "https" + // } + // } + + // postCreateCommand.sh parameters: $1=SA password, $2=dacpac path, $3=sql script(s) path + "postCreateCommand": "bash .devcontainer/mssql/postCreateCommand.sh 'P@ssw0rd' './bin/Debug/' './.devcontainer/mssql/'", + "features": { + "ghcr.io/itsmechlark/features/1password:1": { + "version": "latest" + } + } + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 00000000..1a8892aa --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,32 @@ +version: '3' + +services: + app: + build: + context: . + dockerfile: Dockerfile + + volumes: + - ../..:/workspaces:cached + + # Overrides default command so things don't shut down after the process ends. + command: sleep infinity + + # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function. + network_mode: service:db + + # Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + # user: root + + # Use "forwardPorts" in **devcontainer.json** to forward an app port locally. + # (Adding the "ports" property to this file will not forward from a Codespace.) + + db: + image: mcr.microsoft.com/mssql/server:2019-latest + restart: unless-stopped + environment: + SA_PASSWORD: P@ssw0rd + ACCEPT_EULA: Y + + # Add "forwardPorts": ["db:1433"] to **devcontainer.json** to forward MSSQL locally. + # (Adding the "ports" property to this file will not forward from a Codespace.) diff --git a/.devcontainer/mssql/installSQLtools.sh b/.devcontainer/mssql/installSQLtools.sh new file mode 100644 index 00000000..0edc46a3 --- /dev/null +++ b/.devcontainer/mssql/installSQLtools.sh @@ -0,0 +1,15 @@ +#!/bin/bash +echo "Installing mssql-tools" +curl -sSL https://packages.microsoft.com/keys/microsoft.asc | (OUT=$(apt-key add - 2>&1) || echo $OUT) +DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]') +CODENAME=$(lsb_release -cs) +echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-${DISTRO}-${CODENAME}-prod ${CODENAME} main" > /etc/apt/sources.list.d/microsoft.list +apt-get update +ACCEPT_EULA=Y apt-get -y install unixodbc-dev msodbcsql17 libunwind8 mssql-tools + +echo "Installing sqlpackage" +curl -sSL -o sqlpackage.zip "https://aka.ms/sqlpackage-linux" +mkdir /opt/sqlpackage +unzip sqlpackage.zip -d /opt/sqlpackage +rm sqlpackage.zip +chmod a+x /opt/sqlpackage/sqlpackage diff --git a/.devcontainer/mssql/postCreateCommand.sh b/.devcontainer/mssql/postCreateCommand.sh new file mode 100644 index 00000000..4b9888ab --- /dev/null +++ b/.devcontainer/mssql/postCreateCommand.sh @@ -0,0 +1,64 @@ +#!/bin/bash +dacpac="false" +sqlfiles="false" +SApassword=$1 +dacpath=$2 +sqlpath=$3 + +echo "SELECT * FROM SYS.DATABASES" | dd of=testsqlconnection.sql +for i in {1..60}; +do + /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SApassword -d master -i testsqlconnection.sql > /dev/null + if [ $? -eq 0 ] + then + echo "SQL server ready" + break + else + echo "Not ready yet..." + sleep 1 + fi +done +rm testsqlconnection.sql + +for f in $dacpath/* +do + if [ $f == $dacpath/*".dacpac" ] + then + dacpac="true" + echo "Found dacpac $f" + fi +done + +for f in $sqlpath/* +do + if [ $f == $sqlpath/*".sql" ] + then + sqlfiles="true" + echo "Found SQL file $f" + fi +done + +if [ $sqlfiles == "true" ] +then + for f in $sqlpath/* + do + if [ $f == $sqlpath/*".sql" ] + then + echo "Executing $f" + /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SApassword -d master -i $f + fi + done +fi + +if [ $dacpac == "true" ] +then + for f in $dacpath/* + do + if [ $f == $dacpath/*".dacpac" ] + then + dbname=$(basename $f ".dacpac") + echo "Deploying dacpac $f" + /opt/sqlpackage/sqlpackage /Action:Publish /SourceFile:$f /TargetServerName:localhost /TargetDatabaseName:$dbname /TargetUser:sa /TargetPassword:$SApassword + fi + done +fi diff --git a/.devcontainer/mssql/setup.sql b/.devcontainer/mssql/setup.sql new file mode 100644 index 00000000..94fcd9ce --- /dev/null +++ b/.devcontainer/mssql/setup.sql @@ -0,0 +1,2 @@ +CREATE DATABASE ApplicationDB; +GO diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..f33a02cd --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for more information: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates +# https://containers.dev/guide/dependabot + +version: 2 +updates: + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: weekly