blob: c13537952a8993188b468b21c695564e73f5c838 [file] [log] [blame]
name: CI
# To run on the GCP replace all 'ubuntu-latest' with 'self-hosted'
on:
# Runs on pushes to all but CID-latest-branches
# CID-latest branches automatically create PRs, let's just let the tests run on those
push:
# Runs on Pull Requests
pull_request:
# Runs every day at midnight UTC
schedule:
- cron: "0 0 * * *"
# Manual Dispatch
workflow_dispatch:
jobs:
docker_build:
runs-on: ubuntu-20.04
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
issue_regression_matrix: ${{ steps.set-matrix.outputs.issue_regression_matrix }}
steps:
- uses: actions/checkout@v2
# EXPORT BLOCK
- name: Export Repo URL
run: echo "REPO_URL=https://github.com/${{ github.repository }}.git" >> $GITHUB_ENV
- name: Export PDK ROOT
run: echo "PDK_ROOT=/usr/local/pdk" >> $GITHUB_ENV
- name: Export Branch Name
run: echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Export Temp Image Name
run: echo "OPENLANE_IMAGE_NAME=openlane:intermediate" >> $GITHUB_ENV
# END EXPORT BLOCK
- name: Check If Going To Push An Image To Docker
# # Uncomment the next line if you want to only build & push a container if entire test set succeeds
# if: needs.test.result == 'success'
# Ruby snippet to print 0 if this is a PR or if there is no DOCKERHUB_USER secret set, otherwise, 1
run: |
export PUSHING=$(ruby -e 'if ("${{ github.event_name }}" != "pull_request" && "${{ secrets.DOCKERHUB_USER }}" != ""); print(1) else print(0) end')
echo "PUSHING=$PUSHING" >> $GITHUB_ENV
- name: Login to DockerHub
if: ${{ env.PUSHING == '1' }}
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Docker Build
run: |
export BUILD_IF_CANT_PULL=1
if [ $PUSHING = '1' ]; then
export BUILD_IF_CANT_PULL_THEN_PUSH=1
fi
cd docker/ && make merge
- name: Build (or Get) PDK
run: |
sudo mkdir -p ${{ env.PDK_ROOT }}
sudo chown -R $USER:$USER ${{ env.PDK_ROOT }}
go get -u github.com/tcnksm/ghr
export PATH=$PATH:$(go env GOPATH)/bin
python3 -m pip install --upgrade --no-cache-dir volare
export OPDKS_VER="$(python3 ./dependencies/tool.py open_pdks -f commit)"
if [ "${{ secrets.VOLARE_REPO }}" != "" ]; then
volare enable_or_build\
--also-push\
--token ${{ secrets.MY_TOKEN }}\
--owner ${{ secrets.VOLARE_OWNER }}\
--repository ${{ secrets.VOLARE_REPO }}\
-j$(nproc)\
$OPDKS_VER
else
volare enable_or_build\
--token ${{ secrets.MY_TOKEN }}\
-j$(nproc)\
$OPDKS_VER
fi
- name: Export Docker Image
run: docker save -o /tmp/image.tar ${{ env.OPENLANE_IMAGE_NAME }}
- name: Upload Docker Image
uses: actions/upload-artifact@v2
with:
name: docker-image
path: /tmp/image.tar
- name: Tarball PDK
run: |
tar -cf /tmp/sky130A.tar -C $PDK_ROOT/sky130A .
- name: Upload PDK Tarball
uses: actions/upload-artifact@v2
with:
name: pdk-tarball
path: /tmp/sky130A.tar
- name: Determine If Running Extended Test Set
run: |
export EVENT_NAME=${{ github.event_name }};
python3 ./.github/scripts/determine_test_set.py
- name: Prepare Test Matrix
id: set-matrix
run: |
if [[ "$USE_ETS" = "1" ]]; then
echo "::set-output name=matrix::$(python3 ./.github/test_sets/get_test_matrix.py fastest_test_set extended_test_set)"
else
echo "::set-output name=matrix::$(python3 ./.github/test_sets/get_test_matrix.py fastest_test_set)"
fi
echo "::set-output name=issue_regression_matrix::$(python3 ./run_issue_regressions.py get_matrix)"
issue_regression_test:
needs: docker_build
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.docker_build.outputs.issue_regression_matrix) }}
name: Test Issue Regression ${{ matrix.design }}
steps:
- uses: actions/checkout@v2
# EXPORT BLOCK
- name: Export Repo URL
run: echo "REPO_URL=https://github.com/${{ github.repository }}.git" >> $GITHUB_ENV
- name: Export PDK ROOT
run: echo "PDK_ROOT=/usr/local/pdk" >> $GITHUB_ENV
- name: Export Branch Name
run: echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Export Temp Image Name
run: echo "OPENLANE_IMAGE_NAME=openlane:intermediate" >> $GITHUB_ENV
# END EXPORT BLOCK
- name: Download Docker Image
uses: actions/download-artifact@v2
with:
name: docker-image
path: /tmp
- name: Import Docker Image
run: docker load --input /tmp/image.tar
- name: Download PDK Tarball
uses: actions/download-artifact@v2
with:
name: pdk-tarball
path: /tmp
- name: Unpack PDK Tarball
run: |
sudo mkdir -p ${{ env.PDK_ROOT }}/sky130A
sudo chown -R $USER:$USER ${{ env.PDK_ROOT }}
tar -xf /tmp/sky130A.tar -C $PDK_ROOT/sky130A .
- name: Get Pyyaml
run: python3 -m pip install pyyaml
- name: Run Issue Regression Test
run: cd ${GITHUB_WORKSPACE}/ && make run_issue_regression ISSUE_REGRESSION_DESIGN=${{ matrix.design }}
# Each test has two components: a fast test set and an extended test set.
# The fast test set is run on all PRs, etc. The extended test set runs on schedule.
test:
needs: docker_build
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.docker_build.outputs.matrix) }}
name: Test Design ${{ matrix.design }}
steps:
- uses: actions/checkout@v2
# EXPORT BLOCK
- name: Export Repo URL
run: echo "REPO_URL=https://github.com/${{ github.repository }}.git" >> $GITHUB_ENV
- name: Export PDK ROOT
run: echo "PDK_ROOT=/usr/local/pdk" >> $GITHUB_ENV
- name: Export Branch Name
run: echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Export Temp Image Name
run: echo "OPENLANE_IMAGE_NAME=openlane:intermediate" >> $GITHUB_ENV
# END EXPORT BLOCK
- name: Download Docker Image
uses: actions/download-artifact@v2
with:
name: docker-image
path: /tmp
- name: Import Docker Image
run: docker load --input /tmp/image.tar
- name: Download PDK Tarball
uses: actions/download-artifact@v2
with:
name: pdk-tarball
path: /tmp
- name: Unpack PDK Tarball
run: |
sudo mkdir -p ${{ env.PDK_ROOT }}/sky130A
sudo chown -R $USER:$USER ${{ env.PDK_ROOT }}
tar -xf /tmp/sky130A.tar -C $PDK_ROOT/sky130A .
- name: Get Pyyaml
run: python3 -m pip install pyyaml
- name: Run Test
run: cd ${GITHUB_WORKSPACE}/ && python3 ${GITHUB_WORKSPACE}/.github/scripts/run_tests.py ${{ matrix.design }}
- name: Upload Run Tarball
if: ${{ always() }}
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.design }}
path: ./reproducible.tar.gz
cleanup_and_deploy:
name: Cleanup (and Possibly Deployment)
needs: [test, issue_regression_test]
if: always()
runs-on: ubuntu-20.04
steps:
- name: Check If Going To Push An Image To Docker
# # Uncomment the next line if you want to only build & push a container if entire test set succeeds
# if: needs.test.result == 'success'
# Ruby snippet to print 0 if this is a PR or if there is no DOCKERHUB_USER secret set, otherwise, 1
run: |
export PUSHING=$(ruby -e 'if ("${{ github.event_name }}" != "pull_request" && "${{ secrets.DOCKERHUB_USER }}" != ""); print(1) else print(0) end')
echo "PUSHING=$PUSHING" >> $GITHUB_ENV
- uses: actions/checkout@v2
if: ${{ env.PUSHING == '1' }}
with:
fetch-depth: 0
# EXPORT BLOCK
- name: Export Repo URL
run: echo "REPO_URL=https://github.com/${{ github.repository }}.git" >> $GITHUB_ENV
- name: Export PDK ROOT
run: echo "PDK_ROOT=/usr/local/pdk" >> $GITHUB_ENV
- name: Export Branch Name
run: echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Export Temp Image Name
run: echo "OPENLANE_IMAGE_NAME=openlane:intermediate" >> $GITHUB_ENV
# END EXPORT BLOCK
- name: Download Docker Image
if: ${{ env.PUSHING == '1' }}
uses: actions/download-artifact@v2
with:
name: docker-image
path: /tmp
- name: Delete Docker Image
uses: geekyeggo/delete-artifact@v1
with:
name: docker-image
- name: Delete PDK
uses: geekyeggo/delete-artifact@v1
with:
name: pdk-tarball
- name: Import Docker Image
if: ${{ env.PUSHING == '1' }}
run: docker load --input /tmp/image.tar
- name: Write Main Branch
if: ${{ env.PUSHING == '1' }}
run: |
echo "MAIN_BRANCH=${{ secrets.MAIN_BRANCH }}" >> $GITHUB_ENV
- name: Write Hash
run: |
echo "GIT_COMMIT_HASH=$(git rev-parse HEAD)" >> $GITHUB_ENV
- name: Create Tag (If scheduled or dispatched)
if: ${{ env.PUSHING == '1' && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && env.BRANCH_NAME == env.MAIN_BRANCH }}
run: cd ${GITHUB_WORKSPACE}/ && python3 ${GITHUB_WORKSPACE}/.github/scripts/generate_tag.py
- name: Tag Commit (If scheduled or dispatched)
if: ${{ env.PUSHING == '1' && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && env.NEW_TAG != 'NO_NEW_TAG' }}
uses: tvdias/github-tagger@v0.0.1
with:
tag: "${{ env.NEW_TAG }}"
repo-token: "${{ secrets.MY_TOKEN }}"
- name: Login to DockerHub
if: ${{ env.PUSHING == '1' }}
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Docker Push (Hash)
if: ${{ env.PUSHING == '1' && github.event_name == 'push' && env.BRANCH_NAME == env.MAIN_BRANCH }}
run: |
docker image tag ${{ env.OPENLANE_IMAGE_NAME }} ${{ secrets.DOCKER_IMAGE }}:${{ env.GIT_COMMIT_HASH }}
docker push ${{ secrets.DOCKER_IMAGE }}:${{ env.GIT_COMMIT_HASH }}
- name: Docker Push (Branch)
if: ${{ env.PUSHING == '1' && github.event_name == 'push' }}
run: |
docker image tag ${{ env.OPENLANE_IMAGE_NAME }} ${{ secrets.DOCKER_IMAGE }}:${{ env.BRANCH_NAME }}
docker push ${{ secrets.DOCKER_IMAGE }}:${{ env.BRANCH_NAME }}
- name: Docker Push (Tag) (If scheduled or dispatched)
if: ${{ env.PUSHING == '1' && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && env.NEW_TAG != 'NO_NEW_TAG' }}
run: |
docker image tag ${{ env.OPENLANE_IMAGE_NAME }} ${{ secrets.DOCKER_IMAGE }}:${{ env.NEW_TAG }}
docker image tag ${{ env.OPENLANE_IMAGE_NAME }} ${{ secrets.DOCKER_IMAGE }}:latest
docker push ${{ secrets.DOCKER_IMAGE }}:${{ env.NEW_TAG }}
docker push ${{ secrets.DOCKER_IMAGE }}:latest