GitHub Actions vs Forgejo Actions

GitHub Actions suits teams that want a managed CI service tied to GitHub. Forgejo Actions suits teams that want self-hosted CI on a GPL-licensed forge with a familiar workflow syntax, though its workflows are not drop-in compatible.

On this page

Which fits your GitHub Actions situation: GitHub Actions or Forgejo Actions

GitHub Actions fits best when your code already lives on GitHub, your team wants a managed forge, and your workflows depend on the GitHub marketplace or GitHub-only features. Forgejo Actions fits best when the forge itself must sit in your own infrastructure, when code or build data cannot leave your network, or when you want a non-profit, GPL-3.0-or-later project behind the tooling. Forgejo Actions is designed to be familiar to GitHub Actions users, but it is not compatible with it, so you should expect to edit workflows rather than copy them across unchanged.

The decision turns on four questions. First, where must the code live? If repositories must stay on your servers, GitHub Actions is off the table for that data, and Forgejo becomes the forge plus CI option to evaluate. Second, who operates the forge? A self-hosted Forgejo instance means your team owns upgrades, backups and the Forgejo Runner fleet, and Forgejo's stable and LTS support windows set the cadence you must plan around. Confirm the current release and support dates on the Forgejo releases page before you commit.

Third, how many workflows already depend on GitHub-only features? Count workflows that call marketplace actions, use OIDC federation, environments with approvals or GitHub-specific permission scopes. Each one needs a review against the documented differences in Forgejo Actions. Fourth, does the team need the GitHub marketplace? Forgejo runs actions fetched from a configured source, so marketplace-heavy pipelines need an inventory of which actions are required and where they will be sourced from. Ask your team to produce that list first, since it sizes the migration more accurately than any general estimate.

Which option fits which scenario

This table matches common situations to the better fit between GitHub Actions and Forgejo Actions, and names the condition that tips each choice. Read each row by first checking the condition in the right-hand column, since a single change in that condition often reverses the answer.

ScenarioBetter fitCondition that makes it so
Repositories stay on github.com and depend on marketplace actionsGitHub ActionsYour workflows call many marketplace actions that are not mirrored or tested on Forgejo, and you accept hosted or metered runner costs
Self-hosted forge inside a regulated datacenterForgejo ActionsSource code, logs and artifacts must stay on your own servers, and you run Forgejo Runner in that network
Team that wants GPL-3.0-or-later licensing and non-profit governanceForgejo ActionsYour procurement or legal policy favors copyleft licensing and an independent project governed outside a single vendor
Heavy use of GitHub-only workflow features, such as specific permission scopes or hosted servicesGitHub ActionsYour workflows depend on GitHub-specific behavior that the Forgejo documentation does not list as supported, so porting would require rewrites
Team already running GiteaForgejo Actions (evaluate the upgrade)Forgejo documents transparent upgrades from Gitea up to Gitea v1.22 in two steps, so confirm your version and the migration path before switching
Workflows written for GitHub Actions that must run unchanged on a new forgeNeither, confirm firstForgejo Actions is designed to be familiar but not compatible, so run your existing workflows on a test instance to find the differences

Where the data lives and who controls it

Moving from GitHub Actions to Forgejo Actions changes where logs, artifacts and secrets are stored, who operates the platform and how users sign in. Each card below covers one of those decisions, with the checks to run before choosing a hosting model.

Logs and artifacts location

On GitHub-hosted runners, run logs and artifacts sit in GitHub's storage, and the default artifact retention is 90 days. With Forgejo Actions, logs and artifacts are stored on the Forgejo instance you operate, so retention and deletion follow your own policy. Ask who can read run logs, how long they are kept and whether any build output contains credentials that must be scrubbed before storage.

Secrets storage and export

GitHub's REST API returns Actions secret names without values, so secrets cannot be copied out of GitHub when you leave it. Forgejo Actions secrets are entered again on the new instance, which means someone must rotate and re-issue each credential. Inventory every secret, record its owner and rotate it during the cutover rather than copying it blindly.

Hosting model and operator

GitHub Actions runs in one of three models: GitHub-hosted runners on GitHub's infrastructure, GitHub Enterprise Server installed in your data center, or self-hosted runners attached to GitHub. Forgejo Actions runs on a Forgejo instance and separate runners that your team installs and operates. Decide who patches the forge, who runs the runners and who answers for an outage before you choose.

Identity and sign-in integration

GitHub Enterprise Cloud and Enterprise Server connect to corporate identity through SAML and SCIM. A self-hosted Forgejo instance has its own user accounts and authentication sources, so confirm which single sign-on and directory options your Forgejo version supports and how account deprovisioning will work. Access to the forge and access to runners should be reviewed separately.

Forgejo support windows and upgrades

