diff --git a/.github/workflows/test-action.yaml b/.github/workflows/test-action.yaml new file mode 100644 index 00000000..2f29409f --- /dev/null +++ b/.github/workflows/test-action.yaml @@ -0,0 +1,24 @@ +name: Test container-diff Action + +on: + pull_request: [] + +jobs: + test-container-diff: + name: Test container-diff + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + # Add more test cases here as necessary + args: + - vanessa/salad --type=file --output=./data.json --json + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Run container-diff + uses: ./actions + with: + args: ${{ matrix.args }} + - name: View output + run: cat ./data.json diff --git a/actions/Dockerfile b/actions/Dockerfile index d12d7f9a..30e18368 100644 --- a/actions/Dockerfile +++ b/actions/Dockerfile @@ -1,25 +1,7 @@ -FROM golang:1.11.3-stretch +FROM debian:bookworm # docker build -f actions/Dockerfile -t googlecontainertools/container-diff . -RUN apt-get update && \ - apt-get install -y automake \ - libffi-dev \ - libxml2 \ - libxml2-dev \ - libxslt-dev \ - libxslt1-dev \ - git \ - gcc g++ \ - wget \ - locales - -RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ - locale-gen -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 - LABEL "com.github.actions.name"="container-diff GitHub Action" LABEL "com.github.actions.description"="use Container-Diff in Github Actions Workflows" LABEL "com.github.actions.icon"="cloud" @@ -29,14 +11,10 @@ LABEL "repository"="https://www.github.com/GoogleContainerTools/container-diff" LABEL "homepage"="https://www.github.com/GoogleContainerTools/container-diff" LABEL "maintainer"="Google Inc." -# Install container-diff from master -RUN go get github.com/GoogleContainerTools/container-diff && \ - cd ${GOPATH}/src/github.com/GoogleContainerTools/container-diff && \ - go get && \ - make && \ - go install && \ - mkdir -p /code && \ - apt-get autoremove +# Install container-diff latest release +RUN apt-get update && apt-get install -y curl && \ + curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64 && \ + install container-diff-linux-amd64 /usr/local/bin/container-diff ADD entrypoint.sh /entrypoint.sh diff --git a/actions/README.md b/actions/README.md index 29ed114d..74eac4c3 100644 --- a/actions/README.md +++ b/actions/README.md @@ -4,78 +4,49 @@ This is a Github Action to allow you to run Container Diff in a [Github Actions](https://help.github.com/articles/about-github-actions/#about-github-actions) workflow. The intended use case is to build a Docker container from the repository, push it to Docker Hub, and then use container-diff to extract metadata for it that -you can use in other workflows (such as deploying to Github pages). In -the example below, we will show you how to build a container, push -to Docker Hub, and then container diff. Here is the entire workflow: +you can use in other workflows (such as deploying to Github pages). You can also run +container diff to extract metadata for a container you've just built locally in the action. -## Example 1: Run Container Diff +## 1. Action Parameters -Given an existing container on Docker Hub, we can run container diff -without doing any kind of build. +The action accepts the following parameters: -``` -workflow "Run container-diff isolated" { - on = "push" - resolves = ["list"] -} +| Name | Description | Type| Default | Required | +|------|-------------|-----|---------|----------| +| command | main command for container-diff | string | analyze | false | +| args | The full list of arguments to follow container-diff (see example below) | string | help | true | -action "Run container-diff" { - uses = "GoogleContainerTools/container-diff/actions@master" - args = ["analyze vanessa/salad --type=file --output=/github/workspace/data.json --json"] -} +See below for a simple example. Another interesting use case would be to generate metadata and upload +to an OCI registry using [OCI Registry As Storage](https://oras.land/). -action "list" { - needs = ["Run container-diff"] - uses = "actions/bin/sh@master" - runs = "ls" - args = ["/github/workspace"] -} +## 2. Run Container Diff + +Given an existing container on Docker Hub, we can run container diff +without doing any kind of build. + +```yaml +name: Run container-diff + +on: + pull_request: [] + +jobs: + container-diff: + name: Run container-diff + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Run container-diff + uses: GoogleContainerTools/container-diff/actions@master + with: + # Note this command is the default and does not need to be included + command: analyze + args: vanessa/salad --type=file --output=./data.json --json + - name: View output + run: cat ./data.json ``` In the above, we run container-diff to output apt and pip packages, history, and the filesystem for the container "vanessa/salad" that already exists on Docker Hub. We save the result to a data.json output file. The final step in the workflow (list) is a courtesy to show that the data.json file is generated. - -## Example 2: Build, Deploy, Run Container Diff - -This next example is slightly more complicated in that it will run container-diff -after a container is built and deployed from a Dockerfile present in the repository. - -``` -workflow "Run container-diff after deploy" { - on = "push" - resolves = ["Run container-diff"] -} - -action "build" { - uses = "actions/docker/cli@master" - args = "build -t vanessa/salad ." -} - -action "login" { - uses = "actions/docker/login@master" - secrets = ["DOCKER_USERNAME", "DOCKER_PASSWORD"] -} - -action "push" { - uses = "actions/docker/cli@master" - args = "push vanessa/salad" -} - -action "Run container-diff" { - needs = ["build", "login", "push"] - uses = "GoogleContainerTools/container-diff/actions@master" - args = ["analyze vanessa/salad --type=file --output=/github/workspace/data.json --json"] -} - -action "list" { - needs = ["Run container-diff"] - uses = "actions/bin/sh@master" - runs = "ls" - args = ["/github/workspace"] -} -``` - -The intended use case of the above would be to, whenever you update your -container, deploy its metadata to Github pages (or elsewhere). diff --git a/actions/action.yaml b/actions/action.yaml new file mode 100644 index 00000000..4e497f30 --- /dev/null +++ b/actions/action.yaml @@ -0,0 +1,14 @@ +name: container-diff + +inputs: + command: + required: true + description: "Container diff command to use (defaults to analyze)" + default: analyze + args: + description: "String of arguments to pass to the container-diff command" + default: help + +runs: + using: 'docker' + image: 'Dockerfile' diff --git a/actions/entrypoint.sh b/actions/entrypoint.sh index e7b50a45..a486bf44 100644 --- a/actions/entrypoint.sh +++ b/actions/entrypoint.sh @@ -1,4 +1,5 @@ #!/bin/bash -echo "$@" -/go/bin/container-diff ${@} +command="${INPUT_COMMAND} ${INPUT_ARGS}" +echo "container-diff ${command}" +/usr/local/bin/container-diff ${command}