diff --git a/.github/workflows/build-image.yaml b/.github/workflows/build-image.yaml new file mode 100644 index 00000000..c3a9bc6a --- /dev/null +++ b/.github/workflows/build-image.yaml @@ -0,0 +1,81 @@ +name: build + +on: + workflow_call: + inputs: + client: + description: 'client name' + required: true + type: string + image_tag: + description: 'image tag' + required: true + type: string + image_name: + description: 'image registry and name' + required: true + type: string + cosign: + required: false + default: false + type: boolean + description: 'run cosign on released image' + support_platforms: + required: false + default: true + type: boolean + description: 'support amd64/arm64' + + secrets: + QUAYIO_REGISTRY_USERNAME: + required: true + QUAYIO_REGISTRY_PASSWORD: + required: true + +jobs: + build-image: + name: Build image and upload to registry + runs-on: ubuntu-latest + if: ${{ github.repository == 'kubescape/kubescape' }} # TODO + permissions: + id-token: write + packages: write + contents: read + + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Quay.io + env: + QUAY_PASSWORD: ${{ secrets.QUAYIO_REGISTRY_PASSWORD }} + QUAY_USERNAME: ${{ secrets.QUAYIO_REGISTRY_USERNAME }} + run: docker login -u="${QUAY_USERNAME}" -p="${QUAY_PASSWORD}" quay.io + + - name: Build and push image + if: ${{ inputs.support_platforms }} + run: docker buildx build . --file build/Dockerfile --tag ${{ inputs.image_name }}:${{ inputs.image_tag }} --tag ${{ inputs.image_name }}:latest --build-arg image_version=${{ inputs.image_tag }} --build-arg client=${{ inputs.client }} --push --platform linux/amd64,linux/arm64 + + - name: Build and push image without amd64/arm64 support + if: ${{ !inputs.support_platforms }} + run: docker buildx build . --file build/Dockerfile --tag ${{ inputs.image_name }}:${{ inputs.image_tag }} --tag ${{ inputs.image_name }}:latest --build-arg image_version=${{ inputs.image_tag }} --build-arg client=${{ inputs.client }} --push + + - name: Install cosign + uses: sigstore/cosign-installer@main + with: + cosign-release: 'v1.12.0' + - name: sign kubescape container image + if: ${{ inputs.cosign }} + env: + COSIGN_EXPERIMENTAL: "true" + run: | + cosign sign --force ${{ inputs.image_name }}:latest + cosign sign --force ${{ inputs.image_name }}:${{ inputs.image_tag }} + diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 58588bcb..6c5a4bcb 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -7,25 +7,23 @@ on: # Do not run the pipeline if only Markdown files changed - '**.md' jobs: - once: - name: Create release - runs-on: ubuntu-latest - outputs: - upload_url: ${{ steps.create_release.outputs.upload_url }} - steps: - - name: Create a release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: v2.0.${{ github.run_number }} - release_name: Release v2.0.${{ github.run_number }} - draft: false - prerelease: false - build: - name: Create cross-platform release build, tag and upload binaries - needs: once + test: + uses: ./.github/workflows/test.yaml + with: + release: "v2.0.${{ github.run_number }}" + client: test + + create-release: + uses: ./.github/workflows/release.yaml + needs: test + with: + release_name: "Release v2.0.${{ github.run_number }}" + tag_name: "v2.0.${{ github.run_number }}" + secrets: inherit + + publish-artifacts: + name: Build and publish artifacts + needs: create-release runs-on: ${{ matrix.os }} strategy: matrix: @@ -34,40 +32,7 @@ jobs: - uses: actions/checkout@v3 with: submodules: recursive - - - name: Cache Go modules (Linux) - if: matrix.os == 'ubuntu-latest' - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Cache Go modules (macOS) - if: matrix.os == 'macos-latest' - uses: actions/cache@v3 - with: - path: | - ~/Library/Caches/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Cache Go modules (Windows) - if: matrix.os == 'windows-latest' - uses: actions/cache@v3 - with: - path: | - ~\AppData\Local\go-build - ~\go\pkg\mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - + - name: Set up Go uses: actions/setup-go@v3 with: @@ -82,34 +47,20 @@ jobs: run: make libgit2 if: matrix.os != 'windows-latest' - - name: Test core pkg - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: go test -tags=static -v ./... - - - name: Test httphandler pkg - run: cd httphandler && go test -tags=static -v ./... - - name: Build env: RELEASE: v2.0.${{ github.run_number }} CLIENT: release CGO_ENABLED: 1 run: python3 --version && python3 build.py - - - name: Smoke Testing - env: - RELEASE: v2.0.${{ github.run_number }} - KUBESCAPE_SKIP_UPDATE_CHECK: "true" - run: python3 smoke_testing/init.py ${PWD}/build/${{ matrix.os }}/kubescape - + - name: Upload release binaries id: upload-release-asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: ${{ needs.once.outputs.upload_url }} + upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: build/${{ matrix.os }}/kubescape asset_name: kubescape-${{ matrix.os }} asset_content_type: application/octet-stream @@ -120,56 +71,19 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: ${{ needs.once.outputs.upload_url }} + upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: build/${{ matrix.os }}/kubescape.sha256 asset_name: kubescape-${{ matrix.os }}-sha256 asset_content_type: application/octet-stream - build-docker: - name: Build docker container, tag and upload to registry - needs: build - runs-on: ubuntu-latest - if: ${{ github.repository == 'kubescape/kubescape' }} # TODO - permissions: - id-token: write - packages: write - contents: read - - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Set image version - id: image-version - run: echo '::set-output name=IMAGE_VERSION::v2.0.${{ github.run_number }}' - - - name: Set image name - id: image-name - run: echo '::set-output name=IMAGE_NAME::quay.io/${{ github.repository_owner }}/kubescape' - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to Quay.io - env: - QUAY_PASSWORD: ${{ secrets.QUAYIO_REGISTRY_PASSWORD }} - QUAY_USERNAME: ${{ secrets.QUAYIO_REGISTRY_USERNAME }} - run: docker login -u="${QUAY_USERNAME}" -p="${QUAY_PASSWORD}" quay.io - - - name: Build the Docker image - run: docker buildx build . --file build/Dockerfile --tag ${{ steps.image-name.outputs.IMAGE_NAME }}:${{ steps.image-version.outputs.IMAGE_VERSION }} --tag ${{ steps.image-name.outputs.IMAGE_NAME }}:latest --build-arg image_version=${{ steps.image-version.outputs.IMAGE_VERSION }} --build-arg client=image-release --push --platform linux/amd64,linux/arm64 - - - name: Install cosign - uses: sigstore/cosign-installer@main - with: - cosign-release: 'v1.12.0' - - name: sign kubescape container image - env: - COSIGN_EXPERIMENTAL: "true" - run: | - cosign sign --force ${{ steps.image-name.outputs.IMAGE_NAME }}:latest - cosign sign --force ${{ steps.image-name.outputs.IMAGE_NAME }}:${{ steps.image-version.outputs.IMAGE_VERSION }} - + + publish-image: + # if: ${{ github.repository == 'kubescape/kubescape' }} # TODO + uses: ./.github/workflows/build-image.yaml + needs: create-release + with: + client: "image-release" + image_name: "quay.io/${{ github.repository_owner }}/kubescape" + image_tag: "v2.0.${{ github.run_number }}" + support_platforms: true + cosign: true + secrets: inherit diff --git a/.github/workflows/build_dev.yaml b/.github/workflows/build_dev.yaml index ad03b6d8..4da6346b 100644 --- a/.github/workflows/build_dev.yaml +++ b/.github/workflows/build_dev.yaml @@ -7,136 +7,20 @@ on: # Do not run the pipeline if only Markdown files changed - '**.md' jobs: - build: - name: Create cross-platform dev build - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Cache Go modules (Linux) - if: matrix.os == 'ubuntu-latest' - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Cache Go modules (macOS) - if: matrix.os == 'macos-latest' - uses: actions/cache@v3 - with: - path: | - ~/Library/Caches/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Cache Go modules (Windows) - if: matrix.os == 'windows-latest' - uses: actions/cache@v3 - with: - path: | - ~\AppData\Local\go-build - ~\go\pkg\mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Set up Go - uses: actions/setup-go@v3 - with: - go-version: 1.18 - - # - name: Test cmd pkg - # run: cd cmd && go test -v ./... - - # - name: Test core pkg - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # run: cd core && go test -v ./... - - # - name: Test cmd pkg - # run: cd cmd && go test -v ./... - - - name: Install MSYS2 & libgit2 (Windows) - shell: cmd - run: .\build.bat all - if: matrix.os == 'windows-latest' - - - name: Install libgit2 (Linux/macOS) - run: make libgit2 - if: matrix.os != 'windows-latest' - - - name: Test core pkg - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: go test -tags=static -v ./... - - - name: Test httphandler pkg - run: cd httphandler && go test -tags=static -v ./... - - - name: Build - env: - RELEASE: v2.0.${{ github.run_number }} - CLIENT: release-dev - CGO_ENABLED: 1 - run: python3 --version && python3 build.py - - - name: Smoke Testing - env: - RELEASE: v2.0.${{ github.run_number }} - KUBESCAPE_SKIP_UPDATE_CHECK: "true" - run: python3 smoke_testing/init.py ${PWD}/build/${{ matrix.os }}/kubescape - - - name: Upload build artifacts - uses: actions/upload-artifact@v2 - with: - name: kubescape-${{ matrix.os }} - path: build/${{ matrix.os }}/kubescape - - build-docker: - name: Build docker container, tag and upload to registry - needs: build - if: ${{ github.repository == 'kubescape/kubescape' }} # TODO - runs-on: ubuntu-latest - permissions: - id-token: write - packages: write - contents: read - - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - - - name: Set image version - id: image-version - run: echo '::set-output name=IMAGE_VERSION::dev-v2.0.${{ github.run_number }}' - - - name: Set image name - id: image-name - run: echo '::set-output name=IMAGE_NAME::quay.io/${{ github.repository_owner }}/kubescape' - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to Quay.io - env: - QUAY_PASSWORD: ${{ secrets.QUAYIO_REGISTRY_PASSWORD }} - QUAY_USERNAME: ${{ secrets.QUAYIO_REGISTRY_USERNAME }} - run: docker login -u="${QUAY_USERNAME}" -p="${QUAY_PASSWORD}" quay.io - - - name: Build the Docker image - run: docker buildx build . --file build/Dockerfile --tag ${{ steps.image-name.outputs.IMAGE_NAME }}:${{ steps.image-version.outputs.IMAGE_VERSION }} --build-arg image_version=${{ steps.image-version.outputs.IMAGE_VERSION }} --build-arg client=image-dev --push --platform linux/amd64,linux/arm64 + test: + uses: ./.github/workflows/test.yaml + with: + release: "v2.0.${{ github.run_number }}" + client: test + + publish-dev-image: + # if: ${{ github.repository == 'kubescape/kubescape' }} # TODO + uses: ./.github/workflows/build-image.yaml + needs: test + with: + client: "image-dev" + image_name: "quay.io/${{ github.repository_owner }}/kubescape" + image_tag: "dev-v2.0.${{ github.run_number }}" + support_platforms: false + cosign: true + secrets: inherit diff --git a/.github/workflows/pr_checks.yaml b/.github/workflows/pr_checks.yaml index ca3c7b9d..e498c700 100644 --- a/.github/workflows/pr_checks.yaml +++ b/.github/workflows/pr_checks.yaml @@ -6,87 +6,13 @@ on: types: [ edited, opened, synchronize, reopened ] paths-ignore: # Do not run the pipeline if only Markdown files changed + - '**.yaml' - '**.md' + push: + branches: [ workflow-call-testing ] jobs: - build: - name: Create cross-platform build - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Cache Go modules (Linux) - if: matrix.os == 'ubuntu-latest' - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Cache Go modules (macOS) - if: matrix.os == 'macos-latest' - uses: actions/cache@v3 - with: - path: | - ~/Library/Caches/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Cache Go modules (Windows) - if: matrix.os == 'windows-latest' - uses: actions/cache@v3 - with: - path: | - ~\AppData\Local\go-build - ~\go\pkg\mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Set up Go - uses: actions/setup-go@v3 - with: - go-version: 1.18 - - - name: Install MSYS2 & libgit2 (Windows) - shell: cmd - run: .\build.bat all - if: matrix.os == 'windows-latest' - - - name: Install libgit2 (Linux/macOS) - run: make libgit2 - if: matrix.os != 'windows-latest' - - # - name: Test cmd pkg - # run: cd cmd && go test -v ./... - - - name: Test core pkg - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: go test -tags=static -v ./... - - - name: Test httphandler pkg - run: cd httphandler && go test -tags=static -v ./... - - - name: Build - env: - RELEASE: v2.0.${{ github.run_number }} - CLIENT: test - CGO_ENABLED: 1 - run: python3 --version && python3 build.py - - - name: Smoke Testing - env: - RELEASE: v2.0.${{ github.run_number }} - KUBESCAPE_SKIP_UPDATE_CHECK: "true" - run: python3 smoke_testing/init.py ${PWD}/build/${{ matrix.os }}/kubescape - + trigger-test-workflow: + uses: ./.github/workflows/test.yaml + with: + release: "v2.0.${{ github.run_number }}" + client: test diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 00000000..4f91b854 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,44 @@ +name: build + +on: + workflow_call: + inputs: + release_name: + description: 'release' + required: true + type: string + tag_name: + description: 'tag' + required: true + type: string + draft: + description: 'create draft release' + required: false + type: boolean + default: false + secrets: + GITHUB_TOKEN: + required: true + outputs: + upload_url: + description: "The first output string" + value: ${{ jobs.release.outputs.upload_url }} + +jobs: + release: + name: Create release + runs-on: ubuntu-latest + outputs: + upload_url: ${{ steps.create_release.outputs.upload_url }} + steps: + - name: Create a release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ inputs.tag_name }} + release_name: ${{ inputs.release_name }} + draft: ${{ inputs.draft }} + prerelease: false + \ No newline at end of file diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 00000000..696a9dc9 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,91 @@ +name: test + +on: + workflow_call: + inputs: + release: + description: 'release' + required: true + type: string + client: + description: 'Client name' + required: true + type: string +jobs: + build: + name: Create cross-platform build + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Cache Go modules (Linux) + if: matrix.os == 'ubuntu-latest' + uses: actions/cache@v3 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: Cache Go modules (macOS) + if: matrix.os == 'macos-latest' + uses: actions/cache@v3 + with: + path: | + ~/Library/Caches/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: Cache Go modules (Windows) + if: matrix.os == 'windows-latest' + uses: actions/cache@v3 + with: + path: | + ~\AppData\Local\go-build + ~\go\pkg\mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: Set up Go + uses: actions/setup-go@v3 + with: + go-version: 1.18 + + - name: Install MSYS2 & libgit2 (Windows) + shell: cmd + run: .\build.bat all + if: matrix.os == 'windows-latest' + + - name: Install libgit2 (Linux/macOS) + run: make libgit2 + if: matrix.os != 'windows-latest' + + - name: Test core pkg + run: go test -tags=static -v ./... + + - name: Test httphandler pkg + run: cd httphandler && go test -tags=static -v ./... + + - name: Build + env: + RELEASE: ${{ inputs.release }} + CLIENT: test + CGO_ENABLED: 1 + run: python3 --version && python3 build.py + + - name: Smoke Testing + env: + RELEASE: ${{ inputs.release }} + KUBESCAPE_SKIP_UPDATE_CHECK: "true" + run: python3 smoke_testing/init.py ${PWD}/build/${{ matrix.os }}/kubescape +