Custom GitHub Actions: Core File Organization and Guidelines
Custom GitHub Actions enable users to define specific workflows tailored to their needs. Below are the core conventions and best practices for organizing custom GitHub Actions.
0. Installed images in github acitons environment
https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md
1. Folder Organization
Each custom Action must reside in its own folder, typically under .github/actions
:
.github/ actions/ action-name/ # Custom Action folder action.yml # Core configuration file (required) script.sh # Optional: Supporting script file Dockerfile # Optional: Docker configuration file index.js # Optional: Entry point for JavaScript Actions README.md # Optional: Action documentation
2. Core File: action.yml
action.yml
is the required configuration file that defines the Action's behavior.
Required Fields
-
name
: The Action's name (for identification). -
description
: A short description of the Action's purpose. -
inputs
: (Optional) Parameters to pass to the Action. -
outputs
: (Optional) Values returned by the Action. -
runs
: Specifies how the Action should execute.
3. Types of Actions
(1) Composite Actions
A series of steps defined directly in the action.yml
file.
Example: action.yml
name: My Composite Action description: A composite Action example inputs: example_input: description: "An example input" required: true runs: using: "composite" steps: - name: Print input run: echo "Input is ${{ inputs.example_input }}"
(2) JavaScript/TypeScript Actions
Runs on Node.js, allowing complex logic and dependencies.
File Structure:
.github/actions/my-js-action/ action.yml index.js # Main script file package.json # Node.js dependencies
Example: action.yml
name: My JavaScript Action description: A JavaScript Action example inputs: example_input: description: "An example input" required: true runs: using: "node16" main: index.js # Entry point
(3) Docker Actions
Runs inside a Docker container with a custom environment.
File Structure:
.github/actions/my-docker-action/ action.yml Dockerfile # Required for Docker Actions
Example: action.yml
name: My Docker Action description: A Docker Action example inputs: example_input: description: "An example input" required: true runs: using: "docker" image: "Dockerfile" args: - ${{ inputs.example_input }}
Example: Dockerfile
FROM ubuntu:20.04 RUN apt-get update && apt-get install -y curl jq COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
4. Optional Files
README.md
- Provides documentation for the Action, including:
- Description of functionality.
- List of input and output parameters.
- Examples of usage.
Scripts
- Include additional shell or Python scripts as needed to support the Action's logic.
5. Referencing Custom Actions
(1) Local Repository
If the Action is in the same repository:
- name: Use Custom Action uses: ./github/actions/action-name with: example_input: "Hello World"
(2) External Repository
If the Action is hosted in another public repository:
- name: Use Custom Action uses: username/repository-name/path/to/action-name@v1 with: example_input: "Hello World"
6. Best Practices
-
File Naming
- The configuration file must be named
action.yml
oraction.yaml
. - For Docker Actions, a
Dockerfile
is required.
- The configuration file must be named
-
Dependencies
- For JavaScript Actions, declare all dependencies in
package.json
. - For Docker Actions, include all required tools in the
Dockerfile
.
- For JavaScript Actions, declare all dependencies in
-
Checkout Repository
- Always include
actions/checkout
before referencing local Actions to load the repository's content.
- Always include
7. Example Workflow Using a Custom Action
Workflow File: .github/workflows/main.yml
name: Example Workflow on: push: branches: - main jobs: example: runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@v3 - name: Use Custom Action uses: ./github/actions/action-name with: example_input: "Hello World"
Top comments (0)