Forgejo publishes stable releases with three months of full support plus a two-week window, and LTS releases with one year and three months of critical and security support. Your team takes on patching and upgrades that GitHub otherwise performs. Plan a version policy, choose between stable and LTS tracks and record who receives security advisories.

Compliance evidence and responsibility

Moving the forge changes which controls you own. Under a self-hosted model, your organization is responsible for access logs, backups, encryption and change records that auditors may request. DeployOpen can plan, implement and document these controls and prepare the evidence, but it does not issue audit reports, attestations or certifications. Independent auditors and certification bodies make those determinations.

What the GPL-3.0-or-later license and non-profit governance mean for you

Forgejo's license matters before you deploy it, because the terms differ by version. Forgejo was released under the MIT license for earlier versions, and from v9.0 onward it is licensed under GPL-3.0-or-later. The practical split is simple to state: if you run a Forgejo release that is v9.0 or later and modify it only for your own staff, the copyleft conditions of the GPL are generally not triggered by internal use. If you distribute a modified Forgejo build to customers, partners or other third parties, or ship it inside a product, the GPL requires you to make the corresponding source of that modified version available under the same license. Confirm with your legal team exactly what counts as distribution in your organization, especially for contractors who customize Forgejo Actions or the Forgejo Runner on your behalf.

Governance is the second half of the picture. According to the Forgejo FAQ, Codeberg e.V., a non-profit association registered in Berlin, owns the project's domains, while project governance remains independent of that ownership. For a procurement or risk review, the questions to put to the project are who holds the trademarks and domains, how decisions are made, and what happens to the project if the association's circumstances change. Ask your legal team to read the license text and the Forgejo FAQ together, and to record a decision on the version you will deploy and the internal modification policy before you commit to a fork or a patch set. Do not treat this summary as legal advice.

The Forgejo Runner and when Forgejo fits better than Gitea

Forgejo Actions is the built-in CI system of Forgejo, and it does not run jobs on the forge server itself. The forge schedules workflows and hands them to separate runners, so the Forgejo instance serves repositories and the Forgejo Runner executes jobs on machines you register and control. This separation lets you size build capacity independently of the forge and keep sensitive builds on hosts placed in a controlled network zone.

  • Separate execution: the forge dispatches work and runners pick it up, so you can add or remove build capacity without changing the forge server.
  • Familiar, not compatible: the Forgejo documentation says the syntax is designed to be familiar to GitHub Actions users, but it is not compatible, so existing workflow files need review before they run unchanged.
  • Placement control: runners can sit in a network zone of your choosing, which helps when build hosts must reach internal registries but not the public internet.
  • Runner features: labels, execution options, caching and artifact handling change between releases, so check the runner documentation for the version you plan to deploy.
  • Secrets and hardening: secrets live in the Forgejo instance you operate, while each runner host needs its own patching, scoped credentials and network policy.

Confirm current runner features and version compatibility in the Forgejo Actions overview, then test a representative workflow on a staging runner before planning production rollout.

What moving from GitHub Actions to Forgejo Actions involves

The sequence moves repositories, issues and workflows to a self-hosted Forgejo instance, then re-establishes CI with runners and secrets, so builds run on infrastructure you control before GitHub is switched off.

  1. Inventory workflows, actions and secrets

    Platform or DevOps engineers list every repository with workflow files under .github/workflows, every third-party action each workflow calls, every self-hosted runner, and every secret and variable name the builds depend on. Secret values cannot be read back from GitHub, so the inventory records names and owners only. The step is done when each workflow has a named owner and each external action is marked as kept, replaced or removed.

  2. Stand up the Forgejo instance

    The platform team installs Forgejo in the organization's own infrastructure, configures storage, backups and TLS, and confirms the release line it will run, checking the upgrade and support documentation before choosing between a stable release and an LTS release. The check is that a test repository can be created, pushed to and browsed by the intended users. Ask your implementation partner or your own team to confirm the install method against the current Forgejo documentation.

  3. Move repositories and issues

    Repositories are migrated with Forgejo's migration tooling, and issues, pull requests and releases are carried across using the dump and restore commands described in the dedicated migration guide. Owners verify branch and tag counts, open issues and recent pull requests against GitHub. The step is complete when a sample of repositories matches the source and the team confirms that review history is readable.

  4. Place workflows in .forgejo/workflows

    Developers copy workflow files into .forgejo/workflows for repositories that need Forgejo-specific behavior. Forgejo falls back to .github/workflows when .forgejo/workflows is absent, so unchanged repositories can run without edits, but the fallback should be treated as a transition aid rather than a permanent layout. The check is that each workflow appears in the Forgejo Actions interface and is triggered by a test event.

  5. Fix documented differences

    Engineers work through the differences listed in the Forgejo Actions documentation, which is designed to be familiar to GitHub Actions users but is not compatible with it. Typical edits involve action references, expressions, permissions and runner labels. Each fix is tested on a branch before merge. The step closes when every workflow passes on Forgejo and any skipped or changed behavior is recorded for the team.

  6. Re-create secrets and variables

    Because GitHub returns only secret names through its API, maintainers re-enter each secret value in Forgejo at the repository or organization level, using the names recorded in step one. Deployment credentials should be rotated during this step rather than copied, so that the old values stop working after cutover. The check is that a deploy-free test pipeline can read each secret without printing it in logs.

  7. Register Forgejo Runners

    The platform team installs Forgejo Runner on build hosts inside the network, assigns labels that match the runs-on values in the workflows, and restricts runners to the repositories that need them. Runner hosts are hardened and kept separate from production systems. The step is done when jobs queue and run on the expected labels and each runner's host and access are documented.

  8. Cut over and retire GitHub pipelines

    Teams switch their default remote and webhooks to Forgejo, run a parallel build period agreed in writing with the owners, then disable GitHub Actions for migrated repositories. Build artifacts and logs still held on GitHub are exported before their retention expires. Cutover is complete when all production deployments are triggered from Forgejo, GitHub schedules are disabled, and the runbook has been handed to the operations team.

