Hoppa till huvudinnehållet

fremforges provider för Terraform och OpenTofu

fremforges provider hanterar din organisations inställningar i fremforge från OpenTofu eller HashiCorp Terraform: autentiserings- och åtkomstpolicy, IP-tillåtelselistan, skannings- och skannerpolicy, oföränderliga releaser, signaturregler för images och paket, beroendeproxyn, paketåtkomst och registerrobotar.

Repon, team och regler för branchskydd är Forgejo-objekt och stannar hos communityns provider svalabs/forgejo, så som det beskrivs i Konfiguration som kod. De två providerna fungerar sida vid sida i samma konfiguration.

Installation

Providern publiceras på själva frem.sh, så båda CLI:erna installerar den utan extra konfiguration:

terraform {
  required_providers {
    fremforge = {
      source  = "frem.sh/fremforge/fremforge"
      version = "~> 0.1"
    }
  }
}

tofu init (eller terraform init) hittar registret på https://frem.sh/.well-known/terraform.json, laddar ned zip-filen för din plattform från cli.frem.sh och kontrollerar den mot SHA256SUMS, vars OpenPGP-signatur verifieras med fremforges releasenyckel. Det finns byggen för Linux och macOS (amd64, arm64) och Windows (amd64).

Releasenyckeln:

FingeravtryckAEA6 FE24 2C86 33F0 10C6 D4ED 9099 FD4F C1DC 23C4
Nyckel-id9099FD4FC1DC23C4
Publikt certifikathttps://frem.sh/_app/terraform/signing-key.asc

Den privata nyckeln lämnar aldrig fremforges plattform: varje release signeras av plattformen, och bara för providerns releasebygge.

Konfiguration

provider "fremforge" {
  # endpoint = "https://frem.sh/_app/api/v1"   # the default
}

Providern läser sin token från FREMFORGE_TOKEN. Använd en API-token för organisationen som du hanterar, skapad under Organisationens administration → API-token (frem.sh/<org>/_admin/api-tokens), med de scopes som dina resurser behöver. Ha en token med enbart läsbehörighet för plan och skrivscopet för jobbet som kör apply:

ResurserScope
Varje resurs på den här sidanpolicy:write
Enbart datakällorpolicy:read
fremforge_push_protection (läsning)findings:read

Resurser

Organisationsinställningar är singletons: varje organisation har dem alltid, och API:t har ingen borttagning. Varje argument är valfritt. Bara de argument som du anger skrivs; de övriga läses tillbaka till state och lämnas orörda, så en ändring som någon gör i konsolen av en inställning som du inte hanterar räknas inte som drift. Importera en singleton med organisationens slug.

ResursVad den hanterar
fremforge_auth_policyAutentiseringspolicy: tak för livslängden för PAT (0 = inget tak), scopes för PAT, signerade commits, nyckelfria signerare, SSH på eller av.
fremforge_ip_allowlistOrganisationens IP-tillåtelselista. En lista som tillämpas och inte innehåller den adress som CLI:t körs från avvisas av API:t; rulla ut en lista med audit_only = true först.
fremforge_operator_accessOm fremforges operatörer får hantera organisationens användare.
fremforge_email_domain_policyOm tillåtelselistan för e-postdomäner tillämpas.
fremforge_ssh_caSSH-certifikatutfärdaren. require_cert = true kräver en CA-nyckel i samma konfiguration.
fremforge_actions_policyActions bara på skyddade branches.
fremforge_artifact_retentionLagringstid för Actions-artefakter i dagar.
fremforge_sla_policyÅtgärdsfönster per allvarlighetsgrad (0 = inget).
fremforge_push_protectionVad en push gör när secret-skannern inte kan köras.
fremforge_immutabilityOföränderliga releaser och container-taggar. Planen varnar när releases slås på: det kan inte ångras för de releaser som publiceras medan det är påslaget.
fremforge_branch_protection_defaultsStandardvärdena som fremforge tillämpar på nya repon (inte en Forgejo-regel).
fremforge_sast_settings, fremforge_dependency_scan_settings, fremforge_image_scan_settings, fremforge_secret_scan_settings, fremforge_license_settingsSkannerinställningar, en resurs per skanner.
fremforge_image_signature_policyVilka image-signaturer som är betrodda vid hämtning och om en osignerad hämtning avvisas. Rulla ut med mode = "shadow".
fremforge_dependency_proxyInställningarna för organisationens beroendeproxy.
fremforge_package_signature_policyPaketpolicyns signaturregel (krav och betrodda signerare).
fremforge_package_access_defaultOrganisationens standardläge för paketåtkomst.

