Skip to content

AutoMerge

AutoMerge #473901

Workflow file for this run

name: AutoMerge
on:
pull_request:
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request
types: [opened, reopened, labeled, synchronize]
schedule:
# The cron job is just a fallback.
# The "stopwatch" functionality that we have implemented should
# ensure that an AutoMerge merge job is run at least every 8 minutes.
# Therefore, it's sufficient for us to run the fallback job infrequently.
# We will choose to run the fallback job every 4 hours.
- cron: '0 */4 * * *'
workflow_dispatch:
env:
JULIA_PKG_USE_CLI_GIT: true
# We only need the merging token
# if we are on the master branch and running either a workflow dispatch
# (possibly from the stopwatch mechanism) or a scheduled job.
# See also the same logic inside RegistryCI:
# https://github.com/JuliaRegistries/RegistryCI.jl/blob/ee1d7cdb165202f4f3929a122c3188fbdd7afc16/src/AutoMerge/ciservice.jl#L53-L67
NEED_MERGE_TOKEN: ${{ github.ref == 'refs/heads/master' && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') }}
# We have three jobs:
# 1. AutoMerge-regular:
# This includes cron runs, workflow_dispatch runs, and all PR runs except PR labels.
# 2. AutoMerge-pr-label
# This only includes PR label runs.
# It is important to keep this job separate.
# If we don't keep this job separate, then any label action will override the main/regular
# AutoMerge job with a "skipped" AutoMerge job, thus making it very difficult for PR authors
# to view the CI logs (which they need to do if they e.g. want to figure out why `import MyPackageName`
# failed during the AutoMerge run.)
# 3. AutoMerge-stopwatch
jobs:
AutoMerge-regular:
# Run if:
# - not from a PR event
# - or it is from a PR event AND it is not from a fork AND we are not triggered by a label
# Note: since the label contains a colon, we need to use a workaround like https://github.com/actions/runner/issues/1019#issuecomment-810482716
# for the syntax to parse correctly.
if: "${{ github.event_name != 'pull_request' || (github.repository == github.event.pull_request.head.repo.full_name && (github.event.action != 'labeled')) }}"
timeout-minutes: 60
runs-on: ${{ matrix.os }}
concurrency:
# Skip intermediate builds: always.
# Cancel intermediate builds: only pull request builds
group: automerge-${{ github.ref }}
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
strategy:
matrix:
version:
- '1.11'
os:
- ubuntu-latest
arch:
- x64
steps:
# For debugging purposes, we print this value first
- name: Print env variable NEED_MERGE_TOKEN
run: echo "NEED_MERGE_TOKEN=$NEED_MERGE_TOKEN"
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: julia-actions/setup-julia@5c9647d97b78a5debe5164e9eec09d653d29bd71 # v2.6.1
with:
version: ${{ matrix.version }}
- name: Cache artifacts
uses: julia-actions/cache@d10a6fd8f31b12404a54613ebad242900567f2b9 # v2.1.0
- run: write(ENV["GITHUB_OUTPUT"], "manifest_version=$(VERSION.major).$(VERSION.minor)")
shell: julia --color=yes --project=.ci/ {0}
id: manifest_version
- run: echo "The manifest is .ci/Manifest-v${{ steps.manifest_version.outputs.manifest_version }}.toml"
- run: rm -rf .ci/Manifest.toml
- run: mv .ci/Manifest-v${{ steps.manifest_version.outputs.manifest_version }}.toml .ci/Manifest.toml
- run: rm -rf .ci/Manifest-*.toml
- run: chmod 400 .ci/Project.toml
- run: chmod 400 .ci/Manifest.toml
- run: julia --color=yes -e 'import Pkg; Pkg.Registry.add("General")'
env:
JULIA_PKG_SERVER: ""
- run: julia --color=yes -e 'import Pkg; Pkg.Registry.update()'
- run: .ci/instantiate.sh
- run: julia --color=yes --project=.ci/ -e 'import Pkg; Pkg.precompile()'
- name: AutoMerge.run
env:
MERGE_NEW_PACKAGES: true
MERGE_NEW_VERSIONS: true
AUTOMERGE_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# populate the actual token below only if `NEED_MERGE_TOKEN` is true, otherwise pass the empty string
# this uses the ternary syntax: https://docs.github.com/en/actions/learn-github-actions/expressions#example
AUTOMERGE_TAGBOT_TOKEN: ${{ env.NEED_MERGE_TOKEN == 'true' && secrets.TAGBOT_TOKEN || '' }}
JULIA_DEBUG: RegistryCI,AutoMerge
run: |
using RegistryCI
using Dates
RegistryCI.AutoMerge.run(
merge_new_packages = ENV["MERGE_NEW_PACKAGES"] == "true",
merge_new_versions = ENV["MERGE_NEW_VERSIONS"] == "true",
new_package_waiting_period = Day(3),
new_jll_package_waiting_period = Minute(20),
new_version_waiting_period = Minute(10),
new_jll_version_waiting_period = Minute(10),
registry = "JuliaRegistries/General",
tagbot_enabled = true,
authorized_authors = String["JuliaRegistrator"],
authorized_authors_special_jll_exceptions = String["jlbuild"],
suggest_onepointzero = false,
additional_statuses = String[],
additional_check_runs = String[],
check_license = true,
public_registries = String[
"https://github.com/HolyLab/HolyLabRegistry",
"https://github.com/cossio/CossioJuliaRegistry"
],
point_to_slack = true,
check_breaking_explanation = true,
)
shell: julia --color=yes --project=.ci/ {0}
AutoMerge-label:
# Run this job only if ALL of the following conditions are true:
# 1. It is from a PR event, AND
# 2. The PR is not from a fork, AND
# 3. We are being triggered by a label, AND
# 4. The label is one that affects the execution of the workflow
# Note: since the label contains a colon, we need to use a workaround like https://github.com/actions/runner/issues/1019#issuecomment-810482716
# for the syntax to parse correctly.
if: "${{ (github.event_name == 'pull_request') && (github.repository == github.event.pull_request.head.repo.full_name) && (github.event.action == 'labeled') && (github.event.label.name == 'Override AutoMerge: name similarity is okay' || github.event.label.name == 'Override AutoMerge: package author approved') }}"
timeout-minutes: 60
runs-on: ${{ matrix.os }}
concurrency:
# Skip intermediate builds: always.
# Cancel intermediate builds: only pull request builds
group: automerge-${{ github.ref }}
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
strategy:
matrix:
version:
- '1.11'
os:
- ubuntu-latest
arch:
- x64
steps:
# For debugging purposes, we print this value first
- name: Print env variable NEED_MERGE_TOKEN
run: echo "NEED_MERGE_TOKEN=$NEED_MERGE_TOKEN"
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: julia-actions/setup-julia@5c9647d97b78a5debe5164e9eec09d653d29bd71 # v2.6.1
with:
version: ${{ matrix.version }}
- name: Cache artifacts
uses: julia-actions/cache@d10a6fd8f31b12404a54613ebad242900567f2b9 # v2.1.0
- run: write(ENV["GITHUB_OUTPUT"], "manifest_version=$(VERSION.major).$(VERSION.minor)")
shell: julia --color=yes --project=.ci/ {0}
id: manifest_version
- run: echo "The manifest is .ci/Manifest-v${{ steps.manifest_version.outputs.manifest_version }}.toml"
- run: rm -rf .ci/Manifest.toml
- run: mv .ci/Manifest-v${{ steps.manifest_version.outputs.manifest_version }}.toml .ci/Manifest.toml
- run: rm -rf .ci/Manifest-*.toml
- run: chmod 400 .ci/Project.toml
- run: chmod 400 .ci/Manifest.toml
- run: julia --color=yes -e 'import Pkg; Pkg.Registry.add("General")'
env:
JULIA_PKG_SERVER: ""
- run: julia --color=yes -e 'import Pkg; Pkg.Registry.update()'
- run: .ci/instantiate.sh
- run: julia --color=yes --project=.ci/ -e 'import Pkg; Pkg.precompile()'
- name: AutoMerge.run
env:
MERGE_NEW_PACKAGES: true
MERGE_NEW_VERSIONS: true
AUTOMERGE_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# populate the actual token below only if `NEED_MERGE_TOKEN` is true, otherwise pass the empty string
# this uses the ternary syntax: https://docs.github.com/en/actions/learn-github-actions/expressions#example
AUTOMERGE_TAGBOT_TOKEN: ${{ env.NEED_MERGE_TOKEN == 'true' && secrets.TAGBOT_TOKEN || '' }}
JULIA_DEBUG: RegistryCI,AutoMerge
run: |
using RegistryCI
using Dates
RegistryCI.AutoMerge.run(
merge_new_packages = ENV["MERGE_NEW_PACKAGES"] == "true",
merge_new_versions = ENV["MERGE_NEW_VERSIONS"] == "true",
new_package_waiting_period = Day(3),
new_jll_package_waiting_period = Minute(20),
new_version_waiting_period = Minute(10),
new_jll_version_waiting_period = Minute(10),
registry = "JuliaRegistries/General",
tagbot_enabled = true,
authorized_authors = String["JuliaRegistrator"],
authorized_authors_special_jll_exceptions = String["jlbuild"],
suggest_onepointzero = false,
additional_statuses = String[],
additional_check_runs = String[],
check_license = true,
public_registries = String[
"https://github.com/HolyLab/HolyLabRegistry",
"https://github.com/cossio/CossioJuliaRegistry"
],
point_to_slack = true,
check_breaking_explanation = true,
)
shell: julia --color=yes --project=.ci/ {0}
AutoMerge-stopwatch:
timeout-minutes: 20
if: github.event_name != 'pull_request' || github.repository == github.event.pull_request.head.repo.full_name
environment: stopwatch
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: julia-actions/setup-julia@5c9647d97b78a5debe5164e9eec09d653d29bd71 # v2.6.1
with:
version: '1.11'
- name: Cache artifacts
uses: julia-actions/cache@d10a6fd8f31b12404a54613ebad242900567f2b9 # v2.1.0
- run: write(ENV["GITHUB_OUTPUT"], "manifest_version=$(VERSION.major).$(VERSION.minor)")
shell: julia --color=yes --project=.ci/ {0}
id: manifest_version
- run: rm -rf .ci/Manifest.toml
- run: mv .ci/Manifest-v${{ steps.manifest_version.outputs.manifest_version }}.toml .ci/Manifest.toml
- run: rm -rf .ci/Manifest-*.toml
- run: chmod 400 .ci/Project.toml
- run: chmod 400 .ci/Manifest.toml
- run: julia --color=yes -e 'import Pkg; Pkg.Registry.add("General")'
env:
JULIA_PKG_SERVER: ""
- run: julia --color=yes -e 'import Pkg; Pkg.Registry.update()'
- run: .ci/instantiate.sh
- run: julia --color=yes --project=.ci/ -e 'import Pkg; Pkg.precompile()'
- run: julia --project=.ci/ .ci/stopwatch.jl
env:
AUTOMERGE_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
AUTOMERGE_TAGBOT_TOKEN: ${{ secrets.TAGBOT_TOKEN }}