Cost components on each side

Hosted CI bills for minutes, runners, storage and seats, while a self-hosted forge moves those costs onto servers, runner hosts and the staff who run them. The cards below set each component against its Forgejo counterpart and say whether it is one-time or recurring.

GitHub-hosted minutes and runner charges

GitHub-hosted minutes are a recurring usage charge that scales with build count, build duration and runner size. GitHub announced a per-minute charge for self-hosted runners of $0.002 per minute and then postponed it, so the self-hosted runner line is free today but is not guaranteed to stay that way. Ask GitHub for the current written terms before you size a budget around either option. On the Forgejo side, the matching cost is the compute your Forgejo Runner hosts consume, which you control directly.

Seat and plan costs

On GitHub, the seats and plan tier you pay for are recurring and set how many users can administer and run workflows across private repositories. Forgejo has no per-seat licence fee from the project, so its recurring cost is the staff and infrastructure needed to host it. Confirm with each vendor which features your team actually needs, because some Actions controls depend on the tier you choose.

Storage for artifacts and logs

Hosted storage for artifacts and logs is billed and time-limited. GitHub Actions retains artifacts for 90 days by default, so long-term retention means exporting them and paying for storage elsewhere. On Forgejo, artifact and log storage is a recurring cost on disks or object storage you provision, sized by retention policy. Decide how long build history must stay available, then size storage for that period.

Runner hosts and capacity

On the Forgejo side, runner hosts are the largest recurring line. Each Forgejo Runner needs compute sized to peak concurrent jobs, and idle capacity still costs money. Runners on Kubernetes or VMs add node and autoscaling costs. Ask your team to measure peak concurrency for a typical month, then compare that figure with the GitHub-hosted minutes you would otherwise consume.

Upgrade effort and support

Running Forgejo means planning upgrades. Stable releases get three months of full support plus a two-week window, while LTS releases, published in the first quarter of each year, get one year and three months of critical bugfix and security support. Budget recurring staff time for upgrades, and decide whether to buy support from a vendor or rely on internal skills and community help.

Staff time and backups

Staff time is the cost most often left out. GitHub's operations are included in the subscription, while a self-hosted Forgejo needs people for installation, backups, monitoring, security patching and runner maintenance. Backups of the Forgejo database, repositories and CI data are a recurring duty. Ask for a written estimate of hours per month from anyone quoting the work, and confirm who carries on-call responsibility.

Questions buyers ask before choosing Forgejo Actions

How much does switching from GitHub Actions to Forgejo Actions cost?

The software license is not the main cost. Forgejo is GPL-3.0-or-later from v9.0 onward, so there is no per-seat or per-minute license fee to pay. The recurring costs are the servers or VMs for the Forgejo instance, the Forgejo Runner hosts, storage for logs and artifacts, backups, and staff time for upgrades and monitoring. The one-time costs are migration work: moving repositories, rewriting workflows that use GitHub-only features, re-creating secrets and testing pipelines. Costs rise with the number of workflows, runners, repositories and the amount of run history you keep. Ask any implementation partner for a written scope that lists each of these items separately, plus what is included in ongoing support.

How long does a Forgejo Actions migration take?

Duration depends mostly on how many repositories and workflows you have, how many use marketplace actions or GitHub-specific features, and how much run history you need to keep. A small set of repositories with simple workflows moves far faster than a large monorepo estate with custom actions and deployment environments. Plan a pilot on a few representative repositories first, then batch the rest. Forgejo's own migration tooling covers issues, pull requests and releases through dump-repo and restore-repo, but workflow testing is still manual. Ask for a timeline tied to repository count and workflow complexity in the written scope rather than accepting a generic estimate.

