diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..6e0aec5 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: Apache-2.0 +# Licensed to the Ed-Fi Alliance under one or more agreements. +# The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +# See the LICENSE and NOTICES files in the project root for more information. + +version: 2 +updates: + - package-ecosystem: nuget + directory: kafka/ + target-branch: main + schedule: + interval: weekly diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..87ace23 --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: Apache-2.0 +# Licensed to the Ed-Fi Alliance under one or more agreements. +# The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +# See the LICENSE and NOTICES files in the project root for more information. + +name: Docker build and publish +on: + workflow_dispatch: + +env: + IMAGE_NAME: ${{ vars.IMAGE_NAME }} + DOCKER_USERNAME: ${{ vars.DOCKER_USERNAME }} + DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN }} + REF: ${{ github.ref_name }} + +permissions: read-all + +jobs: + docker-publish: + name: Publish to Docker Hub + runs-on: ubuntu-latest + steps: + - name: Prepare Tags + id: prepare-tags + run: | + IMAGETAG="${{ env.IMAGE_NAME }}:pre" + echo "IMAGETAG=$IMAGETAG" >> $GITHUB_OUTPUT + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + + - name: Log in to Docker Hub + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + username: ${{ env.DOCKER_USERNAME }} + password: ${{ env.DOCKER_HUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Data Management Service image + id: metadatamanagementservice + uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 + with: + images: ${{ env.IMAGE_NAME }} + + - name: Build and push Kafka connect transforms image + uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0 + with: + context: "{{defaultContext}}:kafka" + cache-from: type=registry,ref=${{ env.IMAGE_NAME }}:pre + cache-to: type=inline + file: Dockerfile + tags: ${{ steps.prepare-tags.outputs.IMAGETAG }} + labels: ${{ steps.metadatamanagementservice.outputs.labels }} + push: true diff --git a/.github/workflows/on-pullrequest.yml b/.github/workflows/on-pullrequest.yml new file mode 100644 index 0000000..01f6369 --- /dev/null +++ b/.github/workflows/on-pullrequest.yml @@ -0,0 +1,80 @@ +# SPDX-License-Identifier: Apache-2.0 +# Licensed to the Ed-Fi Alliance under one or more agreements. +# The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +# See the LICENSE and NOTICES files in the project root for more information. + +name: On Pull Request + +on: + push: + branches: + - main + paths: + - "kafka/**" + pull_request: + branches: + - main + paths: + - "kafka/**" + - ".github/**/*.yml" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: read-all + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout the Repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Dependency Review ("Dependabot on PR") + if: ${{ github.event_name == 'pull_request' && !github.event.repository.fork }} + uses: actions/dependency-review-action@9129d7d40b8c12c1ed0f60400d00c92d437adcce # v4.1.3 + + - name: Setup Java + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@dbbdc275be76ac10734476cc723d82dfe7ec6eda # v3.4.2 + + - name: Make gradlew executable + run: chmod +x ./gradlew + working-directory: kafka/ed-fi-kafka-connect-transforms + + - name: Build with Gradle + run: ./gradlew clean build + working-directory: kafka/ed-fi-kafka-connect-transforms + + - name: Run tests with Gradle + run: ./gradlew test + working-directory: kafka/ed-fi-kafka-connect-transforms + + - name: Upload Test Results + if: always() + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 + with: + name: Unit Test Results + overwrite: true + path: | + ./kafka/ed-fi-kafka-connect-transforms/build/reports/tests/test/classes/*.html + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: Package + path: ./kafka/ed-fi-kafka-connect-transforms/build/libs + + - uses: hadolint/hadolint-action@54c9adbab1582c2ef04b2016b760714a4bfde3cf # v3.1.0 + name: Run Linter on Dockerfile + with: + dockerfile: ./kafka/Dockerfile + failure-threshold: error diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000..4af58b9 --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,68 @@ +# Originally sourced from GitHub with implicit lack of license + +name: Scorecard supply-chain security +on: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '15 23 * * 0' + push: + branches: [ "main" ] + workflow_dispatch: + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + # Uncomment the permissions below if installing in a private repository. + # contents: read + # actions: read + + steps: + - name: Checkout code + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + persist-credentials: false + + - name: Run analysis + uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 + with: + results_file: scorecard.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. + #repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: Upload artifact + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 + with: + name: Scorecard SARIF file + path: scorecard.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: Upload to code-scanning + uses: github/codeql-action/upload-sarif@cf7e9f23492505046de9a37830c3711dd0f25bb3 # codeql-bundle-v2.16.2 + with: + sarif_file: scorecard.sarif diff --git a/README.md b/README.md index fc3a048..4c5d57f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # Ed-Fi Transformations for Apache Kafka® Connect +[![OpenSSF +Scorecard](https://api.securityscorecards.dev/projects/github.com/Ed-Fi-Alliance-OSS/Ed-Fi-Kafka-Connect/badge)](https://securityscorecards.dev/viewer/?uri=github.com/Ed-Fi-Alliance-OSS/Ed-Fi-Kafka-Connect) + [Single Message Transformations (SMTs)](https://kafka.apache.org/documentation/#connect_transforms) for Apache Kafka Connect.