diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e4ca311d..bdf3ed3c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,15 @@ version: 2 updates: - - package-ecosystem: "nuget" # See documentation for possible values - directory: "/" # Location of package manifests + + # Check for Github Actions version updates (for CI/CD) + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + + # Check for Nuget package updates + - package-ecosystem: "nuget" + directory: "/" schedule: interval: "daily" diff --git a/.github/workflows/ci-develop.yml b/.github/workflows/ci-develop.yml new file mode 100644 index 00000000..5e28abd6 --- /dev/null +++ b/.github/workflows/ci-develop.yml @@ -0,0 +1,119 @@ +on: + push: + branches: + - develop + pull_request: + branches: + - develop + types: [opened, reopened, synchronize] + +name: ci-develop + +env: + BRANCH: develop + DOTNET_VERSION: 7.0.x + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository_owner }}/shocklink-api + +jobs: + + build-api: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup .NET SDK ${{ env.DOTNET_VERSION }} + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} + + - name: Install dependencies + run: dotnet restore + + - name: Build + run: dotnet build --configuration Release --no-restore + + - name: Test + run: dotnet test --no-restore --verbosity normal + + - name: Dotnet Publish + run: dotnet publish API/API.csproj -c Release -o ./publish + + - name: Upload full artifacts + uses: actions/upload-artifact@v3 + with: + name: full-dotnet-app + path: publish/* + retention-days: 1 + if-no-files-found: error + + - name: Upload internal artifacts + uses: actions/upload-artifact@v3 + with: + name: only-shocklink-dlls + path: publish/ShockLink.*.dll + retention-days: 1 + if-no-files-found: error + + build-container: + runs-on: ubuntu-latest + needs: build-api + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + sparse-checkout: | + Dockerfile + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: full-dotnet-app + path: publish/ + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value={{branch}},enable=${{ github.ref_name == env.BRANCH }} + type=ref,event=branch + type=ref,event=pr + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + # publish: + # runs-on: ubuntu-latest + # needs: build + + # steps: + # - name: Download release notes + # uses: actions/checkout@v4 + # with: + # sparse-checkout: | + # RELEASE.md + + # - name: Download artifacts + # uses: actions/download-artifact@v3 + # with: + # name: artifacts \ No newline at end of file diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml new file mode 100644 index 00000000..8d9ebbe7 --- /dev/null +++ b/.github/workflows/ci-master.yml @@ -0,0 +1,119 @@ +on: + push: + branches: + - master + pull_request: + branches: + - master + types: [opened, reopened, synchronize] + +name: ci-master + +env: + BRANCH: master + DOTNET_VERSION: 7.0.x + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository_owner }}/shocklink-api + +jobs: + + build-api: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup .NET SDK ${{ env.DOTNET_VERSION }} + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} + + - name: Install dependencies + run: dotnet restore + + - name: Build + run: dotnet build --configuration Release --no-restore + + - name: Test + run: dotnet test --no-restore --verbosity normal + + - name: Dotnet Publish + run: dotnet publish API/API.csproj -c Release -o ./publish + + - name: Upload full artifacts + uses: actions/upload-artifact@v3 + with: + name: full-dotnet-app + path: publish/* + retention-days: 1 + if-no-files-found: error + + - name: Upload internal artifacts + uses: actions/upload-artifact@v3 + with: + name: only-shocklink-dlls + path: publish/ShockLink.*.dll + retention-days: 1 + if-no-files-found: error + + build-container: + runs-on: ubuntu-latest + needs: build-api + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + sparse-checkout: | + Dockerfile + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: full-dotnet-app + path: publish/ + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value={{branch}},enable=${{ github.ref_name == env.BRANCH }} + type=ref,event=branch + type=ref,event=pr + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + # publish: + # runs-on: ubuntu-latest + # needs: build + + # steps: + # - name: Download release notes + # uses: actions/checkout@v4 + # with: + # sparse-checkout: | + # RELEASE.md + + # - name: Download artifacts + # uses: actions/download-artifact@v3 + # with: + # name: artifacts \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..6ce9ea7d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM mcr.microsoft.com/dotnet/aspnet:7.0-alpine +WORKDIR /app +COPY publish . +ENTRYPOINT ["dotnet", "ShockLink.API.dll"] diff --git a/README.md b/README.md new file mode 100644 index 00000000..b37938ef --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# ShockLink API + + +# Deployment + +The ShockLink stack consists of the following components: +- Postgres as database +- Redis +- The API (this repository) +- [The WebUI](https://github.com/Shock-Link/WebUI) + +## Using Docker + +Assuming you have all other required containers running (if not, see above), you can run the following command to start the API: + +```bash +docker run \ + ghcr.io/shock-link/shocklink-api:latest \ + --name shocklink-api \ + -e FRONTEND_BASE_URL=localhost \ + -e DB=localhost \ + -e REDIS_HOST=localhost \ + -p 80:80/tcp +``` + +## Using `docker-compose` + +See [docker-compose.yml](docker-compose.yml). diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..16e8c9b2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,33 @@ +# This file is a minimal example of a runnable ShockLink stack. + +version: '3.9' + +services: + + db: + image: postgres:16 + container_name: shocklink-pg + environment: + - POSTGRES_PASSWORD=postgres + + redis: + image: redislabs/redisearch:latest + + api: + image: ghcr.io/shock-link/shocklink-api:latest + depends_on: + - db + - redis + ports: + - "5001:80/tcp" + environment: + - FRONTEND_BASE_URL=localhost + - REDIS_HOST=redis + - DB=db + + webui: + image: ghcr.io/shock-link/shocklink-webui:latest + depends_on: + - api + ports: + - "5002:80/tcp"