From 64c21b6bcd367cac63198b33826db13f0f99a882 Mon Sep 17 00:00:00 2001 From: Daniel Gospodinow Date: Fri, 26 Jan 2024 11:56:45 +0000 Subject: [PATCH] Initial commit --- .gitattributes | 1 + .github/dependabot.yml | 21 +++ .github/linters/.markdown-lint.yml | 7 + .github/linters/.yaml-lint.yml | 10 ++ .github/workflows/ci.yml | 73 ++++++++++ .github/workflows/linter.yml | 30 ++++ .gitignore | 25 ++++ .prettierrc.json | 16 +++ CODEOWNERS | 3 + Dockerfile | 11 ++ LICENSE | 21 +++ README.md | 224 +++++++++++++++++++++++++++++ action.yml | 21 +++ entrypoint.sh | 12 ++ 14 files changed, 475 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/dependabot.yml create mode 100644 .github/linters/.markdown-lint.yml create mode 100644 .github/linters/.yaml-lint.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/linter.yml create mode 100644 .gitignore create mode 100644 .prettierrc.json create mode 100644 CODEOWNERS create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 action.yml create mode 100755 entrypoint.sh diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..9d98c2a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,21 @@ +version: 2 +updates: + - package-ecosystem: docker + directory: / + schedule: + interval: weekly + groups: + docker-minor: + update-types: + - minor + - patch + + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + groups: + actions-minor: + update-types: + - minor + - patch 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..235502b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,73 @@ +name: Continuous Integration + +on: + pull_request: + push: + branches: + - main + +permissions: + contents: read + +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@v4 + + - name: Setup Docker BuildX + id: setup-buildx + uses: docker/setup-buildx-action@v3 + with: + install: true + driver-opts: network=host + + - name: Build the Container + id: build + uses: docker/build-push-action@v5 + 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@v4 + + - 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..6eec65e --- /dev/null +++ b/.github/workflows/linter.yml @@ -0,0 +1,30 @@ +name: Lint Codebase + +on: + pull_request: + push: + branches: + - main + +permissions: + contents: read + packages: read + statuses: write + +jobs: + lint: + name: Lint Codebase + runs-on: ubuntu-latest + + steps: + - name: Checkout + id: checkout + uses: actions/checkout@v4 + + - name: Lint Codebase + id: super-linter + uses: super-linter/super-linter/slim@v5 + env: + DEFAULT_BRANCH: main + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VALIDATE_ALL_CODEBASE: true 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 new file mode 100644 index 0000000..2e08bd2 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,3 @@ +# Repository CODEOWNERS + +* @actions/actions-oss-maintainers diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c4a4906 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +# Set the base image to use for subsequent instructions +FROM alpine:3.19 + +# Set the working directory inside the container +WORKDIR /usr/src + +# Copy any source file(s) required for the action +COPY entrypoint.sh . + +# Configure the container to be run as an executable +ENTRYPOINT ["/usr/src/entrypoint.sh"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5f9e342 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright GitHub + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9d53b0c --- /dev/null +++ b/README.md @@ -0,0 +1,224 @@ +# Container Action Template + +[![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) + +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 + +> [!IMPORTANT] +> +> Make sure to remove or update the [`CODEOWNERS`](./CODEOWNERS) file! For +> details on how to use this file, see +> [About code owners](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners). + +## 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 new file mode 100644 index 0000000..6a12f41 --- /dev/null +++ b/action.yml @@ -0,0 +1,21 @@ +name: 'The name of your action here' +description: 'Provide a description here' +author: 'Your name or organization here' + +# Define your inputs here. +inputs: + 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 + env: + INPUT_WHO_TO_GREET: ${{ inputs.who-to-greet }} diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..22c9865 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/sh -l + +# 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