What does my internal team need to run Forgejo Actions?

Your team needs people who can operate a self-hosted Forgejo instance and its runners. That means Linux administration, a database and backup routine, reverse proxy and TLS configuration, runner registration and capacity planning, and a way to apply upgrades. Developers need to understand the differences between GitHub Actions and Forgejo Actions, because Forgejo is designed to be familiar to GitHub Actions users but is not compatible with it. Security staff should review how runners are isolated and how secrets are stored and rotated. Confirm with the vendor or your own environment which runner executors and container runtimes you plan to use, since those choices shape the skills you need.

Can we run a Forgejo Actions migration ourselves, or do we need a partner?

Yes, a capable internal team can do it, provided it has the operations skills described above and time to test workflows. The decision usually comes down to available staff, the number of workflows that need rewriting, and whether you need evidence for an audit. A partner is useful when you want a fixed-scope plan, hardening, backup design and documented runbooks delivered in writing before work starts. DeployOpen plans, implements, customizes, integrates, hardens, backs up, upgrades, documents and supports self-hosted open-source platforms inside your own infrastructure, and most engagements are fixed-scope with deliverables agreed in advance. Ongoing support and upgrades are available as retainers.

How do Forgejo support windows and LTS releases affect our planning?

Forgejo stable releases receive full support for three months plus a two-week window, so a stable version can fall out of full support quickly. LTS releases, published in the first quarter of each year, receive critical bugfixes and security support for one year and three months. The v15 LTS release is supported until July 15, 2027, and v17.0.0, released on October 15, 2026, is supported until January 28, 2027. For a regulated environment, pin to an LTS line and schedule upgrades within its support window. Build the upgrade calendar into your operating budget, because each upgrade needs testing of runners and workflows. Check the current release list on the Forgejo releases page before you commit to a version.

Will our existing GitHub Actions workflows run unchanged on Forgejo Actions?

Not without review. Forgejo Actions is designed to be familiar to GitHub Actions users, but it is not compatible with GitHub Actions, so workflows usually need edits. Forgejo reads workflows from .forgejo/workflows and falls back to .github/workflows when that directory is absent, which eases the first move. Expect to adjust workflows that depend on GitHub-only features, specific permission scopes, or actions that are only published on github.com. Forgejo's upgrade guide and Actions overview are the right places to check which constructs differ before you test. Run each critical pipeline in a staging repository and compare its output with the GitHub run before you cut over.

How do secrets and build history move when we leave GitHub Actions?

Secrets usually cannot be exported. GitHub's REST API returns Actions secret names without values, so you must re-create each secret in Forgejo from its source system and rotate credentials as part of the cutover. Build history is also time limited on GitHub, where artifacts default to 90 days, so export logs and artifacts through the API or GitHub CLI before retention expires. Plan this export early and record which runs must be preserved for audit. Your security team should decide how new secrets are scoped, stored and rotated on the self-hosted instance.

How DeployOpen helps you evaluate and move to Forgejo Actions

DeployOpen plans, implements, integrates, hardens, backs up and documents self-hosted platforms inside your own infrastructure, including your cloud accounts, data centers or air-gapped networks. For a Forgejo Actions decision, that usually starts with an evaluation scoped in writing before any work begins: which repositories and workflows are in play, which ones rely on GitHub-only features that Forgejo does not match, which secrets must be re-created by hand because GitHub never exports their values, and how much build history must be exported before GitHub retention windows close. Most engagements are fixed-scope, so the deliverables, timelines and acceptance checks are agreed in writing first, and a quote follows from that scope. DeployOpen does not publish a price list.

The migration work covers the forge and the CI layer together: installing and configuring Forgejo, moving repositories, placing workflows in .forgejo/workflows, reviewing where the fallback to .github/workflows is in use, and testing each workflow against the documented differences. Runner hardening is the part teams most often underestimate. A Forgejo Runner executes code from pull requests, so you need decisions on runner isolation, which jobs can reach production credentials, how runner registration tokens are issued and rotated, and where runner logs and artifacts are stored. DeployOpen can document those decisions and produce the configuration and evidence that your own auditors or assessors will request. DeployOpen prepares systems and evidence for compliance assessments but does not issue audit reports or certifications; independent auditors and certification bodies do that work.

After go-live, upgrades are the recurring cost. Forgejo publishes release dates and support windows, so the retainer question is how often your team wants to move to a new stable release versus a long-term support release, and who tests workflows before each upgrade. DeployOpen offers ongoing support, upgrades and continuous testing as retainers, which you can scope separately from the initial migration. Ask any implementation partner, including DeployOpen, to state in writing what is included in the fixed scope, what is excluded, who owns backups and restore tests, and what happens if a workflow needs more rework than the scope assumed.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.