diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..70cb209 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,17 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + labels: + - dependabot + - actions + schedule: + interval: daily + + - package-ecosystem: docker + directory: / + labels: + - dependabot + - docker + schedule: + interval: daily diff --git a/.github/linters/.markdown-lint.yml b/.github/linters/.markdown-lint.yml new file mode 100644 index 0000000..6d79773 --- /dev/null +++ b/.github/linters/.markdown-lint.yml @@ -0,0 +1,7 @@ +# Unordered list style +MD004: + style: dash + +# Ordered list item prefix +MD029: + style: one diff --git a/.github/linters/.yaml-lint.yml b/.github/linters/.yaml-lint.yml new file mode 100644 index 0000000..c975a33 --- /dev/null +++ b/.github/linters/.yaml-lint.yml @@ -0,0 +1,10 @@ +rules: + document-end: disable + document-start: + level: warning + present: false + line-length: + level: warning + max: 80 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..3de6711 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,72 @@ +name: Continuous Integration + +on: + pull_request: + branches: + - main + push: + branches: + - main + +jobs: + test-docker: + name: Docker Tests + runs-on: ubuntu-latest + + # Run a local registry to push to + services: + registry: + image: registry:2 + ports: + - 5001:5000 + + env: + TEST_TAG: localhost:5001/actions/container-action:latest + + steps: + - name: Checkout + id: checkout + uses: actions/checkout@v3 + + - name: Setup Docker BuildX + id: setup-buildx + uses: docker/setup-buildx-action@v2 + with: + install: true + driver-opts: network=host + + - name: Build the Container + id: build + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: ${{ env.TEST_TAG }} + + - name: Run the Container + id: run + env: + INPUT_WHO_TO_GREET: Mona Lisa Octocat + run: | + docker run \ + --env INPUT_WHO_TO_GREET="${{ env.INPUT_WHO_TO_GREET }}" \ + --rm ${{ env.TEST_TAG }} + + test-action: + name: GitHub Actions Test + runs-on: ubuntu-latest + + steps: + - name: Checkout + id: checkout + uses: actions/checkout@v3 + + - name: Test Local Action + id: test-action + uses: ./ + with: + who-to-greet: Mona Lisa Octocat + + - name: Print Output + id: output + run: echo "${{ steps.test-action.outputs.greeting }}" diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml new file mode 100644 index 0000000..d52f232 --- /dev/null +++ b/.github/workflows/linter.yml @@ -0,0 +1,31 @@ +name: Lint Code Base + +on: + pull_request: + branches: + - main + push: + branches: + - main + +jobs: + lint: + name: Lint Code Base + runs-on: ubuntu-latest + + permissions: + contents: read + packages: read + statuses: write + + steps: + - name: Checkout + id: checkout + uses: actions/checkout@v3 + + - name: Lint Code Base + id: super-linter + uses: super-linter/super-linter/slim@v5 + env: + DEFAULT_BRANCH: main + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dcff431 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# dotenv environment variables file +.env +.env.test + +# OS metadata +.DS_Store +Thumbs.db + +# IDE files +.idea +.vscode +*.code-workspace diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..a378146 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,16 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "trailingComma": "none", + "bracketSpacing": true, + "bracketSameLine": true, + "arrowParens": "avoid", + "proseWrap": "always", + "htmlWhitespaceSensitivity": "css", + "endOfLine": "lf" +} diff --git a/CODEOWNERS b/CODEOWNERS index 992d27f..a9802d7 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1,4 @@ +# Repository CODEOWNERS + * @actions/actions-runtime +* @ncalteen diff --git a/Dockerfile b/Dockerfile index af66730..6b92e63 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,11 @@ -FROM alpine:3.10 +# Set the base image to use for subsequent instructions +FROM alpine:3.18 -COPY LICENSE README.md / +# Set the working directory inside the container +WORKDIR /usr/src -COPY entrypoint.sh /entrypoint.sh +# Copy any source file(s) required for the action +COPY entrypoint.sh . -ENTRYPOINT ["/entrypoint.sh"] +# Configure the container to be run as an executable +ENTRYPOINT ["/usr/src/entrypoint.sh"] diff --git a/README.md b/README.md index 25842b5..a8b8b90 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,218 @@ # Container Action Template -To get started, click the `Use this template` button on this repository [which will create a new repository based on this template](https://github.blog/2019-06-06-generate-new-repositories-with-repository-templates/). +[![GitHub Super-Linter](https://github.com/actions/container-action/actions/workflows/linter.yml/badge.svg)](https://github.com/super-linter/super-linter) +![CI](https://github.com/actions/container-action/actions/workflows/ci.yml/badge.svg) -For info on how to build your first Container action, see the [toolkit docs folder](https://github.com/actions/toolkit/blob/master/docs/container-action.md). +Use this template to bootstrap the creation of a container action. :rocket: + +This template includes compilation support, tests, a validation workflow, +publishing, and versioning guidance. + +If you are new, there's also a simpler introduction in the +[Hello World Docker Action](https://github.com/actions/hello-world-docker-action) +repository. + +If you would like to use the +[GitHub Actions Toolkit](https://github.com/actions/toolkit) in your container +action, see the +[Container Toolkit Action](https://github.com/actions/container-toolkit-action) +repository. + +## Create Your Own Action + +To create your own action, you can use this repository as a template! Just +follow the below instructions: + +1. Click the **Use this template** button at the top of the repository +1. Select **Create a new repository** +1. Select an owner and name for your new repository +1. Click **Create repository** +1. Clone your new repository + +## Initial Setup + +After you've cloned the repository to your local machine or codespace, you'll +need to perform some initial setup steps before you can develop your action. + +> [!NOTE] +> +> You'll need to have a reasonably modern version of +> [Docker](https://www.docker.com/get-started/) handy (e.g. docker engine +> version 20 or later). + +1. :hammer_and_wrench: Build the container + + Make sure to replace `actions/container-action` with an appropriate label for + your container. + + ```bash + docker build -t actions/container-action . + ``` + +1. :white_check_mark: Test the container + + You can pass individual environment variables using the `--env` or `-e` flag. + + ```bash + $ docker run --env INPUT_WHO_TO_GREET="Mona Lisa Octocat" actions/container-action + ::notice file=entrypoint.sh,line=7::Hello, Mona Lisa Octocat! + ``` + + Or you can pass a file with environment variables using `--env-file`. + + ```bash + $ cat ./.env.test + INPUT_WHO_TO_GREET="Mona Lisa Octocat" + + $ docker run --env-file ./.env.test actions/container-action + ::notice file=entrypoint.sh,line=7::Hello, Mona Lisa Octocat! + ``` + +## Update the Action Metadata + +The [`action.yml`](action.yml) file defines metadata about your action, such as +input(s) and output(s). For details about this file, see +[Metadata syntax for GitHub Actions](https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions). + +When you copy this repository, update `action.yml` with the name, description, +inputs, and outputs for your action. + +## Update the Action Code + +In this template, the container action runs a shell script, +[`entrypoint.sh`](./entrypoint.sh), when the container is launched. Since you +can choose any base Docker image and language you like, you can change this to +suite your needs. There are a few main things to remember when writing code for +container actions: + +- Inputs are accessed using argument identifiers or environment variables + (depending on what you set in your `action.yml`). For example, the first input + to this action, `who-to-greet`, can be accessed in the entrypoint script using + the `$INPUT_WHO_TO_GREET` environment variable. + + ```bash + GREETING="Hello, $INPUT_WHO_TO_GREET!" + ``` + +- GitHub Actions supports a number of different workflow commands such as + creating outputs, setting environment variables, and more. These are + accomplished by writing to different `GITHUB_*` environment variables. For + more information, see + [Workflow commands](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions). + + | Scenario | Example | + | --------------------- | ----------------------------------------------- | + | Set environment vars | `echo "MY_VAR=my-value" >> "$GITHUB_ENV"` | + | Set outputs | `echo "greeting=$GREETING" >> "$GITHUB_OUTPUT"` | + | Prepend to `PATH` | `echo "$HOME/.local/bin" >> "$GITHUB_PATH"` | + | Set `pre`/`post` vars | `echo "MY_VAR=my-value" >> "$GITHUB_STATE"` | + | Set step summary | `echo "{markdown}" >> "$GITHUB_STEP_SUMMARY"` | + + You can write multiline strings using the following syntax: + + ```bash + { + echo "JSON_RESPONSE<> "$GITHUB_ENV" + ``` + +- Make sure that the script being run is executable! + + ```bash + git add entrypoint.sh + git update-index --chmod=+x entrypoint.sh + ``` + +So, what are you waiting for? Go ahead and start customizing your action! + +1. Create a new branch + + ```bash + git checkout -b releases/v1 + ``` + +1. Replace the contents of `entrypoint.sh` with your action code +1. Build and test the container + + ```bash + docker build -t actions/container-action . + docker run actions/container-action "Mona Lisa Octocat" + ``` + +1. Commit your changes + + ```bash + git add . + git commit -m "My first action is ready!" + ``` + +1. Push them to your repository + + ```bash + git push -u origin releases/v1 + ``` + +1. Create a pull request and get feedback on your action +1. Merge the pull request into the `main` branch + +Your action is now published! :rocket: + +For information about versioning your action, see +[Versioning](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md) +in the GitHub Actions toolkit. + +## Validate the Action + +You can now validate the action by referencing it in a workflow file. For +example, [`ci.yml`](./.github/workflows/ci.yml) demonstrates how to reference an +action in the same repository. + +```yaml +steps: + - name: Checkout + id: checkout + uses: actions/checkout@v3 + + - name: Test Local Action + id: test-action + uses: ./ + with: + who-to-greet: Mona Lisa Octocat + + - name: Print Output + id: output + run: echo "${{ steps.test-action.outputs.greeting }}" +``` + +For example workflow runs, check out the +[Actions tab](https://github.com/actions/container-action/actions)! :rocket: + +## Usage + +After testing, you can create version tag(s) that developers can use to +reference different stable versions of your action. For more information, see +[Versioning](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md) +in the GitHub Actions toolkit. + +To include the action in a workflow in another repository, you can use the +`uses` syntax with the `@` symbol to reference a specific branch, tag, or commit +hash. + +```yaml +steps: + - name: Checkout + id: checkout + uses: actions/checkout@v3 + + - name: Test Local Action + id: test-action + uses: actions/container-action@v1 # Commit with the `v1` tag + with: + who-to-greet: Mona Lisa Octocat + + - name: Print Output + id: output + run: echo "${{ steps.test-action.outputs.greeting }}" +``` diff --git a/action.yml b/action.yml index 008f0a9..6a12f41 100644 --- a/action.yml +++ b/action.yml @@ -1,12 +1,21 @@ -name: 'Container Action Template' -description: 'Get started with Container actions' -author: 'GitHub' +name: 'The name of your action here' +description: 'Provide a description here' +author: 'Your name or organization here' + +# Define your inputs here. inputs: - myInput: - description: 'Input to use' - default: 'world' + who-to-greet: + description: 'Your input description here' + required: true + default: 'World' + +# Define your outputs here. +outputs: + greeting: + description: 'Your output description here' + runs: - using: 'docker' - image: 'Dockerfile' - args: - - ${{ inputs.myInput }} + using: docker + image: Dockerfile + env: + INPUT_WHO_TO_GREET: ${{ inputs.who-to-greet }} diff --git a/entrypoint.sh b/entrypoint.sh index 3b8cd2d..22c9865 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,3 +1,12 @@ #!/bin/sh -l -echo "hello $1" +# Use INPUT_ to get the value of an input +GREETING="Hello, $INPUT_WHO_TO_GREET!" + +# Use workflow commands to do things like set debug messages +echo "::notice file=entrypoint.sh,line=7::$GREETING" + +# Write outputs to the $GITHUB_OUTPUT file +echo "greeting=$GREETING" >> "$GITHUB_OUTPUT" + +exit 0