diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..9f8a776
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,130 @@
+---
+name: Build
+
+on: push
+
+jobs:
+ cloc:
+ name: CLOC
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
+
+ - name: Install cloc
+ run: sudo apt update && sudo apt install cloc -y
+
+ - name: Print lines of code
+ run: |
+ cloc --include-lang \
+ C#,SQL,Razor,"Bourne Shell",PowerShell,HTML,CSS,Sass,JavaScript,TypeScript \
+ --vcs git
+
+
+ build-artifacts:
+ name: Build artifacts
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
+
+ - name: Print environment
+ run: |
+ whoami
+ dotnet --info
+ echo "GitHub ref: $GITHUB_REF"
+ echo "GitHub event: $GITHUB_EVENT"
+
+ - name: Restore/Clean service
+ working-directory: ./src/KeyConnector
+ run: |
+ echo "Restore"
+ dotnet restore
+ echo "Clean"
+ dotnet clean -c "Release" -o obj/build-output/publish
+
+ - name: Publish service
+ working-directory: ./src/KeyConnector
+ run: |
+ echo "Publish"
+ dotnet publish -c "Release" -o obj/build-output/publish
+ cd obj/build-output/publish
+ zip -r KeyConnector.zip .
+ mv KeyConnector.zip ../../../
+ pwd
+ ls -atlh ../../../
+
+ - name: Upload service artifact
+ uses: actions/upload-artifact@82c141cc518b40d92cc801eee768e7aafc9c2fa2 # v2.3.1
+ with:
+ name: KeyConnector.zip
+ path: ./src/KeyConnector/KeyConnector.zip
+ if-no-files-found: error
+
+
+ build-docker:
+ name: Build Docker images
+ runs-on: ubuntu-20.04
+ needs: build-artifacts
+ env:
+ _SERVICE_NAME: key-connector
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
+
+ - name: Setup DCT
+ if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix'
+ uses: bitwarden/gh-actions/setup-docker-trust@a8c384a05a974c05c48374c818b004be221d43ff
+ with:
+ azure-creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
+ azure-keyvault-name: "bitwarden-prod-kv"
+
+ - name: Setup service name
+ id: setup
+ run: |
+ SERVICE_NAME="key-connector"
+ echo "SERVICE_NAME: $SERVICE_NAME"
+ echo "::set-output name=service_name::$SERVICE_NAME"
+
+ - name: Get build artifact
+ uses: actions/download-artifact@3be87be14a055c47b01d3bd88f8fe02320a9bb60 # v2.0.10
+ with:
+ name: KeyConnector.zip
+
+ - name: Setup build artifact
+ run: |
+ mkdir -p ./src/KeyConnector/obj/build-output/publish
+ unzip KeyConnector.zip \
+ -d ./src/KeyConnector/obj/build-output/publish
+
+ - name: Build Docker images
+ run: |
+ docker build -t ${{ env._SERVICE_NAME }} \
+ ./src/KeyConnector
+
+ - name: Tag and Push RC to Docker Hub
+ if: (github.ref == 'refs/heads/rc')
+ run: |
+ docker tag ${{ env._SERVICE_NAME }} \
+ bitwarden/${{ env._SERVICE_NAME }}:rc
+ docker push bitwarden/${{ env._SERVICE_NAME }}:rc
+
+ - name: Tag and Push Hotfix to Docker Hub
+ if: (github.ref == 'refs/heads/hotfix')
+ run: |
+ docker tag ${{ env._SERVICE_NAME }} \
+ bitwarden/${{ env._SERVICE_NAME }}:hotfix
+ docker push bitwarden/${{ env._SERVICE_NAME }}:hotfix
+
+ - name: Tag and Push Dev to Docker Hub
+ if: (github.ref == 'refs/heads/master')
+ run: |
+ docker tag ${{ env._SERVICE_NAME }} \
+ bitwarden/${{ env._SERVICE_NAME }}:dev
+ docker push bitwarden/${{ env._SERVICE_NAME }}:dev
+
+ - name: Log out of Docker and disable Docker Notary
+ if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix'
+ run: |
+ docker logout
+ echo "DOCKER_CONTENT_TRUST=0" >> $GITHUB_ENV
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..fd7a7e3
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,160 @@
+---
+name: Release
+
+on:
+ workflow_dispatch:
+ inputs: {}
+
+jobs:
+ setup:
+ name: Setup
+ runs-on: ubuntu-20.04
+ outputs:
+ release_version: ${{ steps.version.outputs.package }}
+ branch-name: ${{ steps.branch.outputs.branch-name }}
+ steps:
+ - name: Branch check
+ run: |
+ if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix" ]]; then
+ echo "==================================="
+ echo "[!] Can only release from the 'rc' or 'hotfix' branches"
+ echo "==================================="
+ exit 1
+ fi
+ - name: Checkout repo
+ uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
+
+ - name: Check Release Version
+ id: version
+ run: |
+ version=$( grep -o ".*" ./src/KeyConnector/KeyConnector.csproj | \
+ grep -o "[0-9]*\.[0-9]*\.[0-9]*")
+ previous_release_tag_version=$(
+ curl -sL https://api.github.com/repos/$GITHUB_REPOSITORY/releases/latest | jq -r ".tag_name"
+ )
+ if [ "v$version" == "$previous_release_tag_version" ]; then
+ echo "[!] Already released v$version. Please bump version to continue"
+ exit 1
+ fi
+ echo "::set-output name=package::$version"
+
+ - name: Get branch name
+ id: branch
+ run: |
+ BRANCH_NAME=$(basename ${{ github.ref }})
+ echo "::set-output name=branch-name::$BRANCH_NAME"
+
+ release-docker:
+ name: Build Docker images
+ runs-on: ubuntu-20.04
+ needs: setup
+ env:
+ _SERVICE_NAME: key-connector
+ _RELEASE_VERSION: ${{ needs.setup.outputs.release_version }}
+ _BRANCH_NAME: ${{ needs.setup.outputs.branch-name }}
+ steps:
+ - name: Print environment
+ run: |
+ whoami
+ docker --version
+ echo "GitHub ref: $GITHUB_REF"
+ echo "GitHub event: $GITHUB_EVENT"
+
+ - name: Setup DCT
+ id: setup-dct
+ uses: bitwarden/gh-actions/setup-docker-trust@a8c384a05a974c05c48374c818b004be221d43ff
+ with:
+ azure-creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
+ azure-keyvault-name: "bitwarden-prod-kv"
+
+ - name: Checkout repo
+ uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
+
+
+ - name: Pull latest selfhost image
+ run: docker pull bitwarden/$_SERVICE_NAME:$_BRANCH_NAME
+
+ - name: Tag version and latest
+ run: |
+ docker tag bitwarden/$_SERVICE_NAME:$_BRANCH_NAME bitwarden/$_SERVICE_NAME:$_RELEASE_VERSION
+ docker tag bitwarden/$_SERVICE_NAME:$_BRANCH_NAME bitwarden/$_SERVICE_NAME:latest
+
+ - name: List Docker images
+ run: docker images
+
+ - name: Push version and latest image
+ env:
+ DOCKER_CONTENT_TRUST: 1
+ DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }}
+ run: |
+ docker push bitwarden/$_SERVICE_NAME:$_RELEASE_VERSION
+ docker push bitwarden/$_SERVICE_NAME:latest
+
+ - name: Log out of Docker
+ run: docker logout
+
+
+ release-github:
+ name: Create GitHub Release
+ runs-on: ubuntu-20.04
+ needs: setup
+ steps:
+ - name: Create release
+ uses: ncipollo/release-action@40bb172bd05f266cf9ba4ff965cb61e9ee5f6d01 # v1.9.0
+ with:
+ commit: ${{ github.sha }}
+ tag: "v${{ needs.setup.outputs.release_version }}"
+ name: "Version ${{ needs.setup.outputs.release_version }}"
+ body: ""
+ token: ${{ secrets.GITHUB_TOKEN }}
+ draft: true
+
+
+ check-failures:
+ name: Check for failures
+ if: always()
+ runs-on: ubuntu-20.04
+ needs:
+ - release-docker
+ - release-github
+ - setup
+ steps:
+ - name: Check if any job failed
+ if: |
+ github.ref == 'refs/heads/master'
+ || github.ref == 'refs/heads/rc'
+ || github.ref == 'refs/heads/hotfix'
+ env:
+ RELEASE_DOCKER_STATUS: ${{ needs.release-docker.result }}
+ RELEASE_GITHUB_STATUS: ${{ needs.release-github.result }}
+ SETUP_STATUS: ${{ needs.setup.result }}
+ run: |
+ if [ "$RELEASE_DOCKER_STATUS" = "failure" ]; then
+ exit 1
+ elif [ "$RELEASE_GITHUB_STATUS" = "failure" ]; then
+ exit 1
+ elif [ "$SETUP_STATUS" = "failure" ]; then
+ exit 1
+ fi
+
+ - name: Login to Azure - Prod Subscription
+ uses: Azure/login@77f1b2e3fb80c0e8645114159d17008b8a2e475a
+ if: failure()
+ with:
+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
+
+ - name: Retrieve secrets
+ id: retrieve-secrets
+ uses: Azure/get-keyvault-secrets@80ccd3fafe5662407cc2e55f202ee34bfff8c403 # v1
+ if: failure()
+ with:
+ keyvault: "bitwarden-prod-kv"
+ secrets: "devops-alerts-slack-webhook-url"
+
+ - name: Notify Slack on failure
+ uses: act10ns/slack@e4e71685b9b239384b0f676a63c32367f59c2522 # v1.2.2
+ if: failure()
+ env:
+ SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }}
+ with:
+ status: ${{ job.status }}
diff --git a/src/KeyConnector/KeyConnector.csproj b/src/KeyConnector/KeyConnector.csproj
index bb42476..c560614 100644
--- a/src/KeyConnector/KeyConnector.csproj
+++ b/src/KeyConnector/KeyConnector.csproj
@@ -5,6 +5,7 @@
Bit.KeyConnector
bitwarden-KeyConnector
True
+ 1.0.0