diff --git a/.github/workflows/build-scan-push.yaml b/.github/workflows/build-scan-push.yaml new file mode 100644 index 0000000..473fe5d --- /dev/null +++ b/.github/workflows/build-scan-push.yaml @@ -0,0 +1,119 @@ +name: Build, Scan and Push + +on: + push: + branches: + - main + pull_request: + +jobs: + build-image: + name: Build Images + runs-on: ubuntu-latest + + permissions: + pull-requests: write # needed to create and update comments in PRs + # actions: read # for github/codeql-action/upload-sarif, only required for workflows in private repositories + contents: read # for actions/checkout to fetch code + security-events: write # for github/codeql-action/upload-sarif to upload SARIF results + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and export to Docker + uses: docker/build-push-action@v2 + with: + push: false + load: true # Export to Docker Engine rather than pushing to a registry + tags: ${{ github.run_id }} + cache-from: type=gha + cache-to: type=gha,mode=max + platforms: linux/amd64 + + - name: Run Trivy for all CVEs (non-blocking) + uses: aquasecurity/trivy-action@master + with: + image-ref: ${{ github.run_id }} + format: table + exit-code: 0 + + - name: Run Trivy for HIGH,CRITICAL CVEs and report (blocking) + uses: aquasecurity/trivy-action@master + with: + image-ref: ${{ github.run_id }} + exit-code: 1 + ignore-unfixed: true + vuln-type: "os,library" + severity: "HIGH,CRITICAL" + format: "sarif" + output: "trivy-results.sarif" + + # Code scanning is only free to use on public repositories. + # - name: Upload Trivy scan results to GitHub Security tab + # uses: github/codeql-action/upload-sarif@v2 + # if: always() + # with: + # sarif_file: "trivy-results.sarif" + + - name: Docker Metadata for Final Image Build + id: docker_meta + uses: docker/metadata-action@v3 + with: + images: felipecruz/${{ github.event.repository.name }} + flavor: | + latest=false + tags: | + type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} + type=ref,event=pr + type=ref,event=branch + type=semver,pattern={{version}} + + - name: Docker Build and Push to Docker Hub + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ steps.docker_meta.outputs.tags }} + labels: ${{ steps.docker_meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + platforms: linux/amd64,linux/arm64 + # If PR, put image tags in the PR comments + # from https://github.com/marketplace/actions/create-or-update-comment + - name: Find comment for image tags + uses: peter-evans/find-comment@v1 + if: github.event_name == 'pull_request' + id: fc + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: "github-actions[bot]" + body-includes: Docker image tag(s) pushed + + # If PR, put image tags in the PR comments + - name: Create or update comment for image tags + uses: peter-evans/create-or-update-comment@v1 + if: github.event_name == 'pull_request' + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + Docker image tag(s) pushed: + ```text + ${{ steps.docker_meta.outputs.tags }} + ``` + Labels added to images: + ```text + ${{ steps.docker_meta.outputs.labels }} + ``` + edit-mode: replace diff --git a/.github/workflows/hadolint.yaml b/.github/workflows/hadolint.yaml new file mode 100644 index 0000000..af489b4 --- /dev/null +++ b/.github/workflows/hadolint.yaml @@ -0,0 +1,16 @@ +name: Lint Dockerfile +on: + push: + branches: + - main + pull_request: + +jobs: + lint-dockerfile: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: hadolint/hadolint-action@v2.0.0 + with: + dockerfile: Dockerfile + ignore: DL3048 diff --git a/Dockerfile b/Dockerfile index f557956..d7eb956 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ RUN --mount=type=cache,target=/usr/src/app/.npm \ COPY ui /ui RUN npm run build -FROM alpine +FROM alpine:3.16 LABEL org.opencontainers.image.title="vackup-docker-extension" \ org.opencontainers.image.description="Easily backup and restore docker volumes." \ org.opencontainers.image.vendor="Felipe" \ @@ -21,6 +21,7 @@ LABEL org.opencontainers.image.title="vackup-docker-extension" \ com.docker.extension.additional-urls="[{\"title\":\"Author\", \"url\":\"https://twitter.com/felipecruz\"}]" \ com.docker.extension.changelog="" +WORKDIR / COPY metadata.json . COPY docker.svg . COPY --from=client-builder /ui/build ui