• Ivan Matkov's avatar
    Build Docker images locally when `Dockerfile`s change (#1161) · 1b3f124b
    Ivan Matkov authored
    Fixes [SKIKO-1103](https://youtrack.jetbrains.com/issue/SKIKO-1103)
    Properly handle Dockerfile changes in CI
    
    ### 1. Handle Dockerfile Changes in CI
    When a PR modifies both the `Dockerfile` and C++ source, CI must build
    the library against the **new** container logic before merging to catch
    compatibility issues.
    Workflows now detect `Dockerfile` changes and automatically build images
    locally before running tests. When no `Dockerfile` changes are detected,
    published images from `ghcr.io` are used.
    
    ### 2. Avoid GLIBC Mismatches: Run GitHub Actions Outside Containers
    Running GitHub Actions native steps (like `actions/checkout`) inside
    custom containers causes GLIBC version mismatches since GitHub's
    Node.js-based actions require newer GLIBC than Amazon Linux 2 provides.
    This change introduced new composite action `docker-skiko-run` that runs
    GitHub actions outside the container on `ubuntu-24.04` runner, and only
    executes build/test commands inside the Docker container via `docker
    run`.
    
    ### 3. Environment Alignment: Use `linux-compat` for GitHub Actions
    Builds
    GitHub Actions used Ubuntu 20.04 images with GLIBC 2.31, while TeamCity
    publishing used Amazon Linux 2 with GLIBC 2.26. This mismatch could mask
    GLIBC compatibility issues during PR validation.
    Most GitHub Actions workflows now use `linux-compat` (Amazon Linux 2).
    - Web builds are out of the scope here because emsdk requires newer
    GLIBC.
    - Cross-compilation is out of the scope because there is no simply way
    to get arm shared libraries to x64 image on AL2
    
    Note: TeamCity publishing should be updated to use `linux-compat` too
    
    ### 4. Introduce Orchestrator Workflows
    New orchestrator workflows compose existing test/build/docs workflows:
    - **`pull-request.yml`** - Runs on every PR: detects Docker changes,
    builds images if needed (dry-run), runs tests + publish dry run + docs
    validation
    - **`post-merge.yml`** - Runs on push to master/release: detects Docker
    changes, publishes images if changed, runs tests + publish dry run +
    docs publication
    
    So, we should have fewer "Run CI" temporary PRs now
    
    ### 5. Documentation as Pre-Merge Check
    Documentation builds now run inside the same `linux-compat` Docker
    environment used for library builds, and are validated as part of PR
    checks (previously only ran post-merge).
    
    
    ### 6. Docker Tags Use Branch Names
    Published Docker images are tagged with the branch name (e.g., `master`,
    `release/0.9.46`), so the release branches might publish its own version
    of the image. This way changes in `master` shouldn't prevent making a
    patch for a previous version if it's required
    1b3f124b
Name
Last commit
Last update
.github Loading commit data...
.run Loading commit data...
gradle/wrapper Loading commit data...
samples Loading commit data...
skiko Loading commit data...
.gitignore Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
CONTRIBUTING.md Loading commit data...
DEVELOPMENT.md Loading commit data...
LICENSE Loading commit data...
NOTICE Loading commit data...
README.md Loading commit data...
SECURITY.md Loading commit data...
dependencies.toml Loading commit data...
gradle.properties Loading commit data...
gradlew Loading commit data...
gradlew.bat Loading commit data...
settings.gradle.kts Loading commit data...