Varje singleton är också en datakälla med samma namn.

Samlingar har en riktig skapa- och ta bort-operation:

ResursImport-id
fremforge_email_domain<org>/<pattern> eller <org>/<id>
fremforge_scan_policy (en per skanner; iac_scan från 0.4.0)<org>/<scanner>
fremforge_package_access<org>/<type>/<name>
fremforge_package_access_team_grant<org>/<type>/<team>/<name>
fremforge_package_access_actions_grant<org>/<type>/<repository>/<name>
fremforge_package_protection_rule<org>/<rule id>
fremforge_registry_robot<org>/<robot id>
fremforge_secret_custom_pattern (från 0.3.0; repository från 0.7.0)<org>/<pattern id>
fremforge_iac_custom_check (från 0.4.0)<org>/<check id>
fremforge_ci_secret (från 0.9.0)<org>/<NAME> / <org>/<repository id>/<NAME>

Ett paketnamn kan innehålla / (ett npm-scope, en containersökväg), och därför kommer det sist i import-id:na.

Exempel

resource "fremforge_auth_policy" "this" {
  org                   = "acme"
  max_pat_lifetime_days = 30
  allow_user_pats       = false
  ssh_disabled          = true
}

resource "fremforge_ssh_ca" "this" {
  org          = "acme"
  ca_keys      = [file("ssh-ca.pub")]
  require_cert = true
}

resource "fremforge_scan_policy" "images" {
  org            = "acme"
  scanner        = "image_scan"
  mode           = "enforce"
  block_severity = "high"
}

Borttagna inställningar

Två inställningar togs bort från fremforge den 2026-10-14, eftersom de sparades men aldrig tillämpades: principal_policy på fremforge_ssh_ca och default_template_repo på fremforge_branch_protection_defaults. Sedan provider 0.1.1 är båda attributen föråldrade: providern varken skickar eller läser dem längre, så en konfiguration som fortfarande sätter dem fungerar och ger en ren plan, och tofu plan skriver ut en varning om att de är föråldrade. Ta bort dem från konfigurationen; ingenting ändras när du gör det. Se Branchskydd och SSH-certifikatutfärdare.

Med provider 0.1.0 misslyckas ett fremforge_ssh_ca-block vars enda argument är principal_policy med HTTP 400 (no-fields), och ett default_template_repo som inte är tomt avvisas med removed-setting. Uppgradera med tofu init -upgrade (eller terraform init -upgrade); version = "~> 0.1" hämtar 0.1.1.

Scoped CI-secrets: värdet hamnar aldrig i state

fremforge_ci_secret (från provider 0.9.0) hanterar en scoped CI-secret. Värdet är ett write-only-argument, value_wo: det skickas när secreten skapas och vid varje ändring (API:t ersätter värde och scope tillsammans), och det läses aldrig tillbaka och lagras aldrig i plan eller state. Write-only-argument kräver OpenTofu 1.11 eller Terraform 1.11 eller senare. Utelämna repository_id för hela organisationen; höj value_wo_version för att skriva ett nytt värde.

variable "deploy_key" {
  type      = string
  sensitive = true
  ephemeral = true
}

