From 13fb213725e4e1236d3e4884bb8b1ccd691e4a1b Mon Sep 17 00:00:00 2001 From: Robbie Davis Date: Mon, 4 Sep 2023 21:44:54 -0400 Subject: [PATCH] Workflow management (#2270) --- .github/workflows/build-and-test.yml | 405 +------------------------ .github/workflows/canary-workflow.yml | 191 ++++++++++++ .github/workflows/develop-workflow.yml | 219 +++++++++++++ .github/workflows/release-workflow.yml | 221 ++++++++++++++ 4 files changed, 634 insertions(+), 402 deletions(-) create mode 100644 .github/workflows/canary-workflow.yml create mode 100644 .github/workflows/develop-workflow.yml create mode 100644 .github/workflows/release-workflow.yml diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 7ee6ee2bb..1925b5642 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -1,15 +1,13 @@ -name: .NET Build Test and Sonar Scan +name: Build and Test PR on: - push: - branches: '**' pull_request: - branches: [ main, develop, canary ] + branches: [ '**' ] types: [synchronize] jobs: build: - name: Build .Net + name: Build and Test PR runs-on: windows-latest steps: - name: Checkout Repo @@ -74,400 +72,3 @@ jobs: - name: Test run: dotnet test --no-restore --verbosity normal - version: - name: Bump version on Develop/Canary PR (and not coming from release/) - needs: [ build ] - runs-on: ubuntu-latest - if: github.event_name == 'push' && (github.event.pull_request.base.ref == 'develop' || github.event.pull_request.base.ref == 'refs/heads/canary') && !contains('release/', github.event.pull_request.head.ref) - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Setup .NET Core - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 7.0.x - - - name: Bump versions - uses: SiqiLu/dotnet-bump-version@2.0.0 - with: - version_files: Kavita.Common/Kavita.Common.csproj - github_token: ${{ secrets.REPO_GHA_PAT }} - version_mask: "0.0.0.1" - - branch_name: - runs-on: ubuntu-latest - steps: - - name: Extract branch name - shell: bash - run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT - id: extract_branch - - - develop: - name: Build Nightly Docker if non-release push - needs: [ build, version ] - runs-on: ubuntu-latest - permissions: - packages: write - contents: read - if: ${{ github.event_name == 'push' && !startsWith(github.head_ref, 'releases/') && github.event.pull_request.base.ref == 'develop' }} - steps: - - name: Find Current Pull Request - uses: jwalton/gh-find-current-pr@v1 - id: findPr - with: - state: all - github-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Parse PR body - id: parse-body - run: | - body="${{ steps.findPr.outputs.body }}" - if [[ ${#body} -gt 1870 ]] ; then - body=${body:0:1870} - body="${body}...and much more. - - Read full changelog: https://github.com/Kareadita/Kavita/pull/${{ steps.findPr.outputs.pr }}" - fi - - body=${body//\'/} - body=${body//'%'/'%25'} - body=${body//$'\n'/'%0A'} - body=${body//$'\r'/'%0D'} - body=${body//$'`'/'%60'} - body=${body//$'>'/'%3E'} - echo $body - echo "BODY=$body" >> $GITHUB_OUTPUT - - - name: Check Out Repo - uses: actions/checkout@v3 - with: - ref: develop - - - name: NodeJS to Compile WebUI - uses: actions/setup-node@v3 - with: - node-version: '16' - - run: | - cd UI/Web || exit - echo 'Installing web dependencies' - npm install --legacy-peer-deps - - echo 'Building UI' - npm run prod - - echo 'Copying back to Kavita wwwroot' - rsync -a dist/ ../../API/wwwroot/ - - cd ../ || exit - - - name: Get csproj Version - uses: kzrnm/get-net-sdk-project-versions-action@v1 - id: get-version - with: - proj-path: Kavita.Common/Kavita.Common.csproj - - - name: Parse Version - run: | - version='${{steps.get-version.outputs.assembly-version}}' - echo "VERSION=$version" >> $GITHUB_OUTPUT - id: parse-version - - - name: Echo csproj version - run: echo "${{steps.get-version.outputs.assembly-version}}" - - - name: Compile dotnet app - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 7.0.x - - - name: Install Swashbuckle CLI - run: dotnet tool install -g --version 6.5.0 Swashbuckle.AspNetCore.Cli - - - run: ./monorepo-build.sh - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_HUB_USERNAME }} - password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v2 - - - name: Build and push - id: docker_build - uses: docker/build-push-action@v4 - with: - context: . - platforms: linux/amd64,linux/arm/v7,linux/arm64 - push: true - tags: jvmilazz0/kavita:nightly, jvmilazz0/kavita:nightly-${{ steps.parse-version.outputs.VERSION }}, ghcr.io/kareadita/kavita:nightly, ghcr.io/kareadita/kavita:nightly-${{ steps.parse-version.outputs.VERSION }} - - - name: Image digest - run: echo ${{ steps.docker_build.outputs.digest }} - - - name: Notify Discord - uses: rjstone/discord-webhook-notify@v1 - with: - severity: info - description: v${{steps.get-version.outputs.assembly-version}} - ${{ steps.findPr.outputs.title }} - details: '${{ steps.findPr.outputs.body }}' - text: <@&939225459156217917> <@&939225350775406643> A new nightly build has been released for docker. - webhookUrl: ${{ secrets.DISCORD_DOCKER_UPDATE_URL }} - - stable: - name: Build Stable and Nightly Docker if Release - needs: [ build ] - runs-on: ubuntu-latest - permissions: - packages: write - contents: read - if: github.event_name == 'pull_request' && startsWith(github.head_ref, 'releases/') && github.event.pull_request.base.ref == 'develop' - steps: - - name: Find Current Pull Request - uses: jwalton/gh-find-current-pr@v1 - id: findPr - with: - state: all - github-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Parse PR body - id: parse-body - run: | - body="${{ steps.findPr.outputs.body }}" - if [[ ${#body} -gt 1870 ]] ; then - body=${body:0:1870} - body="${body}...and much more. - - Read full changelog: https://github.com/Kareadita/Kavita/releases/latest" - fi - - body=${body//\'/} - body=${body//'%'/'%25'} - body=${body//$'\n'/'%0A'} - body=${body//$'\r'/'%0D'} - body=${body//$'`'/'%60'} - body=${body//$'>'/'%3E'} - echo $body - echo "BODY=$body" >> $GITHUB_OUTPUT - - - - name: Check Out Repo - uses: actions/checkout@v3 - with: - ref: main - - - name: NodeJS to Compile WebUI - uses: actions/setup-node@v3 - with: - node-version: '16' - - run: | - - cd UI/Web || exit - echo 'Installing web dependencies' - npm install --legacy-peer-deps - - echo 'Building UI' - npm run prod - - echo 'Copying back to Kavita wwwroot' - rsync -a dist/ ../../API/wwwroot/ - - cd ../ || exit - - - name: Get csproj Version - uses: kzrnm/get-net-sdk-project-versions-action@v1 - id: get-version - with: - proj-path: Kavita.Common/Kavita.Common.csproj - - - name: Echo csproj version - run: echo "${{steps.get-version.outputs.assembly-version}}" - - - name: Parse Version - run: | - version='${{steps.get-version.outputs.assembly-version}}' - newVersion=${version%.*} - echo $newVersion - echo "VERSION=$newVersion" >> $GITHUB_OUTPUT - id: parse-version - - - name: Compile dotnet app - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 7.0.x - - name: Install Swashbuckle CLI - run: dotnet tool install -g --version 6.5.0 Swashbuckle.AspNetCore.Cli - - - run: ./monorepo-build.sh - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_HUB_USERNAME }} - password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v2 - - - name: Build and push stable - id: docker_build_stable - uses: docker/build-push-action@v4 - with: - context: . - platforms: linux/amd64,linux/arm/v7,linux/arm64 - push: true - tags: jvmilazz0/kavita:latest, jvmilazz0/kavita:${{ steps.parse-version.outputs.VERSION }}, ghcr.io/kareadita/kavita:latest, ghcr.io/kareadita/kavita:${{ steps.parse-version.outputs.VERSION }} - - - name: Build and push nightly - id: docker_build_nightly - uses: docker/build-push-action@v4 - with: - context: . - platforms: linux/amd64,linux/arm/v7,linux/arm64 - push: true - tags: jvmilazz0/kavita:nightly, jvmilazz0/kavita:nightly-${{ steps.parse-version.outputs.VERSION }}, ghcr.io/kareadita/kavita:nightly, ghcr.io/kareadita/kavita:nightly-${{ steps.parse-version.outputs.VERSION }} - - - name: Image digest - run: echo ${{ steps.docker_build_stable.outputs.digest }} - - - name: Image digest - run: echo ${{ steps.docker_build_nightly.outputs.digest }} - - - name: Notify Discord - uses: rjstone/discord-webhook-notify@v1 - with: - severity: info - description: v${{steps.get-version.outputs.assembly-version}} - ${{ steps.findPr.outputs.title }} - details: '${{ steps.findPr.outputs.body }}' - text: <@&939225192553644133> A new stable build has been released. - webhookUrl: ${{ secrets.DISCORD_DOCKER_UPDATE_URL }} - - - name: Notify Discord - uses: rjstone/discord-webhook-notify@v1 - with: - severity: info - description: v${{steps.get-version.outputs.assembly-version}} - ${{ steps.findPr.outputs.title }} - details: '${{ steps.findPr.outputs.body }}' - text: <@&939225459156217917> <@&939225350775406643> A new nightly build has been released for docker. - webhookUrl: ${{ secrets.DISCORD_DOCKER_UPDATE_URL }} - - canary: - name: Build Canary Docker if Canary push - needs: [ build, version ] - runs-on: ubuntu-latest - permissions: - packages: write - contents: read - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/canary' }} - steps: - - name: Find Current Pull Request - uses: jwalton/gh-find-current-pr@v1 - id: findPr - with: - state: all - github-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Check Out Repo - uses: actions/checkout@v3 - with: - ref: canary - - - name: NodeJS to Compile WebUI - uses: actions/setup-node@v3 - with: - node-version: '16' - - run: | - cd UI/Web || exit - echo 'Installing web dependencies' - npm install --legacy-peer-deps - - echo 'Building UI' - npm run prod - - echo 'Copying back to Kavita wwwroot' - rsync -a dist/ ../../API/wwwroot/ - - cd ../ || exit - - - name: Get csproj Version - uses: kzrnm/get-net-sdk-project-versions-action@v1 - id: get-version - with: - proj-path: Kavita.Common/Kavita.Common.csproj - - - name: Parse Version - run: | - version='${{steps.get-version.outputs.assembly-version}}' - echo "VERSION=$version" >> $GITHUB_OUTPUT - id: parse-version - - - name: Echo csproj version - run: echo "${{steps.get-version.outputs.assembly-version}}" - - - name: Compile dotnet app - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 7.0.x - - - name: Install Swashbuckle CLI - run: dotnet tool install -g --version 6.5.0 Swashbuckle.AspNetCore.Cli - - - run: ./monorepo-build.sh - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_HUB_USERNAME }} - password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v2 - - - name: Build and push - id: docker_build - uses: docker/build-push-action@v4 - with: - context: . - platforms: linux/amd64,linux/arm/v7,linux/arm64 - push: true - tags: jvmilazz0/kavita:canary, jvmilazz0/kavita:canary-${{ steps.parse-version.outputs.VERSION }}, ghcr.io/kareadita/kavita:canary, ghcr.io/kareadita/kavita:canary-${{ steps.parse-version.outputs.VERSION }} - - - name: Image digest - run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.github/workflows/canary-workflow.yml b/.github/workflows/canary-workflow.yml new file mode 100644 index 000000000..a69cf2aa8 --- /dev/null +++ b/.github/workflows/canary-workflow.yml @@ -0,0 +1,191 @@ +name: Canary Workflow + +on: + push: + branches: + - canary + - '!release/**' + +jobs: + build: + name: Build and Test + runs-on: windows-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup .NET Core + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + + - name: Install Swashbuckle CLI + shell: powershell + run: dotnet tool install -g --version 6.5.0 Swashbuckle.AspNetCore.Cli + + - name: Install dependencies + run: dotnet restore + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '17' + + - uses: actions/upload-artifact@v3 + with: + name: csproj + path: Kavita.Common/Kavita.Common.csproj + + - name: Cache SonarCloud packages + uses: actions/cache@v3 + with: + path: ~\sonar\cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + + - name: Cache SonarCloud scanner + id: cache-sonar-scanner + uses: actions/cache@v3 + with: + path: .\.sonar\scanner + key: ${{ runner.os }}-sonar-scanner + restore-keys: ${{ runner.os }}-sonar-scanner + + - name: Install SonarCloud scanner + if: steps.cache-sonar-scanner.outputs.cache-hit != 'true' + shell: powershell + run: | + New-Item -Path .\.sonar\scanner -ItemType Directory + dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner + + - name: Sonar Scan + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + shell: powershell + run: | + .\.sonar\scanner\dotnet-sonarscanner begin /k:"Kareadita_Kavita" /o:"kareadita" /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" + dotnet build --configuration Release + .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}" + + - name: Test + run: dotnet test --no-restore --verbosity normal + + version: + name: Bump version + needs: [ build ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup .NET Core + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + + - name: Bump versions + uses: SiqiLu/dotnet-bump-version@2.0.0 + with: + version_files: Kavita.Common/Kavita.Common.csproj + github_token: ${{ secrets.REPO_GHA_PAT }} + version_mask: "0.0.0.1" + + canary: + name: Build Canary Docker + needs: [ build, version ] + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/canary' }} + steps: + - name: Find Current Pull Request + uses: jwalton/gh-find-current-pr@v1 + id: findPr + with: + state: all + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Check Out Repo + uses: actions/checkout@v3 + with: + ref: canary + + - name: NodeJS to Compile WebUI + uses: actions/setup-node@v3 + with: + node-version: '16' + - run: | + cd UI/Web || exit + echo 'Installing web dependencies' + npm install --legacy-peer-deps + + echo 'Building UI' + npm run prod + + echo 'Copying back to Kavita wwwroot' + rsync -a dist/ ../../API/wwwroot/ + + cd ../ || exit + + - name: Get csproj Version + uses: kzrnm/get-net-sdk-project-versions-action@v1 + id: get-version + with: + proj-path: Kavita.Common/Kavita.Common.csproj + + - name: Parse Version + run: | + version='${{steps.get-version.outputs.assembly-version}}' + echo "VERSION=$version" >> $GITHUB_OUTPUT + id: parse-version + + - name: Echo csproj version + run: echo "${{steps.get-version.outputs.assembly-version}}" + + - name: Compile dotnet app + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + + - name: Install Swashbuckle CLI + run: dotnet tool install -g --version 6.5.0 Swashbuckle.AspNetCore.Cli + + - run: ./monorepo-build.sh + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and push + id: docker_build + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64,linux/arm/v7,linux/arm64 + push: true + tags: jvmilazz0/kavita:canary, jvmilazz0/kavita:canary-${{ steps.parse-version.outputs.VERSION }}, ghcr.io/kareadita/kavita:canary, ghcr.io/kareadita/kavita:canary-${{ steps.parse-version.outputs.VERSION }} + + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} \ No newline at end of file diff --git a/.github/workflows/develop-workflow.yml b/.github/workflows/develop-workflow.yml new file mode 100644 index 000000000..b4edab114 --- /dev/null +++ b/.github/workflows/develop-workflow.yml @@ -0,0 +1,219 @@ +name: Nightly Workflow + +on: + push: + branches: + - develop + - '!release/**' + +jobs: + build: + name: Build and Test + runs-on: windows-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup .NET Core + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + + - name: Install Swashbuckle CLI + shell: powershell + run: dotnet tool install -g --version 6.5.0 Swashbuckle.AspNetCore.Cli + + - name: Install dependencies + run: dotnet restore + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '17' + + - uses: actions/upload-artifact@v3 + with: + name: csproj + path: Kavita.Common/Kavita.Common.csproj + + - name: Cache SonarCloud packages + uses: actions/cache@v3 + with: + path: ~\sonar\cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + + - name: Cache SonarCloud scanner + id: cache-sonar-scanner + uses: actions/cache@v3 + with: + path: .\.sonar\scanner + key: ${{ runner.os }}-sonar-scanner + restore-keys: ${{ runner.os }}-sonar-scanner + + - name: Install SonarCloud scanner + if: steps.cache-sonar-scanner.outputs.cache-hit != 'true' + shell: powershell + run: | + New-Item -Path .\.sonar\scanner -ItemType Directory + dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner + + - name: Sonar Scan + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + shell: powershell + run: | + .\.sonar\scanner\dotnet-sonarscanner begin /k:"Kareadita_Kavita" /o:"kareadita" /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" + dotnet build --configuration Release + .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}" + + - name: Test + run: dotnet test --no-restore --verbosity normal + + version: + name: Bump version + needs: [ build ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup .NET Core + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + + - name: Bump versions + uses: SiqiLu/dotnet-bump-version@2.0.0 + with: + version_files: Kavita.Common/Kavita.Common.csproj + github_token: ${{ secrets.REPO_GHA_PAT }} + version_mask: "0.0.0.1" + + develop: + name: Build Nightly Docker + needs: [ build, version ] + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Find Current Pull Request + uses: jwalton/gh-find-current-pr@v1 + id: findPr + with: + state: all + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Parse PR body + id: parse-body + run: | + body="${{ steps.findPr.outputs.body }}" + if [[ ${#body} -gt 1870 ]] ; then + body=${body:0:1870} + body="${body}...and much more. + + Read full changelog: https://github.com/Kareadita/Kavita/pull/${{ steps.findPr.outputs.pr }}" + fi + + body=${body//\'/} + body=${body//'%'/'%25'} + body=${body//$'\n'/'%0A'} + body=${body//$'\r'/'%0D'} + body=${body//$'`'/'%60'} + body=${body//$'>'/'%3E'} + echo $body + echo "BODY=$body" >> $GITHUB_OUTPUT + + - name: Check Out Repo + uses: actions/checkout@v3 + with: + ref: develop + + - name: NodeJS to Compile WebUI + uses: actions/setup-node@v3 + with: + node-version: '16' + - run: | + cd UI/Web || exit + echo 'Installing web dependencies' + npm install --legacy-peer-deps + + echo 'Building UI' + npm run prod + + echo 'Copying back to Kavita wwwroot' + rsync -a dist/ ../../API/wwwroot/ + + cd ../ || exit + + - name: Get csproj Version + uses: kzrnm/get-net-sdk-project-versions-action@v1 + id: get-version + with: + proj-path: Kavita.Common/Kavita.Common.csproj + + - name: Parse Version + run: | + version='${{steps.get-version.outputs.assembly-version}}' + echo "VERSION=$version" >> $GITHUB_OUTPUT + id: parse-version + + - name: Echo csproj version + run: echo "${{steps.get-version.outputs.assembly-version}}" + + - name: Compile dotnet app + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + + - name: Install Swashbuckle CLI + run: dotnet tool install -g --version 6.5.0 Swashbuckle.AspNetCore.Cli + + - run: ./monorepo-build.sh + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and push + id: docker_build + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64,linux/arm/v7,linux/arm64 + push: true + tags: jvmilazz0/kavita:nightly, jvmilazz0/kavita:nightly-${{ steps.parse-version.outputs.VERSION }}, ghcr.io/kareadita/kavita:nightly, ghcr.io/kareadita/kavita:nightly-${{ steps.parse-version.outputs.VERSION }} + + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} + + - name: Notify Discord + uses: rjstone/discord-webhook-notify@v1 + with: + severity: info + description: v${{steps.get-version.outputs.assembly-version}} - ${{ steps.findPr.outputs.title }} + details: '${{ steps.findPr.outputs.body }}' + text: <@&939225459156217917> <@&939225350775406643> A new nightly build has been released for docker. + webhookUrl: ${{ secrets.DISCORD_DOCKER_UPDATE_URL }} \ No newline at end of file diff --git a/.github/workflows/release-workflow.yml b/.github/workflows/release-workflow.yml new file mode 100644 index 000000000..270d0310c --- /dev/null +++ b/.github/workflows/release-workflow.yml @@ -0,0 +1,221 @@ +name: Release Workflow + +on: + push: + branches: 'release/**' + +jobs: + build: + name: Build .Net + runs-on: windows-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup .NET Core + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + + - name: Install Swashbuckle CLI + shell: powershell + run: dotnet tool install -g --version 6.5.0 Swashbuckle.AspNetCore.Cli + + - name: Install dependencies + run: dotnet restore + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '17' + + - uses: actions/upload-artifact@v3 + with: + name: csproj + path: Kavita.Common/Kavita.Common.csproj + + - name: Cache SonarCloud packages + uses: actions/cache@v3 + with: + path: ~\sonar\cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + + - name: Cache SonarCloud scanner + id: cache-sonar-scanner + uses: actions/cache@v3 + with: + path: .\.sonar\scanner + key: ${{ runner.os }}-sonar-scanner + restore-keys: ${{ runner.os }}-sonar-scanner + + - name: Install SonarCloud scanner + if: steps.cache-sonar-scanner.outputs.cache-hit != 'true' + shell: powershell + run: | + New-Item -Path .\.sonar\scanner -ItemType Directory + dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner + + - name: Sonar Scan + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + shell: powershell + run: | + .\.sonar\scanner\dotnet-sonarscanner begin /k:"Kareadita_Kavita" /o:"kareadita" /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" + dotnet build --configuration Release + .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}" + + - name: Test + run: dotnet test --no-restore --verbosity normal + + stable: + name: Build Stable and Nightly Docker if Release + needs: [ build ] + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + if: github.event_name == 'pull_request' && startsWith(github.head_ref, 'releases/') && github.event.pull_request.base.ref == 'develop' + steps: + - name: Find Current Pull Request + uses: jwalton/gh-find-current-pr@v1 + id: findPr + with: + state: all + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Parse PR body + id: parse-body + run: | + body="${{ steps.findPr.outputs.body }}" + if [[ ${#body} -gt 1870 ]] ; then + body=${body:0:1870} + body="${body}...and much more. + + Read full changelog: https://github.com/Kareadita/Kavita/releases/latest" + fi + + body=${body//\'/} + body=${body//'%'/'%25'} + body=${body//$'\n'/'%0A'} + body=${body//$'\r'/'%0D'} + body=${body//$'`'/'%60'} + body=${body//$'>'/'%3E'} + echo $body + echo "BODY=$body" >> $GITHUB_OUTPUT + + + - name: Check Out Repo + uses: actions/checkout@v3 + with: + ref: main + + - name: NodeJS to Compile WebUI + uses: actions/setup-node@v3 + with: + node-version: '16' + - run: | + + cd UI/Web || exit + echo 'Installing web dependencies' + npm install --legacy-peer-deps + + echo 'Building UI' + npm run prod + + echo 'Copying back to Kavita wwwroot' + rsync -a dist/ ../../API/wwwroot/ + + cd ../ || exit + + - name: Get csproj Version + uses: kzrnm/get-net-sdk-project-versions-action@v1 + id: get-version + with: + proj-path: Kavita.Common/Kavita.Common.csproj + + - name: Echo csproj version + run: echo "${{steps.get-version.outputs.assembly-version}}" + + - name: Parse Version + run: | + version='${{steps.get-version.outputs.assembly-version}}' + newVersion=${version%.*} + echo $newVersion + echo "VERSION=$newVersion" >> $GITHUB_OUTPUT + id: parse-version + + - name: Compile dotnet app + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Install Swashbuckle CLI + run: dotnet tool install -g --version 6.5.0 Swashbuckle.AspNetCore.Cli + + - run: ./monorepo-build.sh + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and push stable + id: docker_build_stable + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64,linux/arm/v7,linux/arm64 + push: true + tags: jvmilazz0/kavita:latest, jvmilazz0/kavita:${{ steps.parse-version.outputs.VERSION }}, ghcr.io/kareadita/kavita:latest, ghcr.io/kareadita/kavita:${{ steps.parse-version.outputs.VERSION }} + + - name: Build and push nightly + id: docker_build_nightly + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64,linux/arm/v7,linux/arm64 + push: true + tags: jvmilazz0/kavita:nightly, jvmilazz0/kavita:nightly-${{ steps.parse-version.outputs.VERSION }}, ghcr.io/kareadita/kavita:nightly, ghcr.io/kareadita/kavita:nightly-${{ steps.parse-version.outputs.VERSION }} + + - name: Image digest + run: echo ${{ steps.docker_build_stable.outputs.digest }} + + - name: Image digest + run: echo ${{ steps.docker_build_nightly.outputs.digest }} + + - name: Notify Discord + uses: rjstone/discord-webhook-notify@v1 + with: + severity: info + description: v${{steps.get-version.outputs.assembly-version}} - ${{ steps.findPr.outputs.title }} + details: '${{ steps.findPr.outputs.body }}' + text: <@&939225192553644133> A new stable build has been released. + webhookUrl: ${{ secrets.DISCORD_DOCKER_UPDATE_URL }} + + - name: Notify Discord + uses: rjstone/discord-webhook-notify@v1 + with: + severity: info + description: v${{steps.get-version.outputs.assembly-version}} - ${{ steps.findPr.outputs.title }} + details: '${{ steps.findPr.outputs.body }}' + text: <@&939225459156217917> <@&939225350775406643> A new nightly build has been released for docker. + webhookUrl: ${{ secrets.DISCORD_DOCKER_UPDATE_URL }} \ No newline at end of file