Skip to main content
Skyhook generates GitHub Actions workflows that build your images and deploy to your clusters. Those workflows need two things from you:
  1. A way to authenticate to your cloud provider — so they can push to your container registry and talk to your cluster’s Kubernetes API
  2. A way to write back to your Git repos — semver bumps on release, GitOps overlay updates, commits against a separate deployment repo
This page covers both. For what the workflows do and which actions they call, see CI/CD Configuration. For the secret/variable names as a cheat-sheet, see Secrets and variables reference.

Three GitHub integrations, three purposes

If you run through full onboarding you’ll set up as many as three separate GitHub integrations. They do different things — don’t install one and assume it covers the others:
IntegrationWhat it doesWhen you need itSet up with
GitHub Actions OIDCLets your CI/CD workflows authenticate to AWS, GCP, or Azure without long-lived keys.Every project that uses the generated workflows with a cloud provider.skyhook github setup
Deployment GitHub AppLets workflows push commits to a separate deployment repo (GitOps overlays, image-tag bumps). Issues short-lived App tokens, not user creds.Only if your Kubernetes manifests live in a different repo from your code.skyhook onboard deploy-auth
ArgoCD GitHub AppLets ArgoCD read your GitOps repo from inside the cluster. Completely separate from the one above.Only if you’re using GitOps with ArgoCD.skyhook onboard argocd configure-access — covered in GitOps with ArgoCD
Most teams using GitOps end up with all three. Most teams doing direct kubectl deploys from a single repo only need the first.

Cloud authentication

The recommended path for AWS and GCP is OIDC — GitHub Actions authenticates to your cloud provider with a short-lived token, no long-lived keys to rotate. The Skyhook CLI can set this up end-to-end.

Writing back to your repos

The workflows push commits back to Git for a few reasons: bumping a service’s VERSION file on release, writing new image tags into GitOps overlays, and (for services with a separate deployment repository) updating manifests in a repo other than the source repo. Each of those needs something more privileged than the default GITHUB_TOKEN.

Separate deployment repositories

If your Kubernetes manifests live in a different repo from your code, workflows need cross-repo access. Skyhook’s Deployment GitHub App is the recommended way — fine-grained permissions, auto-rotating tokens, and attribution under a bot identity instead of a user.

Protected branches

If your default branch is protected with required reviews, the workflow can’t push VERSION bumps or GitOps overlay updates with the built-in GITHUB_TOKEN — GitHub doesn’t grant it bypass permissions. The simplest fix is to use the GH_APP_ID/GH_APP_PK secrets from the Deployment GitHub App (recommended above) and allow that app to bypass branch protection under Repository settings → Branches → Branch protection rules → Allow specified actors to bypass required pull requests. As a fallback, you can use a PAT from a user with bypass permissions (organization admin, repository admin, or an explicit bypass actor):
  1. Create a PAT at https://github.com/settings/tokens with full repo access.
  2. Add it as an org or repo secret named GHA_PAT.
  3. Reference it in the checkout step of release.yml and (for GitOps) deploy.yml:
    - uses: actions/checkout@v6
      with:
        token: ${{ secrets.GHA_PAT }}
    
The generated workflows reference GHA_PAT automatically when it’s set, so step 3 isn’t needed if you’re on the current template.

Verify the setup

Once credentials are in place, trigger a run to confirm. From the service directory, use skyhook deploy to build and deploy to a safe environment:
skyhook deploy --env dev --build -y
Or push a commit to your default branch and watch the Release workflow run in GitHub Actions. If it fails on authentication, the CI/CD troubleshooting guide maps the common error messages back to the specific secret or variable that’s missing or misconfigured.