| 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 |