diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 000000000..b03f3ce9c --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,53 @@ +name: Deploy +on: + push: + tags: + - '*' + workflow_dispatch: + +jobs: + deploy: + name: Deploy + runs-on: ubuntu-latest + steps: + - name: Checkout twilio-csharp + uses: actions/checkout@v2 + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} + + # The expression strips off the shortest match from the front of the string to yield just the tag name as the output + - name: Get tagged version + run: echo "GITHUB_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + + - name: Build and Push image + run: make docker-build docker-push + + - name: Setup .NET Core SDK + uses: actions/setup-dotnet@v1.8.2 + with: + dotnet-version: '3.1.x' + + - name: Publish package to NuGet + run: dotnet nuget push **/*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://api.nuget.org/v3/index.json + + notify-on-failure: + name: Slack notify on failure + if: ${{ failure() }} + needs: [ deploy ] + runs-on: ubuntu-latest + steps: + - uses: rtCamp/action-slack-notify@v2 + env: + SLACK_COLOR: 'danger' + SLACK_ICON_EMOJI: ':github:' + SLACK_MESSAGE: ${{ format('Failed to deploy {1}{3} {0}/{1}/actions/runs/{2}', github.server_url, github.repository, github.run_id, ':') }} + SLACK_TITLE: Deployment Failure + SLACK_USERNAME: GitHub Actions + SLACK_MSG_AUTHOR: twilio-dx + SLACK_FOOTER: Posted automatically using GitHub Actions + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + MSG_MINIMAL: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..1b647e7f6 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,45 @@ +name: Tests +on: + push: + branches: [ '*' ] + pull_request: + branches: [ main ] + schedule: + # Run automatically at 8AM PST Monday-Friday + - cron: '0 15 * * 1-5' + workflow_dispatch: + +jobs: + tests: + name: Run Tests + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - name: Checkout twilio-csharp + uses: actions/checkout@v2 + + - name: Setup .NET Core SDK + uses: actions/setup-dotnet@v1.8.2 + with: + dotnet-version: '3.1.x' + + - name: Build & Test + run: make test release + + notify-on-failure: + name: Slack notify on failure + if: ${{ failure() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request' }} + needs: [ tests ] + runs-on: ubuntu-latest + steps: + - uses: rtCamp/action-slack-notify@v2 + env: + SLACK_COLOR: 'danger' + SLACK_ICON_EMOJI: ':github:' + SLACK_MESSAGE: ${{ format('Failed running build on {1}{3} {0}/{1}/actions/runs/{2}', github.server_url, github.repository, github.run_id, ':') }} + SLACK_TITLE: Build Failure + SLACK_USERNAME: GitHub Actions + SLACK_MSG_AUTHOR: twilio-dx + SLACK_FOOTER: Posted automatically using GitHub Actions + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + MSG_MINIMAL: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3877bc2f2..000000000 --- a/.travis.yml +++ /dev/null @@ -1,55 +0,0 @@ -language: csharp -solution: Twilio.sln -mono: latest -dotnet: 3.1 -services: -- docker -jobs: - allow_failures: - - name: Run Sonar analysis - include: - - language: csharp - name: Run Build - dotnet: 3.1 - script: - - make test - - make release - - if [[ "$TRAVIS_BRANCH" == "main" || "$TRAVIS_BRANCH" == "travis" ]] && [ "$TRAVIS_PULL_REQUEST" - == "false" ]; then echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" - --password-stdin; fi - - language: csharp - name: Run Sonar analysis - install: - - dotnet tool install --global dotnet-sonarscanner - before_script: - - export PATH=$PATH:/home/travis/.dotnet/tools - script: - - make cover - after_failure: - - tail --lines=1000 buildsonar.log -deploy: -- provider: script - script: make docker-build && make docker-push - skip_cleanup: true - on: - branch: main - tags: true -- provider: script - script: dotnet nuget push **/*.nupkg -k $NUGET_API_KEY -s https://api.nuget.org/v3/index.json - skip_cleanup: true - on: - branch: main - tags: true -notifications: - slack: - if: branch = main - on_pull_requests: false - on_success: never - on_failure: change - rooms: - secure: MoZ9nM/oIwiLOa8In+Dp9KpGVlHBTW5zGwJ8v5TgmOAdWPph0cP+8C4q/qR0s3UPejQflWA0u7g92Yr6X9eaPiGR5o/JGzTGW8hgW0bCylHLdxwEGSrbg3bPOFV2kyGYHVbiJHUNSwY/wQY6sdglD3xetviCN3u3bJQYixzPv3o= -addons: - sonarcloud: - organization: "twilio" - token: - secure: joJjKWVBI/QT7CS8Fd9xvJkI6vSp3QS+lBKP9JUlR+l470jtYWAeerxeKNMYhP+uehsh3qTz53aqPs6J0BwzV+cdCxepf575DKYdDNgREJh3AWNgOn2GGbRUkr+EQBl1zBDp8A7WLiV+l1Uno6l7uuTLHvcWPe/wMZgUhdNAC54= diff --git a/Makefile b/Makefile index 56085a226..4f3be7dc4 100644 --- a/Makefile +++ b/Makefile @@ -20,13 +20,12 @@ docs: API_DEFINITIONS_SHA=$(shell git log --oneline | grep Regenerated | head -n1 | cut -d ' ' -f 5) docker-build: docker build -t twilio/twilio-csharp . - docker tag twilio/twilio-csharp twilio/twilio-csharp:${TRAVIS_TAG} + docker tag twilio/twilio-csharp twilio/twilio-csharp:${GITHUB_TAG} docker tag twilio/twilio-csharp twilio/twilio-csharp:apidefs-${API_DEFINITIONS_SHA} docker tag twilio/twilio-csharp twilio/twilio-csharp:latest docker-push: - echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin - docker push twilio/twilio-csharp:${TRAVIS_TAG} + docker push twilio/twilio-csharp:${GITHUB_TAG} docker push twilio/twilio-csharp:apidefs-${API_DEFINITIONS_SHA} docker push twilio/twilio-csharp:latest diff --git a/README.md b/README.md index 18d5e9e47..6f8448d8d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # twilio-csharp -[![Build status](https://travis-ci.com/twilio/twilio-csharp.svg?branch=main)](https://travis-ci.com/twilio/twilio-csharp.svg?branch=main) +[![Test](https://github.com/twilio/twilio-csharp/actions/workflows/test.yml/badge.svg)](https://github.com/twilio/twilio-csharp/actions/workflows/test.yml) [![NuGet](https://img.shields.io/nuget/v/Twilio.svg)](https://www.nuget.org/packages/Twilio) [![Learn with TwilioQuest](https://img.shields.io/static/v1?label=TwilioQuest&message=Learn%20to%20contribute%21&color=F22F46&labelColor=1f243c&style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAASFBMVEUAAAAZGRkcHBwjIyMoKCgAAABgYGBoaGiAgICMjIyzs7PJycnMzMzNzc3UoBfd3d3m5ubqrhfrMEDu7u739/f4vSb/3AD///9tbdyEAAAABXRSTlMAAAAAAMJrBrEAAAKoSURBVHgB7ZrRcuI6EESdyxXGYoNFvMD//+l2bSszRgyUYpFAsXOeiJGmj4NkuWx1Qeh+Ekl9DgEXOBwOx+Px5xyQhDykfgq4wG63MxxaR4ddIkg6Ul3g84vCIcjPBA5gmUMeXESrlukuoK33+33uID8TWeLAdOWsKpJYzwVMB7bOzYSGOciyUlXSn0/ABXTosJ1M1SbypZ4O4MbZuIDMU02PMbauhhHMHXbmebmALIiEbbbbbUrpF1gwE9kFfRNAJaP+FQEXCCTGyJ4ngDrjOFo3jEL5JdqjF/pueR4cCeCGgAtwmuRS6gDwaRiGvu+DMFwSBLTE3+jF8JyuV1okPZ+AC4hDFhCHyHQjdjPHUKFDlHSJkHQXMB3KpSwXNGJPcwwTdZiXlRN0gSp0zpWxNtM0beYE0nRH6QIbO7rawwXaBYz0j78gxjokDuv12gVeUuBD0MDi0OQCLvDaAho4juP1Q/jkAncXqIcCfd+7gAu4QLMACCLxpRsSuQh0igu0C9Svhi7weAGZg50L3IE3cai4IfkNZAC8dfdhsUD3CgKBVC9JE5ABAFzg4QL/taYPAAWrHdYcgfLaIgAXWJ7OV38n1LEF8tt2TH29E+QAoDoO5Ve/LtCQDmKM9kPbvCEBApK+IXzbcSJ0cIGF6e8gpcRhUDogWZ8JnaWjPXc/fNnBBUKRngiHgTUSivSzDRDgHZQOLvBQgf8rRt+VdBUUhwkU6VpJ+xcOwQUqZr+mR0kvBUgv6cB4+37hQAkXqE8PwGisGhJtN4xAHMzrsgvI7rccXqSvKh6jltGlrOHA3Xk1At3LC4QiPdX9/0ndHpGVvTjR4bZA1ypAKgVcwE5vx74ulwIugDt8e/X7JgfkucBMIAr26ndnB4UCLnDOqvteQsHlgX9N4A+c4cW3DXSPbwAAAABJRU5ErkJggg==)](https://twil.io/learn-open-source)