resource "fremforge_ci_secret" "deploy" {
  org              = "acme"
  name             = "DEPLOY_KEY"
  repository_id    = 42
  value_wo         = var.deploy_key
  value_wo_version = 1
  workflows        = ["deploy.yaml"]
  refs             = ["refs/heads/main"]
  events           = ["push", "workflow_dispatch"]
  environment      = "production"
}
  • Rotation: fremforge kan inte visa värdet, så ett nytt value_wo ensamt är ingen ändring. Höj value_wo_version för att skriva det.
  • Drift: en ändring av scope eller beskrivning gjord utanför din konfiguration visas i planen; en ändring av värdet gör det inte.
  • Att skapa tar aldrig över: finns det redan en secret med det namnet och repositoryt misslyckas apply och ber dig importera den.
  • Import: <org>/<NAME> för en secret för hela organisationen, <org>/<repository id>/<NAME> för en som är bunden till ett repository. Ange value_wo i konfigurationen före nästa apply.
  • Token-scopes: providerns token behöver ci-secrets:read och ci-secrets:write.

Scope-argumenten nekas innan någon begäran skickas när de skulle kunna vidga leveransen: en tom post, ett reserverat namn (FORGEJO_, GITHUB_, GITEA_) eller ett repository-id som inte är ett positivt tal.

Tokens för registerrobotar hamnar aldrig i state

API:t visar en registerrobots token en gång, när den utfärdas. Providern sparar den aldrig i state, i inget attribut. Den skriver token en gång, när API:t utfärdar den (när roboten skapas och varje gång du ändrar rotation), till filen som du anger i token_file, med läge 0600, och skriver aldrig över en befintlig fil:

resource "fremforge_registry_robot" "ci" {
  org        = "acme"
  name       = "ci-pull"
  access     = "read"
  token_file = "${path.module}/.robot-ci.token"
  rotation   = "2026-10"   # change to issue a new token; the old one is revoked at once
}

Utan token_file kastas token bort. Flytta undan filen innan du roterar igen.

Drift, import och destroy

  • Drift: plan -detailed-exitcode avslutas med 2 när en inställning som du hanterar har ändrats utanför din konfiguration; apply återställer den.
  • Import: import { to = fremforge_auth_policy.this; id = "acme" }, därefter skriver tofu plan -generate-config-out=generated.tf konfigurationen åt dig.
  • Destroy: för en singleton tar destroy bara bort den från state och ändrar ingenting i organisationen: att skriva standardvärden skulle i tysthet försvaga en säkerhetsinställning. Samlingar tas bort. fremforge_package_access tar bort paketets inställningar och varje behörighet som getts för det.

Flytta från modulen

Modulen förblir dokumenterad medan du flyttar. För varje inställning lägger du till providerns resurs, importerar den med organisationens slug, kontrollerar att plan inte visar några ändringar, tar sedan bort modulens argument och kör tofu state rm på dess restful_resource.

Så testar vi den

Varje resurs och datakälla körs genom det riktiga OpenTofu-CLI:t mot ett inspelat fremforge-API vid varje ändring: bara de argument som du anger skrivs, ändringar som inte hanteras ignoreras, drift i hanterade inställningar planeras, import läser tillbaka samma state och destroy beter sig som det beskrivs ovan.

De inställningar som är säkra att ändra i en delad organisation körs dessutom live mot en testorganisation varje natt: apply, en ren plan, en ändring via API:t, en plan som visar den, apply, import till ett nytt state, en ren plan, destroy, en tillbakaläsning och återställning av det ursprungliga värdet. Det gäller autentiseringspolicyn, SSH-CA:n, SLA-policyn och beroendeproxyns metadatafilter; paketåtkomst, skyddsregler och registerrobotar kördes live på samma sätt före releasen. IP-tillåtelselistan och signaturpolicyerna testas bara mot det inspelade API:t, eftersom en ändring av dem i en delad organisation skulle störa andra tester.