Auto merge of #27865 - servo:github-actions-dev, r=jdm

Add Github Actions workflow for mac/linux/windows builds
This commit is contained in:
bors-servo 2021-03-11 21:08:05 -05:00 committed by GitHub
commit 5dd0cba51d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 2020 additions and 15 deletions

1748
.github/workflows/main.yml vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -10,7 +10,10 @@ extern crate size_of_test;
use layout::Fragment; use layout::Fragment;
use layout::SpecificFragmentInfo; use layout::SpecificFragmentInfo;
#[cfg(debug_assertions)]
size_of_test!(test_size_of_fragment, Fragment, 176); size_of_test!(test_size_of_fragment, Fragment, 176);
#[cfg(not(debug_assertions))]
size_of_test!(test_size_of_fragment, Fragment, 152);
size_of_test!( size_of_test!(
test_size_of_specific_fragment_info, test_size_of_specific_fragment_info,
SpecificFragmentInfo, SpecificFragmentInfo,

View file

@ -21,7 +21,7 @@ mod build_gecko {
lazy_static! { lazy_static! {
pub static ref PYTHON: String = env::var("PYTHON3").ok().unwrap_or_else(|| { pub static ref PYTHON: String = env::var("PYTHON3").ok().unwrap_or_else(|| {
let candidates = if cfg!(windows) { let candidates = if cfg!(windows) {
["python3.exe"] ["python.exe"]
} else { } else {
["python3"] ["python3"]
}; };

View file

@ -0,0 +1,57 @@
# Copyright 2021 The Servo Project Developers. See the COPYRIGHT
# file at the top-level directory of this distribution.
#
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
# option. This file may not be copied, modified, or distributed
# except according to those terms.
import os.path
import sys
BASE = os.path.dirname(__file__.replace('\\', '/'))
sys.path.insert(0, os.path.join(
BASE, "..", "..", "components", "style", "properties", "Mako-1.1.2-py2.py3-none-any.whl"
))
from mako import exceptions # noqa
from mako.lookup import TemplateLookup # noqa
from mako.template import Template # noqa
def abort(message):
print(message, file=sys.stderr)
sys.exit(1)
def render(filename, **context):
try:
lookup = TemplateLookup(directories=[BASE],
input_encoding="utf8",
strict_undefined=True)
template = Template(open(os.path.join(BASE, filename), "rb").read(),
filename=filename,
input_encoding="utf8",
lookup=lookup,
strict_undefined=True)
# Uncomment to debug generated Python code:
# write("/tmp", "mako_%s.py" % os.path.basename(filename), template.code)
return template.render(**context)
except Exception:
# Uncomment to see a traceback in generated Python code:
# raise
abort(exceptions.text_error_template().render())
def main():
with open(os.path.join(".github", "workflows", "main.yml"), 'w') as f:
f.write(render(
'workflow.mako',
total_chunks=20,
REPOSITORY_NAME="${{ github.event.repository.name }}",
))
if __name__ == "__main__":
main()

194
etc/ci/workflow.mako Normal file
View file

@ -0,0 +1,194 @@
name: CI
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ "master", "github-actions-dev", "auto", "try", "try-linux", "try-mac" ]
pull_request:
branches: [ "master", "github-actions-dev" ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
env:
RUST_BACKTRACE: 1
SHELL: /bin/bash
jobs:
build-win:
name: Build (Windows)
runs-on: windows-2019
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 2
- name: Copy to C drive
run: cp D:\a C:\ -Recurse
- name: Bootstrap
working-directory: "C:\\a\\${ REPOSITORY_NAME }\\${ REPOSITORY_NAME }"
run: |
python -m pip install --upgrade pip virtualenv
python mach fetch
- name: Release build
working-directory: "C:\\a\\${ REPOSITORY_NAME }\\${ REPOSITORY_NAME }"
run: python mach build --release --media-stack=dummy
- name: Unit tests
working-directory: "C:\\a\\${ REPOSITORY_NAME }\\${ REPOSITORY_NAME }"
run: python mach test-unit --release
- name: Smoketest
working-directory: "C:\\a\\${ REPOSITORY_NAME }\\${ REPOSITORY_NAME }"
run: python mach smoketest --angle
build-mac:
name: Build (macOS)
runs-on: macos-10.15
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 2
- name: Bootstrap
run: |
python3 -m pip install --upgrade pip virtualenv
brew bundle install --verbose --no-upgrade --file=etc/taskcluster/macos/Brewfile
brew bundle install --verbose --no-upgrade --file=etc/taskcluster/macos/Brewfile-build
rm -rf /usr/local/etc/openssl
rm -rf /usr/local/etc/openssl@1.1
brew install openssl@1.1 gnu-tar
- name: Release build
run: |
export OPENSSL_INCLUDE_DIR="$(brew --prefix openssl)/include"
export OPENSSL_LIB_DIR="$(brew --prefix openssl)/lib"
export PKG_CONFIG_PATH="$(brew --prefix libffi)/lib/pkgconfig/"
export PKG_CONFIG_PATH="$(brew --prefix zlib)/lib/pkgconfig/:$PKG_CONFIG_PATH"
python3 ./mach build --release
- name: Smoketest
run: python3 ./mach smoketest
- name: Package binary
run: gtar -czf target.tar.gz target/release/servo target/release/*.dylib resources
- name: Archive binary
uses: actions/upload-artifact@v2
with:
name: release-binary-macos
path: target.tar.gz
% for chunk in range(1, total_chunks + 1):
# mac-wpt${chunk}:
# #needs: build-mac
# runs-on: macos-10.15
# steps:
# - uses: actions/checkout@v2
# with:
# fetch-depth: 2
# #- name: Download release binary
# # uses: actions/download-artifact@v2
# # with:
# # name: release-binary-macos
# - name: Fake build
# run: |
# wget https://joshmatthews.net/release-binary-macos.zip
# unzip release-binary-macos.zip
# - name: Prep test environment
# run: |
# brew install gnu-tar
# gtar -xzf target.tar.gz
# python3 -m pip install --upgrade pip virtualenv
# brew bundle install --verbose --no-upgrade --file=etc/taskcluster/macos/Brewfile
# - name: Smoketest
# run: python3 ./mach smoketest
# - name: Run tests
# run: |
# python3 ./mach test-wpt --release --processes=3 --timeout-multiplier=8 --total-chunks=${total_chunks} --this-chunk=${chunk} --log-raw=test-wpt.log --log-servojson=wpt-jsonsummary.log --always-succeed | cat
# python3 ./mach filter-intermittents wpt-jsonsummary.log --log-intermittents=intermittents.log --log-filteredsummary=filtered-wpt-summary.log --tracker-api=default --reporter-api=default
# - name: Archive logs
# uses: actions/upload-artifact@v2
# with:
# name: wpt${chunk}-logs-macos
# path: |
# test-wpt.log
# wpt-jsonsummary.log
# filtered-wpt-summary.log
# intermittents.log
% endfor
build-linux:
name: Build (Linux)
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 2
- name: Bootstrap
run: |
python3 -m pip install --upgrade pip virtualenv
sudo apt update
python3 ./mach bootstrap
- name: Release build
run: python3 ./mach build --release
- name: Package binary
run: tar -czf target.tar.gz target/release/servo resources
- name: Archive binary
uses: actions/upload-artifact@v2
with:
name: release-binary
path: target.tar.gz
% for chunk in range(1, total_chunks + 1):
# linux-wpt${chunk}:
# #needs: build-linux
# runs-on: ubuntu-20.04
# steps:
# - uses: actions/checkout@v2
# with:
# fetch-depth: 2
# #- name: Download release binary
# # uses: actions/download-artifact@v2
# # with:
# # name: release-binary
# - name: Fake build
# run: |
# wget https://joshmatthews.net/release-binary.zip
# unzip release-binary.zip
# - name: Prep test environment
# run: |
# tar -xzf target.tar.gz
# python3 -m pip install --upgrade pip virtualenv
# sudo apt update
# sudo apt install -qy --no-install-recommends libgl1 libssl1.1 libdbus-1-3 libxcb-xfixes0-dev libxcb-shape0-dev libunwind8 libegl1-mesa
# wget http://mirrors.kernel.org/ubuntu/pool/main/libf/libffi/libffi6_3.2.1-8_amd64.deb
# sudo apt install ./libffi6_3.2.1-8_amd64.deb
# python3 ./mach bootstrap-gstreamer
# - name: Run tests
# run: |
# python3 ./mach test-wpt --release --processes=2 --total-chunks=${total_chunks} --this-chunk=${chunk} --log-raw=test-wpt.log --log-servojson=wpt-jsonsummary.log --always-succeed | cat
# python3 ./mach filter-intermittents wpt-jsonsummary.log --log-intermittents=intermittents.log --log-filteredsummary=filtered-wpt-summary.log --tracker-api=default --reporter-api=default
# - name: Archive logs
# uses: actions/upload-artifact@v2
# with:
# name: wpt${chunk}-logs-linux
# path: |
# test-wpt.log
# wpt-jsonsummary.log
# filtered-wpt-summary.log
# intermittents.log
% endfor
build_result:
name: homu build finished
runs-on: ubuntu-latest
needs: ["build-win", "build-mac", "build-linux"]
steps:
- name: Mark the job as successful
run: exit 0
if: success()
- name: Mark the job as unsuccessful
run: exit 1
if: "!success()"

View file

@ -193,7 +193,9 @@ class MachCommands(CommandBase):
if not uwp: if not uwp:
uwp = target and 'uwp' in target uwp = target and 'uwp' in target
features += self.pick_media_stack(media_stack, target) media_stack = self.pick_media_stack(media_stack, target)
features += media_stack
has_media_stack = media_stack[0] == "media-gstreamer"
target_path = base_path = self.get_target_dir() target_path = base_path = self.get_target_dir()
if android: if android:
@ -650,15 +652,7 @@ class MachCommands(CommandBase):
for key in env: for key in env:
print((key, env[key])) print((key, env[key]))
if sys.platform == "win32": if sys.platform != "win32":
env.setdefault("CC", "clang-cl.exe")
env.setdefault("CXX", "clang-cl.exe")
if uwp:
env.setdefault("TARGET_CFLAGS", "")
env.setdefault("TARGET_CXXFLAGS", "")
env["TARGET_CFLAGS"] += " -DWINAPI_FAMILY=WINAPI_FAMILY_APP"
env["TARGET_CXXFLAGS"] += " -DWINAPI_FAMILY=WINAPI_FAMILY_APP"
else:
env.setdefault("CC", "clang") env.setdefault("CC", "clang")
env.setdefault("CXX", "clang++") env.setdefault("CXX", "clang++")
@ -725,6 +719,7 @@ class MachCommands(CommandBase):
status = 1 status = 1
# copy needed gstreamer DLLs in to servo.exe dir # copy needed gstreamer DLLs in to servo.exe dir
if has_media_stack:
print("Packaging gstreamer DLLs") print("Packaging gstreamer DLLs")
if not package_gstreamer_dlls(env, servo_exe_dir, target_triple, uwp): if not package_gstreamer_dlls(env, servo_exe_dir, target_triple, uwp):
status = 1 status = 1
@ -740,7 +735,7 @@ class MachCommands(CommandBase):
) )
assert os.path.exists(servo_exe_dir) assert os.path.exists(servo_exe_dir)
if not package_gstreamer_dylibs(servo_exe_dir): if has_media_stack and not package_gstreamer_dylibs(servo_exe_dir):
return 1 return 1
# On the Mac, set a lovely icon. This makes it easier to pick out the Servo binary in tools # On the Mac, set a lovely icon. This makes it easier to pick out the Servo binary in tools

View file

@ -609,6 +609,14 @@ install them, let us know by filing a bug!")
extra_path += [path.join(self.msvc_package_dir("ninja"), "bin")] extra_path += [path.join(self.msvc_package_dir("ninja"), "bin")]
extra_path += [self.msvc_package_dir("nuget")] extra_path += [self.msvc_package_dir("nuget")]
env.setdefault("CC", "clang-cl.exe")
env.setdefault("CXX", "clang-cl.exe")
if uwp:
env.setdefault("TARGET_CFLAGS", "")
env.setdefault("TARGET_CXXFLAGS", "")
env["TARGET_CFLAGS"] += " -DWINAPI_FAMILY=WINAPI_FAMILY_APP"
env["TARGET_CXXFLAGS"] += " -DWINAPI_FAMILY=WINAPI_FAMILY_APP"
arch = (target or host_triple()).split('-')[0] arch = (target or host_triple()).split('-')[0]
vcpkg_arch = { vcpkg_arch = {
"x86_64": "x64-windows", "x86_64": "x64-windows",