Launchable: Temporarily remove Launchable integration from Compilations workflow
Currently, Launchable is unstable, which occationally causes workflow issues. Until this problem is fixed, we'll temporary disable Launchable in the Compilations workflow.
Launchable: Terminate Launchable CLI process quickly by sending singals to a process group
Sometimes, the timeout errors occurred in Compilations workflow, this is because Launchable CLI process was not terminated correctly. To address this issue, we'll send signals to a process group.
https://github.com/ruby/ruby/actions/runs/15614867686https://github.com/ruby/ruby/actions/runs/15662906947
Co-authored-by: Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
When Launchable in unstable, the round trip time takes a long time, which slows down CI execution. In this PR I configured the environment variable `LAUNCHABLE_COMMIT_TIMEOUT` to configure the timeout.
https://github.com/launchableinc/cli/pull/1015
When a Launchable server is unstable, a ReadTimeoutException occurs in the Launchable CLI. In such case, the Launchable CLI retries requests, which slows down CI execution. In this PR, I configured the environment variable SKIP_TIMEOUT_RETRY to disable retry attempts on requests(Link: https://github.com/launchableinc/cli/pull/992).
```
WARNING:urllib3.connectionpool:Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=15)")': /intake/organizations/ruby/workspaces/ruby/commits/collect/options
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=15)")': /intake/organizations/ruby/workspaces/ruby/commits/collect/options
WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=15)")': /intake/organizations/ruby/workspaces/ruby/commits/collect/options
HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Max retries exceeded with url: /intake/organizations/ruby/workspaces/ruby/commits/collect/options (Caused by ReadTimeoutError("HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=15)"))
Exception in thread "main" javax.net.ssl.SSLException: Connection reset
at sun.security.ssl.Alert.createSSLException(Alert.java:127)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:331)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:274)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:269)
at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1572)
at sun.security.ssl.SSLSocketImpl.access$400(SSLSocketImpl.java:73)
at sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:982)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at com.launchableinc.ingest.commits.CommitGraphCollector.transfer(CommitGraphCollector.java:131)
at com.launchableinc.ingest.commits.CommitIngester.run(CommitIngester.java:145)
at com.launchableinc.ingest.commits.CommitIngester.main(CommitIngester.java:72)
Suppressed: java.net.SocketException: Broken pipe (Write failed)
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:81)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:362)
... 25 more
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:464)
at sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:68)
at sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1350)
at sun.security.ssl.SSLSocketImpl.access$300(SSLSocketImpl.java:73)
at sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:966)
... 20 more
Couldn't get commit history from `/github/workspace/src`. Do you run command root of git-controlled directory? If not, please set a directory use by --source option.
HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=60)
Command '['java', '-jar', '/root/.local/pipx/venvs/launchable/lib/python3.10/site-packages/launchable/jar/exe_deploy.jar', 'ingest:commit', '-endpoint',
```
https://github.com/ruby/ruby/actions/runs/13572112090/job/37939529243
Currently, the Launchable team is developing a new feature to attach any logs. Attached log can be anything, such as system logs or stdout. Users can find these logs using any text search. Please note that this feature is a work in progress, so we can't use it yet.
I'm going to attach stdout and stderr as attached logs because they will be useful for finding interpreter bugs. When running tests, we sometimes see interpreter itself crash, and the stack is output to stderr. When debugging the cause of the issue, this feature is useful.
Currently, the `launchable record session` command is failing some workflows such as YJIT on macOS. This occurs because of word splitting, as explained in https://www.shellcheck.net/wiki/SC2086. This PR addresses the issue.
```
+ launchable record session --build refs_pull_12785_merge_5ac818aaf7402e232de6b3e1b078765da3dc6279 --observation --flavor os=macos-14 --flavor test_task=check --flavor test_opts=--enable-yjit --flavor workflow=YJIT macOS Arm64 --test-suite yjit-test-all
Usage: launchable record session [OPTIONS]
Try 'launchable record session --help' for help.
Error: Got unexpected extra arguments (macOS Arm64)
Error: Process completed with exit code 2.
```
https://github.com/ruby/ruby/actions/runs/13535324545/job/37825826044#step:10:354
@peterzhu2118 mentioned that "View workflow run" button is broken in Launchable. It's because invalid URL is sent from compilers/actions.yaml. Launchable CLI builds URL based on the environment variables. In those variables, GITHUB_SERVER_URL is not set in this case.
Hence, I set GITHUB_SERVER_URL in compilers/actions.yaml in this PR.
Launchable offers the Predictive Test Selection feature for speeding up CI execution. Predictive Test Selection leverages machine learning to identify the right tests to run for a specific code change. By analyzing data from past test runs and considering the changes being tested, Launchable determines which tests are most relevant.
To evaluate the list of tests that Launchable selects, I enable PTS observation mode. Please note that there is no impacts on CI execution.
* Use `launchable record session` command to split test sessions based on test suites.
* Use BTESTS env instead of RUBY_TESTOPTS for passing CLI option to `make btest`.
* Group Launchable logs
* Add several flavors to identify the relationship between test session and GH workflow.
`launchable verify` command is designed for checking if CLI has been configured successfully. We've already checked it, so we don't need calling this command anymore.