Deploy

Deploy the Compiler app to Kubernetes via Helm or integrate into your CI/CD pipeline.

Step 1: Prerequisites
Requirement Description
Log10x License Your license key (get one)
Helm Helm CLI installed (for k8s deployment)
kubectl Configured to access your cluster (for k8s deployment)
GitHub Token Personal access token with repo scope (create one)
Docker Credentials Registry credentials if pulling from private registries
Step 2: Choose Deployment Method

The Helm chart deploys a CronJob that periodically compiles symbols from source code and container images.

Best for: Scheduled symbol compilation in production environments.

Run the compiler as a post-build step to ensure symbol libraries stay synchronized with source code changes.

Best for: Event-driven compilation triggered by code commits.

Step 3: Add Helm Repository
helm repo add log10x https://log-10x.github.io/helm-charts

Verify the chart appears:

helm search repo log10x-cron

No Helm repository needed. The compiler runs directly via Docker image.

Step 4: Configure Application

Create a new file called my-compiler.yaml in your working directory. This Helm values file will be used in all subsequent steps.

my-compiler.yaml
# License key added to all pods via TENX_LICENSE env var
log10xLicense: "YOUR-LICENSE-KEY-HERE"

jobs:
  - name: compiler-job
    runtimeName: my-compiler            # Optional: identifies this instance
    schedule: "*/30 * * * *"            # Run every 30 minutes
    args:
      - "@apps/compiler"

Configuration is passed via environment variables and command-line arguments. See your CI platform's secrets management below.

Step 5: GitOps (optional)

Log10x uses GitOps to manage configuration centrally.

Setup steps:

  1. Fork the Config Repository
  2. Create a branch for your configuration
  3. Edit the app configuration to specify your source inputs and symbol outputs

Add GitHub credentials to your my-compiler.yaml:

my-compiler.yaml
jobs:
  - name: compiler-job
    # ... (previous config)

    github:
      config:
        token: "YOUR-GITHUB-TOKEN"
        repo: "YOUR-ACCOUNT/REPO-NAME"
        branch: "my-compiler-config"    # Optional: defaults to main

An Init Container pulls your config before each job run, ensuring always up-to-date configuration.

Pass the GitHub config via the @github argument:

'@github={"token": "$GH_TOKEN", "repo": "my-user/my-config"}'
Step 6: Configure Secrets

Store sensitive credentials in Kubernetes Secrets rather than plain files.

Important: Only add secrets for source repositories you've configured in your Compiler app configuration.

Create the secret:

kubectl create secret generic compiler-credentials \
  --from-literal=github-token=YOUR_GITHUB_TOKEN \
  --from-literal=docker-username=YOUR_DOCKER_USERNAME \
  --from-literal=docker-token=YOUR_DOCKER_TOKEN

Add secret references to your my-compiler.yaml:

my-compiler.yaml
jobs:
  - name: compiler-job
    # ... (previous config)

    extraEnv:
      # For GitHub source repositories
      - name: GH_TOKEN
        valueFrom:
          secretKeyRef:
            name: compiler-credentials
            key: github-token

      # For Docker registries
      - name: DOCKER_USERNAME
        valueFrom:
          secretKeyRef:
            name: compiler-credentials
            key: docker-username
      - name: DOCKER_TOKEN
        valueFrom:
          secretKeyRef:
            name: compiler-credentials
            key: docker-token

      # For Artifactory repositories
      # - name: ARTIFACTORY_TOKEN
      #   valueFrom:
      #     secretKeyRef:
      #       name: compiler-credentials
      #       key: artifactory-token

Configure secrets in your CI platform:

Secret Description
GH_TOKEN GitHub PAT with repo scope
DOCKER_USERNAME Container registry username
DOCKER_TOKEN Container registry token
ARTIFACTORY_TOKEN Artifactory token (if used)

Go to Settings > Secrets and variables > Actions > Secrets and add the secrets above.

Go to Settings > CI/CD > Variables and add the secrets above.

Go to Manage Jenkins > Credentials and add credential IDs: github-token, docker-username, docker-token.

Step 7: Deploy
helm install my-compiler log10x/log10x-cron -f my-compiler.yaml

Create .github/workflows/compile.yml:

name: 10x Compile

on:
  push:
    branches: [main]

jobs:
  compile:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run 10x Compiler
        run: |
          docker run --rm \
            -v $(pwd):/work \
            -e GH_TOKEN=${{ secrets.GH_TOKEN }} \
            -e DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }} \
            -e DOCKER_TOKEN=${{ secrets.DOCKER_TOKEN }} \
            ghcr.io/log-10x/pipeline-10x:latest \
            '@github={"token": "${{ secrets.GH_TOKEN }}", "repo": "my-user/my-config"}' \
            @apps/compiler

Create .gitlab-ci.yml:

stages:
  - compile

tenx_compile:
  stage: compile
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker run --rm \
        -e GH_TOKEN=$GH_TOKEN \
        -e DOCKER_USERNAME=$DOCKER_USERNAME \
        -e DOCKER_TOKEN=$DOCKER_TOKEN \
        ghcr.io/log-10x/pipeline-10x:latest \
        '@github={"token": "'$GH_TOKEN'", "repo": "my-user/my-config"}' \
        @apps/compiler

Create Jenkinsfile:

pipeline {
    agent any
    stages {
        stage('TenX Compile') {
            steps {
                withCredentials([
                    string(credentialsId: 'github-token', variable: 'GH_TOKEN'),
                    string(credentialsId: 'docker-username', variable: 'DOCKER_USERNAME'),
                    string(credentialsId: 'docker-token', variable: 'DOCKER_TOKEN')
                ]) {
                    sh '''
                        docker run --rm \
                          -e GH_TOKEN=$GH_TOKEN \
                          -e DOCKER_USERNAME=$DOCKER_USERNAME \
                          -e DOCKER_TOKEN=$DOCKER_TOKEN \
                          ghcr.io/log-10x/pipeline-10x:latest \
                          '@github={"token": "'$GH_TOKEN'", "repo": "my-user/my-config"}' \
                          @apps/compiler
                    '''
                }
            }
        }
    }
}
Step 8: Verify

Check the CronJob was created:

kubectl get cronjobs

Trigger a manual run to test:

kubectl create job --from=cronjob/compiler-job my-compiler-test

Check pod logs for errors:

kubectl logs -l job-name=my-compiler-test --tail=100

Check your CI pipeline logs for the compiler job output.

Verify no errors appear in the log file.

Check output files:

Verify symbol files were generated in your configured outputSymbolFolder and outputSymbolLibraryFile paths.

Quickstart Full Sample
my-compiler.yaml
log10xLicense: "YOUR-LICENSE-KEY-HERE"

jobs:
  - name: compiler-job
    runtimeName: my-compiler
    schedule: "*/30 * * * *"
    args:
      - "@apps/compiler"

    github:
      config:
        token: "YOUR-GITHUB-TOKEN"
        repo: "YOUR-ACCOUNT/REPO-NAME"
        branch: "my-compiler-config"

    extraEnv:
      - name: GH_TOKEN
        valueFrom:
          secretKeyRef:
            name: compiler-credentials
            key: github-token
      - name: DOCKER_USERNAME
        valueFrom:
          secretKeyRef:
            name: compiler-credentials
            key: docker-username
      - name: DOCKER_TOKEN
        valueFrom:
          secretKeyRef:
            name: compiler-credentials
            key: docker-token

See the Deploy step above for complete CI/CD configuration examples for GitHub Actions, GitLab CI, and Jenkins.