Thanks to visit codestin.com
Credit goes to github.com

Skip to content

snapshot-master

snapshot-master #2223

name: snapshot-master
on:
schedule:
- cron: '30 18 * * *' # Daily at 18:30 UTC
repository_dispatch:
types:
- "make-snapshot"
- "snapshot-master"
workflow_dispatch:
inputs:
RUBY_PATCH_URL:
description: Patch URL
required: false
env:
TEST_BUNDLED_GEMS_ALLOW_FAILURES: "power_assert"
jobs:
make-snapshot:
runs-on: ubuntu-latest
env:
archname: snapshot-master
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./.github/actions/make-snapshot
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: Packages
path: pkg
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: Info
path: pkg/info
- name: Check pkg
run: |
set -x
ls -al pkg
7z x pkg/*.zip $archname/revision.h
cat $archname/revision.h
7z l pkg/*.zip $archname/ChangeLog
- name: Upload s3
run: |
set -x
for ext in .tar.gz .tar.xz .zip; do
aws s3 cp "pkg/$archname$ext" "s3://ftp.r-l.o/pub/ruby/snapshot/$archname$ext" --no-progress
curl -sS -X PURGE -H "Fastly-Soft-Purge:1" "https://cache.ruby-lang.org/pub/ruby/snapshot/$archname$ext"
done
for ext in .json .yml; do
aws s3 cp "pkg/info/info$ext" "s3://ftp.r-l.o/pub/ruby/snapshot/$archname$ext" --no-progress
curl -sS -X PURGE -H "Fastly-Soft-Purge:1" "https://cache.ruby-lang.org/pub/ruby/snapshot/$archname$ext"
done
env:
AWS_ACCESS_KEY_ID: ${{ secrets.FTP_R_L_O_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.FTP_R_L_O_AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: us-west-2
if: ${{ github.repository == 'ruby/actions' }}
- uses: ruby/action-slack@54175162371f1f7c8eb94d7c8644ee2479fcd375 # v3.2.2
with:
payload: |
{
"attachments": [{
"text": "${{ job.status }}: make-snapshot <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>",
"color": "danger"
}]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SNAPSHOT_SLACK_WEBHOOK_URL }}
if: failure()
ubuntu:
needs: make-snapshot
strategy:
matrix:
test_task: [check, test-bundler-parallel, test-bundled-gems]
os: [ubuntu-24.04, ubuntu-22.04]
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- run: env | sort
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- name: Dump job context
env:
JOB_CONTEXT: ${{ toJson(job) }}
run: echo "$JOB_CONTEXT"
- name: Dump steps context
env:
STEPS_CONTEXT: ${{ toJson(steps) }}
run: echo "$STEPS_CONTEXT"
- name: Dump runner context
env:
RUNNER_CONTEXT: ${{ toJson(runner) }}
run: echo "$RUNNER_CONTEXT"
- name: Dump strategy context
env:
STRATEGY_CONTEXT: ${{ toJson(strategy) }}
run: echo "$STRATEGY_CONTEXT"
- name: Dump matrix context
env:
MATRIX_CONTEXT: ${{ toJson(matrix) }}
run: echo "$MATRIX_CONTEXT"
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: Packages
path: pkg
- name: Extract
run: tar xf pkg/*.tar.xz
- name: Apply patch
run: |
set -x
curl -sSL "${RUBY_PATCH_URL}" -o ruby.patch
cd snapshot-*/
git apply ../ruby.patch
shell: bash
env:
RUBY_PATCH_URL: "${{ github.event.inputs.RUBY_PATCH_URL }}"
if: "${{ github.event.inputs.RUBY_PATCH_URL != '' }}"
- name: Install libraries
run: |
set -x
sudo apt-get update -q
sudo apt-get install --no-install-recommends -q -y build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev bison- autoconf-
- uses: ruby/setup-ruby@44511735964dcb71245e7e55f72539531f7bc0eb # v1.257.0
with:
ruby-version: 3.2
# test-bundled-gems requires executable host ruby
if: "${{ matrix.test_task == 'test-bundled-gems' }}"
- name: Fixed world writable dirs
run: |
mkdir -p $HOME/.local/share
mkdir -p $HOME/.cache/gem/specs
mkdir -p $HOME/.gnupg/crls.d/private-keys-v1.d/public-keys.d
mkdir -p $HOME/.bundle/cache
mkdir -p $HOME/.ssh
chmod a-w $HOME/.bundle
# chmod a-w $HOME
# allow to write $HOME and check stats of HOME around tests (see below)
chmod -v a-w $HOME/.config
sudo chmod -R a-w /usr/share
sudo bash -c 'IFS=:; for d in '"$PATH"'; do chmod -v a-w $d; done' || :
- name: Set ENV
run: |
echo "JOBS=-j$((1 + $(nproc --all)))" >> $GITHUB_ENV
- name: configure
run: cd snapshot-*/ && ./configure
- name: make
run: cd snapshot-*/ && make $JOBS
- name: Save stats of HOME
run: |
set -euxo pipefail
cd snapshot-*/
cat >test.rb <<'EOF'
require 'pathname'
require 'digest'
out = []
[
Dir.home,
].each do |dir|
Pathname(dir).each_child do |pn|
st = pn.stat
if st.file?
content = Digest::SHA1.hexdigest(pn.read)
elsif st.directory? && st.nlink <= 10
content = pn.children.map(&:basename).map(&:to_s).sort
end
out << [pn.to_s, "%o"%st.mode, st.nlink, st.uid, st.gid, st.size, content].to_s
rescue
out << [pn.to_s, $!.inspect].to_s
end
end
File.open("/tmp/stat-before-tests.txt", "w") do |io|
io.puts out.sort
end
EOF
make runruby
rm -f test.rb
- name: Tests
run: cd snapshot-*/ && make $JOBS -s ${{ matrix.test_task }}
env:
RUBY_TESTOPTS: "-q --tty=no"
- name: Diff stats of HOME
run: |
set -euxo pipefail
cd snapshot-*/
cat >test.rb <<'EOF'
require 'pathname'
require 'digest'
out = []
[
Dir.home,
].each do |dir|
Pathname(dir).each_child do |pn|
st = pn.stat
if st.file?
content = Digest::SHA1.hexdigest(pn.read)
elsif st.directory? && st.nlink <= 10
content = pn.children.map(&:basename).map(&:to_s).sort
end
out << [pn.to_s, "%o"%st.mode, st.nlink, st.uid, st.gid, st.size, content].to_s
rescue
out << [pn.to_s, $!.inspect].to_s
end
end
File.open("/tmp/stat-after-tests.txt", "w") do |io|
io.puts out.sort
end
EOF
make runruby
rm -f test.rb
diff -u /tmp/stat-before-tests.txt /tmp/stat-after-tests.txt
# leaked-globals since 2.7
- name: Leaked Globals
run: cd snapshot-*/ && make -s leaked-globals
if: matrix.test_task == 'check'
- name: make install without root privilege
run: cd snapshot-*/ && make $JOBS install DESTDIR="/tmp/destdir"
if: matrix.test_task == 'check'
- name: make install
run: cd snapshot-*/ && sudo make $JOBS install
if: matrix.test_task == 'check'
- name: ruby -v
run: /usr/local/bin/ruby -v
if: matrix.test_task == 'check'
- name: Show .local
run: find $HOME/.local -ls
- uses: ruby/action-slack@54175162371f1f7c8eb94d7c8644ee2479fcd375 # v3.2.2
with:
payload: |
{
"attachments": [{
"text": "${{ job.status }}: ${{ matrix.os }} / ${{ matrix.test_task }} <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>",
"color": "danger"
}]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SNAPSHOT_SLACK_WEBHOOK_URL }}
if: failure()
- name: Get ruby/ruby sha
id: ruby_sha
run: cd snapshot-*/ && ./ruby -e 'puts "sha=#{RUBY_REVISION}"' >> $GITHUB_OUTPUT
if: failure()
- uses: ruby/action-slack@54175162371f1f7c8eb94d7c8644ee2479fcd375 # v3.2.2
with:
payload: |
{
"ci": "GitHub Actions",
"env": "snapshot: ${{ matrix.os }} / ${{ matrix.test_task }}",
"url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}",
"commit": "${{ steps.ruby_sha.outputs.sha }}",
"branch": "master"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SIMPLER_ALERTS_URL }}
if: failure()
macos:
needs: make-snapshot
strategy:
matrix:
test_task: [check, test-bundled-gems]
os: [macos-13, macos-14, macos-15]
include:
- os: macos-14
test_task: test-bundler-parallel
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- run: env | sort
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- name: Dump job context
env:
JOB_CONTEXT: ${{ toJson(job) }}
run: echo "$JOB_CONTEXT"
- name: Dump steps context
env:
STEPS_CONTEXT: ${{ toJson(steps) }}
run: echo "$STEPS_CONTEXT"
- name: Dump runner context
env:
RUNNER_CONTEXT: ${{ toJson(runner) }}
run: echo "$RUNNER_CONTEXT"
- name: Dump strategy context
env:
STRATEGY_CONTEXT: ${{ toJson(strategy) }}
run: echo "$STRATEGY_CONTEXT"
- name: Dump matrix context
env:
MATRIX_CONTEXT: ${{ toJson(matrix) }}
run: echo "$MATRIX_CONTEXT"
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: Packages
path: pkg
- name: Extract
run: tar xf pkg/*.tar.xz
- name: Apply patch
run: |
set -x
curl -sSL "${RUBY_PATCH_URL}" -o ruby.patch
cd snapshot-*/
git apply ../ruby.patch
shell: bash
env:
RUBY_PATCH_URL: "${{ github.event.inputs.RUBY_PATCH_URL }}"
if: "${{ github.event.inputs.RUBY_PATCH_URL != '' }}"
- name: Install libraries
run: |
with_retry () {
"$@" || { sleep 5 && "$@"; } || { sleep 60 && "$@"; }
}
set -x
with_retry brew install gmp libffi [email protected] zlib autoconf automake libtool readline libyaml
- name: Set ENV
run: |
echo "JOBS=-j$((1 + $(sysctl -n hw.activecpu)))" >> $GITHUB_ENV
- name: configure
run: cd snapshot-*/ && ./configure --with-openssl-dir=$(brew --prefix [email protected]) --with-readline-dir=$(brew --prefix readline) --with-libyaml-dir=$(brew --prefix libyaml)
- name: make
run: cd snapshot-*/ && make $JOBS
- name: Tests
run: cd snapshot-*/ && make $JOBS -s ${{ matrix.test_task }}
env:
RUBY_TESTOPTS: "-q --tty=no"
RUBY_DEBUG_TEST_NO_REMOTE: "1"
# leaked-globals since 2.7
- name: Leaked Globals
run: cd snapshot-*/ && make -s leaked-globals
if: matrix.test_task == 'check'
- name: make install without root privilege
run: cd snapshot-*/ && make $JOBS install DESTDIR="/tmp/destdir"
if: matrix.test_task == 'check'
- name: make install
run: cd snapshot-*/ && sudo make $JOBS install
if: matrix.test_task == 'check'
- name: ruby -v
run: /usr/local/bin/ruby -v
if: matrix.test_task == 'check'
- uses: ruby/action-slack@54175162371f1f7c8eb94d7c8644ee2479fcd375 # v3.2.2
with:
payload: |
{
"attachments": [{
"text": "${{ job.status }}: ${{ matrix.os }} / ${{ matrix.test_task }} <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>",
"color": "danger"
}]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SNAPSHOT_SLACK_WEBHOOK_URL }}
if: failure()
windows:
needs: make-snapshot
strategy:
matrix:
include:
- os: 2022
vs: 2022
vcvars: '-vcvars_ver=14.2'
- os: 2025
vs: 2022
vcvars: '-vcvars_ver=14.2'
fail-fast: false
runs-on: windows-${{ matrix.os }}
defaults:
run:
shell: cmd
working-directory: build
name: Windows ${{ matrix.os }}
env:
GITPULLOPTIONS: --no-tags origin ${{github.ref}}
PATCH: C:\msys64\usr\bin\patch.exe
OS_VER: windows-${{ matrix.os }}
# see https://github.com/ruby/ruby/commit/9ff4399decef0036897d3cfb9ac2c710dea913ca
OPENSSL_MODULES: C:\vcpkg\installed\x64-windows\bin
steps:
- run: md build
working-directory:
- run: env | sort
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- name: Dump job context
env:
JOB_CONTEXT: ${{ toJson(job) }}
run: echo "$JOB_CONTEXT"
- name: Dump steps context
env:
STEPS_CONTEXT: ${{ toJson(steps) }}
run: echo "$STEPS_CONTEXT"
- name: Dump runner context
env:
RUNNER_CONTEXT: ${{ toJson(runner) }}
run: echo "$RUNNER_CONTEXT"
- name: Dump strategy context
env:
STRATEGY_CONTEXT: ${{ toJson(strategy) }}
run: echo "$STRATEGY_CONTEXT"
- name: Dump matrix context
env:
MATRIX_CONTEXT: ${{ toJson(matrix) }}
run: echo "$MATRIX_CONTEXT"
- uses: ruby/setup-ruby@44511735964dcb71245e7e55f72539531f7bc0eb # v1.257.0
with:
ruby-version: '3.1'
bundler: none
windows-toolchain: none
- uses: msys2/setup-msys2@fb197b72ce45fb24f17bf3f807a388985654d1f2 # v2.29.0
id: setup-msys2
with:
update: true
install: >-
patch
- name: patch path
shell: msys2 {0}
run: echo PATCH=$(cygpath -wa $(command -v patch)) >> $GITHUB_ENV
if: ${{ steps.setup-msys2.outcome == 'success' }}
- uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
path: C:\vcpkg\installed
key: ${{ runner.os }}-vcpkg-installed-${{ env.OS_VER }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-vcpkg-installed-${{ env.OS_VER }}-
${{ runner.os }}-vcpkg-installed-
- name: Install libraries with vcpkg
run: |
vcpkg --triplet x64-windows install libffi libyaml openssl readline zlib
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: Packages
path: pkg
- name: Extract
run: 7z x pkg/*.zip
working-directory:
- name: Apply patch
run: |
set -x
curl -sSL "${RUBY_PATCH_URL}" -o ruby.patch
cd snapshot-master/
git apply ../ruby.patch
shell: bash
env:
RUBY_PATCH_URL: "${{ github.event.inputs.RUBY_PATCH_URL }}"
if: "${{ github.event.inputs.RUBY_PATCH_URL != '' }}"
working-directory:
- uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
path: snapshot-*/.downloaded-cache
key: downloaded-cache
- name: setup env
# %TEMP% is inconsistent with %TMP% and test-all expects they are consistent.
# https://github.com/actions/virtual-environments/issues/712#issuecomment-613004302
run: |
if not "%VCVARS%" == "" goto :vcset
set VCVARS="C:\Program Files (x86)\Microsoft Visual Studio\${{ matrix.vs }}\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
if not exist %VCVARS% set VCVARS="C:\Program Files\Microsoft Visual Studio\${{ matrix.vs }}\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
:vcset
set | C:\msys64\usr\bin\sort > old.env
call %VCVARS% ${{ matrix.vcvars }}
set TMP=%USERPROFILE%\AppData\Local\Temp
set TEMP=%USERPROFILE%\AppData\Local\Temp
set /a TEST_JOBS=(15 * %NUMBER_OF_PROCESSORS% / 10) > nul
set | C:\msys64\usr\bin\sort > new.env
C:\msys64\usr\bin\comm -13 old.env new.env >> %GITHUB_ENV%
del *.env
- name: link libraries
run: |
for %%I in (C:\vcpkg\installed\x64-windows\bin\*.dll) do (
if not %%~nI == readline mklink %%~nxI %%I
)
- name: rename system OpenSSL libraries
run: |
for %%I in (libcrypto-1_1-x64 libssl-1_1-x64) do (
ren c:\Windows\System32\%%I.dll %%I.dll_
)
if: ${{ matrix.os == '2022' }}
- name: Configure
run: >-
../snapshot-master/win32/configure.bat --disable-install-doc
--with-opt-dir=C:/vcpkg/installed/x64-windows
- run: nmake incs
- run: nmake extract-extlibs
- run: nmake
env:
YACC: win_bison
- name: ruby -v
run: |
.\ruby -v
- run: nmake test
timeout-minutes: 5
- run: nmake test-all
env:
RUBY_TESTOPTS: -j${{env.TEST_JOBS}} --job-status=normal
timeout-minutes: 60
continue-on-error: ${{ matrix.continue-on-error || false }}
- run: nmake test-spec
timeout-minutes: 10
continue-on-error: ${{ matrix.continue-on-error || false }}
- uses: ruby/action-slack@54175162371f1f7c8eb94d7c8644ee2479fcd375 # v3.2.2
with:
payload: |
{
"attachments": [{
"text": "${{ job.status }}: ${{ env.OS_VER }} (vs${{ matrix.vs }}) <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>",
"color": "danger"
}]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SNAPSHOT_SLACK_WEBHOOK_URL }}
if: failure()
non_development:
needs: make-snapshot
runs-on: ubuntu-24.04
env:
ruby_prefix: /tmp/ruby-snapshot
steps:
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: Packages
path: pkg
- name: Extract
run: tar xf pkg/*.tar.xz
- name: Substitute patchlevel
run: |
set -x
cd snapshot-*/
sed -i.orig 's/^\( *# *define *RUBY_PATCHLEVEL\) *-.*/\1 0/' version.h
diff -u version.h.orig version.h || :
rm -f version.h.orig
- name: Install libraries
run: |
set -x
sudo apt-get update -q || :
sudo apt-get install --no-install-recommends -q -y build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev bison- autoconf-
- name: Set ENV
run: |
echo "JOBS=-j$((1 + $(nproc --all)))" >> $GITHUB_ENV
- name: configure
run: cd snapshot-*/ && ./configure --prefix="${ruby_prefix}"
- name: make
run: cd snapshot-*/ && make $JOBS
- name: Leaked Globals
run: cd snapshot-*/ && make -s leaked-globals
- name: make install
run: cd snapshot-*/ && make $JOBS install
- name: Set PATH
run: echo "PATH=${ruby_prefix}/bin:$PATH" >> $GITHUB_ENV
- name: Check patchlevel
id: check-patchlevel
run: |
exec "${ruby_prefix}/bin/ruby" -vx "$0"
#!ruby
puts "RUBY_PATCHLEVEL=#{RUBY_PATCHLEVEL.inspect}"
abort unless RUBY_PATCHLEVEL >= 0
working-directory: ${{ env.ruby_prefix }}
continue-on-error: true
- name: Check LOADPATH
id: check-loadpath
run: |
exec ${ruby_prefix}/bin/ruby -vx "$0"
#!ruby
paths = $:.grep(/\+/)
pp paths
abort unless paths.empty?
working-directory: ${{ env.ruby_prefix }}
continue-on-error: true
- name: Check pathnames
id: check-pathnames
run: |
! find -name '*+*' | grep +
working-directory: ${{ env.ruby_prefix }}
continue-on-error: true
- name: result
run: false
if: ${{ contains(steps.*.outcome, 'failure') }}