Skip to content

Commit

Permalink
Unify CI from Travis and AppVeyor to GitHub Actions (#942)
Browse files Browse the repository at this point in the history
  • Loading branch information
max-vogler authored Sep 8, 2021
1 parent 166794f commit 8ad8a4d
Show file tree
Hide file tree
Showing 12 changed files with 399 additions and 378 deletions.
350 changes: 350 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,350 @@
name: Build
on: [push, pull_request]
env:
GCS_BUCKET: autobuilds.grr-response.com
GCS_BUCKET_OPENAPI: autobuilds-grr-openapi
GCS_LATEST_PATH: _latest_server_deb
DOCKER_REPOSITORY: grrdocker/grr
jobs:

test-ubuntu:
runs-on: ubuntu-18.04
env:
CHROME_DEB: google-chrome-stable_current_amd64.deb
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.7'
- name: Install
run: |
free -hmw
lscpu
sudo apt install -y libmysqlclient-dev
if [[ -z "$(type google-chrome 2>/dev/null)" ]]; then
wget "https://dl.google.com/linux/direct/${CHROME_DEB}" && sudo apt install -y "./${CHROME_DEB}";
fi
python -m venv "${HOME}/INSTALL"
travis/install.sh
- name: Test
run: |
source "${HOME}/INSTALL/bin/activate"
pip install pytest-xdist==2.2.1
# We have 4 vCPUs available, but only use 3 here to avoid timeouts like
# https://ci.appveyor.com/project/grr/grr-ia94e/builds/20483467/messages ,
# which happen when tests stall.
pytest --verbose -n 3 grr/ --ignore grr/server/grr_response_server/gui/selenium_tests/ --ignore grr/client/grr_response_client/client_actions/windows/
# jsTree tests seem to fail on Chrome 71 headless due to https://github.com/GoogleChrome/puppeteer/issues/3463
if [ $(google-chrome --version | grep -Eo " [0-9]{1,3}") != "71" ]; then (cd grr/server/grr_response_server/gui/static/ && npm run gulp test); fi
build-openapi:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.7'
- name: Install
run: |
sudo apt install -y libmysqlclient-dev
python -m venv "${HOME}/INSTALL"
travis/install.sh
- name: Build
run: |
source "${HOME}/INSTALL/bin/activate"
mkdir -p _openapi_artifacts/openapi_description
mkdir -p _openapi_artifacts/documentation
travis/build_api_documentation.sh "_openapi_artifacts/openapi_description/openapi_description.json" "_openapi_artifacts/documentation/openapi_documentation.html"
ls -la _openapi_artifacts/*
- name: Upload OpenAPI to GitHub artifacts
uses: actions/upload-artifact@v2
with:
name: openapi
path: _openapi_artifacts/
retention-days: 1

build-linux:
runs-on: ubuntu-18.04
env:
GCS_TAG: ubuntu_64bit
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.6'
- name: Set up
run: |
sudo apt install fakeroot debhelper libffi-dev libssl-dev
pip install virtualenv
virtualenv "${HOME}/INSTALL"
- name: Build
run: |
travis/install_client_builder.sh
travis/build_templates.sh
ls -la gcs_upload_dir
- name: Upload installers to GitHub artifacts
uses: actions/upload-artifact@v2
with:
name: ubuntu-installers
path: gcs_upload_dir/
retention-days: 1

build-osx:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.6'
- name: Set up
run: |
pip install --upgrade setuptools virtualenv
virtualenv "${HOME}/INSTALL"
- name: Build installers
run: |
travis/install_client_builder.sh
travis/build_templates.sh
ls -la gcs_upload_dir
- name: Upload installers to GitHub artifacts
uses: actions/upload-artifact@v2
with:
name: osx-installers
path: gcs_upload_dir/
retention-days: 1

build-centos:
runs-on: ubuntu-18.04
env:
GCS_TAG: centos_64bit
DOCKER_IMG: grrdocker/centos7
DOCKER_CONTAINER: centos_64bit_container
DOCKER_USER: grrbot
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.6'
- name: Build installers
run: |
sudo docker run -dit \
--volume "${PWD}:/mnt/grr" \
--workdir /mnt/grr \
--env DOCKER_USER="${DOCKER_USER}" \
--env TRAVIS_OS_NAME="linux" \
--name "${DOCKER_CONTAINER}" \
"${DOCKER_IMG}"
sudo docker exec "${DOCKER_CONTAINER}" travis/set_up_test_user.sh
sudo docker exec --user "${DOCKER_USER}" "${DOCKER_CONTAINER}" /usr/local/bin/python3.6 -m venv "/home/${DOCKER_USER}/INSTALL"
sudo docker exec --user "${DOCKER_USER}" "${DOCKER_CONTAINER}" travis/install_client_builder.sh
sudo docker exec --user "${DOCKER_USER}" "${DOCKER_CONTAINER}" travis/build_templates.sh
sudo docker exec "${DOCKER_CONTAINER}" rpm -vih gcs_upload_dir/*.rpm
ls -la gcs_upload_dir
- name: Upload installers to GitHub artifacts
uses: actions/upload-artifact@v2
with:
name: centos-installers
path: gcs_upload_dir/
retention-days: 1

build-windows:
runs-on: windows-2016
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.7'
- name: Build installers
shell: bash
run: |
set -ex
pip install virtualenv wheel
python -u appveyor/windows_templates/build_windows_templates.py --grr_src=$GITHUB_WORKSPACE --output_dir=$GITHUB_WORKSPACE/output --test_repack_install
python -u appveyor/windows_templates/build_windows_templates.py --grr_src=$GITHUB_WORKSPACE --output_dir=$GITHUB_WORKSPACE/output_msi --test_repack_install --build_msi
mkdir -p gcs_upload_dir
mv -v output*/* gcs_upload_dir
ls -la gcs_upload_dir
- name: Upload installers to GitHub artifacts
uses: actions/upload-artifact@v2
with:
name: windows-installers
path: gcs_upload_dir/
retention-days: 1

build-server-deb:
runs-on: ubuntu-18.04
env:
GCS_TAG: server_deb
needs:
- build-centos
- build-linux
- build-osx
- build-windows
steps:
- uses: actions/checkout@v2
- name: Download installers from GitHub artifacts
id: download
uses: actions/download-artifact@v2
with:
path: ~/_artifacts
- name: Set up
run: |
sudo apt-get install -y fakeroot debhelper libffi-dev libssl-dev python3-dev python3-pip python3-venv wget openjdk-8-jdk zip git devscripts dh-systemd libmysqlclient-dev dh-virtualenv dh-make libc6-i386 lib32z1
pip3 install --upgrade setuptools virtualenv
virtualenv "${HOME}/INSTALL"
- name: Build
run: |
travis/install.sh
mkdir -p grr/config/grr_response_templates/templates
mv -v ~/_artifacts/windows-installers/GRR_*_amd64.exe.zip grr/config/grr_response_templates/templates
mv -v ~/_artifacts/windows-installers/GRR_*_amd64.msi.zip grr/config/grr_response_templates/templates
mv -v ~/_artifacts/ubuntu-installers/grr_*_amd64.deb.zip grr/config/grr_response_templates/templates
mv -v ~/_artifacts/centos-installers/grr_*_amd64.rpm.zip grr/config/grr_response_templates/templates
mv -v ~/_artifacts/osx-installers/grr_*_amd64.xar.zip grr/config/grr_response_templates/templates
travis/build_local_pyindex.sh
travis/build_server_deb.sh
ls -la gcs_upload_dir
- name: Upload installers to GitHub artifacts
uses: actions/upload-artifact@v2
with:
name: server-deb
path: gcs_upload_dir/
retention-days: 1

test-ubuntu-e2e:
continue-on-error: true # Debug follow up step.
runs-on: ubuntu-18.04
env:
GRR_ADMIN_PASS: 'e2e_tests'
APPVEYOR_MYSQL_PASS: 'root'
needs:
- build-server-deb
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.6'
- name: Set up MySQL
run: |
sudo /etc/init.d/mysql start
- name: Download installers from GitHub artifacts
id: download
uses: actions/download-artifact@v2
with:
name: server-deb
path: _artifacts
- name: Install
run: |
free -hmw
lscpu
sudo apt install -y libmysqlclient-dev
if [[ -z "$(type google-chrome 2>/dev/null)" ]]; then
wget "https://dl.google.com/linux/direct/${CHROME_DEB}" && sudo apt install -y "./${CHROME_DEB}";
fi
python -m venv "${HOME}/INSTALL"
travis/install.sh
sudo -EH ./appveyor/e2e_tests/install_mem_usage_cron.sh
sudo -EH ./appveyor/e2e_tests/install_latest_server_deb.sh
- name: Test
run: |
sudo -EH ./appveyor/e2e_tests/run_e2e_tests.sh
sudo -EH ./appveyor/e2e_tests/test_repack.sh
./appveyor/e2e_tests/upload_e2e_artifacts.sh
- name: Upload logs and configs to GitHub artifacts
uses: actions/upload-artifact@v2
with:
name: e2e-test
path: appveyor_e2e_artifacts/
retention-days: 1


build-push-docker:
runs-on: ubuntu-18.04
needs:
- build-server-deb
# - test-ubuntu-e2e # TODO: Comment back in after debugging is finished.
- test-ubuntu
- build-openapi
steps:
- uses: actions/checkout@v2
- name: Download installers from GitHub artifacts
id: download
uses: actions/download-artifact@v2
with:
name: server-deb
path: _artifacts
- name: Build Docker image
run: |
export BRANCH=$(echo $GITHUB_REF | cut -d'/' -f 3)
./appveyor/docker_build/build_docker_image.sh
- if: ${{ github.event_name == 'push' }}
name: Log in to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- if: ${{ github.event_name == 'push' }}
name: Push to ${{ env.DOCKER_REPOSITORY }}
run: |
docker push ${{ env.DOCKER_REPOSITORY }}
upload:
if: ${{ github.event_name == 'push' }}
runs-on: ubuntu-18.04
needs:
- build-push-docker
steps:
- uses: actions/checkout@v2
- name: Download installers from GitHub artifacts
id: download
uses: actions/download-artifact@v2
with:
path: _artifacts
- run: |
ls -la _artifacts/*/
COMMIT_TIME=$(git show -s --date='format-local:%Y-%m-%dT%H:%M:%SZ' --format="%cd" $GITHUB_SHA)
OUTPUT_DIR=gcs_upload_dir/${COMMIT_TIME}_${GITHUB_SHA}/
echo "OUTPUT_DIR=$OUTPUT_DIR" >> $GITHUB_ENV
mkdir -p $OUTPUT_DIR/centos/
mv -v _artifacts/centos-installers/* $OUTPUT_DIR/centos
mkdir -p $OUTPUT_DIR/ubuntu/
mv -v _artifacts/ubuntu-installers/* $OUTPUT_DIR/ubuntu
mkdir -p $OUTPUT_DIR/osx/
mv -v _artifacts/osx-installers/* $OUTPUT_DIR/osx
mkdir -p $OUTPUT_DIR/windows/
mv -v _artifacts/windows-installers/* $OUTPUT_DIR/windows
mkdir -p $OUTPUT_DIR/server_deb/
mv -v _artifacts/server-deb/* $OUTPUT_DIR/server_deb
- name: Set up Cloud SDK
uses: google-github-actions/[email protected]
with:
project_id: ${{ secrets.GCP_PROJECT_ID }}
service_account_key: ${{ secrets.GCP_SA_KEY }}
export_default_credentials: true
- name: Upload installers to GCS
uses: google-github-actions/upload-cloud-storage@main
with:
path: gcs_upload_dir/
destination: ${{ env.GCS_BUCKET }}
# Omit `path` (e.g. /home/runner/deploy/) in final GCS path.
parent: false
- name: Replace ${{ env.GCS_LATEST_PATH }} folder in GCS
run: |
gsutil rm gs://${{ env.GCS_BUCKET }}/${{ env.GCS_LATEST_PATH }}/** || true
gsutil cp -r $OUTPUT_DIR/server_deb/* gs://${{ env.GCS_BUCKET }}/${{ env.GCS_LATEST_PATH }}/
- name: Upload OpenAPI to GCS
uses: google-github-actions/upload-cloud-storage@main
with:
path: _artifacts/openapi/
destination: ${{ env.GCS_BUCKET_OPENAPI }}
# Omit `path` (e.g. /home/runner/deploy/) in final GCS path.
parent: false
Loading

0 comments on commit 8ad8a4d

Please sign in to comment.