• 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
..
.run Loading commit data...
buildSrc Loading commit data...
ci Loading commit data...
docker Loading commit data...
gradle/wrapper Loading commit data...
import-generator Loading commit data...
karma.config.d Loading commit data...
src Loading commit data...
tools Loading commit data...
.gitignore Loading commit data...
RELEASE.md Loading commit data...
build-with-local-skia.sh Loading commit data...
build.gradle.kts Loading commit data...
gradle.properties Loading commit data...
gradlew Loading commit data...
gradlew.bat Loading commit data...
settings.gradle.kts Loading commit data...