|
| 1 | +name: Deploy Connector |
| 2 | + |
| 3 | +on: |
| 4 | + workflow_dispatch: |
| 5 | + push: |
| 6 | + branches: |
| 7 | + - main |
| 8 | + paths: |
| 9 | + - 'deployment/**' |
| 10 | + pull_request: |
| 11 | + paths: |
| 12 | + - 'deployment/**' |
| 13 | + |
| 14 | +permissions: |
| 15 | + contents: read |
| 16 | + |
| 17 | +jobs: |
| 18 | + |
| 19 | + Deploy-Connector: |
| 20 | + defaults: |
| 21 | + run: |
| 22 | + working-directory: ./deployment |
| 23 | + |
| 24 | + env: |
| 25 | + CLUSTER_NAME: eonax-cluster |
| 26 | + DID_WEB: did:web:localhost:ih:did |
| 27 | + permissions: |
| 28 | + checks: write |
| 29 | + runs-on: ubuntu-latest |
| 30 | + steps: |
| 31 | + - uses: actions/checkout@v4 |
| 32 | + with: |
| 33 | + token: ${{ secrets.CICD_TOKEN }} |
| 34 | + |
| 35 | + - name: 'Setup Terraform' |
| 36 | + |
| 37 | + with: |
| 38 | + terraform_version: 1.6.0 |
| 39 | + terraform_wrapper: false |
| 40 | + |
| 41 | + - name: 'Create Kubernetes cluster' |
| 42 | + |
| 43 | + with: |
| 44 | + cluster_name: ${{ env.CLUSTER_NAME }} |
| 45 | + config: kind.config.yaml |
| 46 | + |
| 47 | + - name: 'Create Ingress Controller' |
| 48 | + shell: bash |
| 49 | + run: | |
| 50 | + kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml |
| 51 | + kubectl wait \ |
| 52 | + --namespace ingress-nginx \ |
| 53 | + --for=condition=ready pod \ |
| 54 | + --selector=app.kubernetes.io/component=controller \ |
| 55 | + --timeout=90s |
| 56 | +
|
| 57 | + - name: 'Install Vault and DB' |
| 58 | + working-directory: ./deployment/storage |
| 59 | + shell: bash |
| 60 | + run: | |
| 61 | + terraform init |
| 62 | + terraform apply -auto-approve |
| 63 | +
|
| 64 | + - name: 'Login to Docker registry' |
| 65 | + uses: docker/login-action@v3 |
| 66 | + with: |
| 67 | + username: ${{ secrets.DOCKER_USERNAME }} |
| 68 | + password: ${{ secrets.DOCKER_TOKEN }} |
| 69 | + |
| 70 | + - name: 'Pull Docker images and Helm charts' |
| 71 | + working-directory: ./deployment/connector |
| 72 | + shell: bash |
| 73 | + run: | |
| 74 | + for i in control-plane data-plane identity-hub; do \ |
| 75 | + image=eonax-$i-postgresql-hashicorpvault; \ |
| 76 | + |
| 77 | + ## pull the Docker image |
| 78 | + docker pull ${{ vars.DOCKER_REPO }}/$image:${{ vars.EONAX_VERSION }}; \ |
| 79 | + ## tag image with version latest |
| 80 | + docker tag ${{ vars.DOCKER_REPO }}/$image:${{ vars.EONAX_VERSION }} $image:latest; \ |
| 81 | + ## load image to the cluster |
| 82 | + kind load docker-image $image:latest --name ${{ env.CLUSTER_NAME }}; \ |
| 83 | + |
| 84 | + ## pull Helm charts |
| 85 | + chart=${i//-/}; \ |
| 86 | + helm pull ${{ vars.HELM_REPO }}/$chart --version ${{ vars.EONAX_VERSION }}; \ |
| 87 | + mv $chart-${{ vars.EONAX_VERSION }}.tgz $chart.tgz; \ |
| 88 | + done |
| 89 | +
|
| 90 | + - name: 'Download SQL files' |
| 91 | + shell: bash |
| 92 | + working-directory: ./deployment/connector |
| 93 | + run: | |
| 94 | + jq -r --arg version "${{ vars.EDC_VERSION }}" '.files[] | "https://raw.githubusercontent.com/eclipse-edc/\(.repo)/\($version)/\(.path)/src/main/resources/\(.file_name)"' sql.json | \ |
| 95 | + tr -d '\r' | \ |
| 96 | + while read -r url; do curl -o "./connector/sql/$(basename "$url")" "$url"; done |
| 97 | +
|
| 98 | + - name: 'Install connector' |
| 99 | + shell: bash |
| 100 | + working-directory: ./deployment/connector |
| 101 | + run: | |
| 102 | + terraform init |
| 103 | + terraform apply -auto-approve |
| 104 | +
|
| 105 | + - name: 'Generate keys' |
| 106 | + shell: bash |
| 107 | + run: | |
| 108 | + openssl genpkey -algorithm RSA -out private-key.pem -pkeyopt rsa_keygen_bits:2048 && \ |
| 109 | + openssl rsa -pubout -in private-key.pem -out public-key.pem && \ |
| 110 | + for k in public-key private-key; do VAULT_TOKEN=root VAULT_ADDR=http://localhost/vault vault kv put secret/$k content=@$k.pem; done |
| 111 | +
|
| 112 | + - name: 'Create participant context' |
| 113 | + shell: bash |
| 114 | + env: |
| 115 | + IH_RESOLUTION_URL: http://localhost/ih/resolution |
| 116 | + CP_DSP_URL: http://localhost/cp/dsp |
| 117 | + run: | |
| 118 | + didBase64Url=$(echo -n "$DID_WEB" | base64 | tr '+/' '-_' | tr -d '=') |
| 119 | +
|
| 120 | + curl -X POST -H "Content-Type: application/json" -d "$(cat <<EOF |
| 121 | + { |
| 122 | + "participantId": "${{ env.DID_WEB }}", |
| 123 | + "did": "${{ env.DID_WEB }}", |
| 124 | + "active": true, |
| 125 | + "key": { |
| 126 | + "keyId": "my-key", |
| 127 | + "privateKeyAlias": "private-key", |
| 128 | + "publicKeyPem": "$(awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' public-key.pem)" |
| 129 | + }, |
| 130 | + "serviceEndpoints": [ |
| 131 | + { |
| 132 | + "id": "credential-service-url", |
| 133 | + "type": "CredentialService", |
| 134 | + "serviceEndpoint": "$IH_RESOLUTION_URL/v1/participants/$didBase64Url" |
| 135 | + }, |
| 136 | + { |
| 137 | + "id": "dsp-url", |
| 138 | + "type": "DSPMessaging", |
| 139 | + "serviceEndpoint": "$CP_DSP_URL" |
| 140 | + } |
| 141 | + ] |
| 142 | + } |
| 143 | + EOF |
| 144 | + )" http://localhost/ih/identity/v1alpha/participants |
| 145 | +
|
| 146 | + - name: 'Add membership VC' |
| 147 | + shell: bash |
| 148 | + run: | |
| 149 | + didBase64Url=$(echo -n "$DID_WEB" | base64 | tr '+/' '-_' | tr -d '=') |
| 150 | +
|
| 151 | + curl -X POST -H "Content-Type: application/json" -d "$(cat <<EOF |
| 152 | + { |
| 153 | + "participantId": "${{ env.DID_WEB }}", |
| 154 | + "verifiableCredentialContainer": { |
| 155 | + "rawVc": "eyJraWQiOiJkaWQ6d2ViOmF1dGhvcml0eS1pZGVudGl0eWh1YiUzQTgzODM6YXBpOmRpZCNteS1rZXkiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJkaWQ6d2ViOmF1dGhvcml0eS1pZGVudGl0eWh1YiUzQTgzODM6YXBpOmRpZCIsInN1YiI6ImRpZDp3ZWI6cHJvdmlkZXItaWRlbnRpdHlodWIlM0E4MzgzOmFwaTpkaWQiLCJ2YyI6eyJjcmVkZW50aWFsU3ViamVjdCI6W3siaWQiOiJkaWQ6d2ViOnByb3ZpZGVyLWlkZW50aXR5aHViJTNBODM4MzphcGk6ZGlkIiwibmFtZSI6InByb3ZpZGVyIiwibWVtYmVyc2hpcCI6eyJtZW1iZXJzaGlwVHlwZSI6IkZ1bGxNZW1iZXIiLCJzaW5jZSI6IjIwMjMtMDEtMDFUMDA6MDA6MDBaIn19XSwiaWQiOiIzMTkxNWJjOC0wODhjLTQwZDYtYTAxNC03YTk4YmNkNzBiY2IiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiTWVtYmVyc2hpcENyZWRlbnRpYWwiXSwiaXNzdWVyIjp7ImlkIjoiZGlkOndlYjphdXRob3JpdHktaWRlbnRpdHlodWIlM0E4MzgzOmFwaTpkaWQiLCJhZGRpdGlvbmFsUHJvcGVydGllcyI6e319LCJpc3N1YW5jZURhdGUiOiIyMDI0LTA4LTE0VDE0OjMzOjQwWiIsImV4cGlyYXRpb25EYXRlIjpudWxsLCJjcmVkZW50aWFsU3RhdHVzIjpbXSwiZGVzY3JpcHRpb24iOm51bGwsIm5hbWUiOm51bGx9LCJpYXQiOjE3MjM2NDYwMjB9.FD4vjPomuKusPdyWlMRcOgbzUhGC7kyliw6My6HFrQzdAcKGC6N_BW-Cg4pHAX4f2O4EhFn5WJr-uB2UaZOHlQ", |
| 156 | + "format": "JWT", |
| 157 | + "credential": { |
| 158 | + "credentialSubject": [ |
| 159 | + { |
| 160 | + "id": "${{ env.DID_WEB }}", |
| 161 | + "name": "provider", |
| 162 | + "membership": { |
| 163 | + "membershipType": "FullMember", |
| 164 | + "since": "2023-01-01T00:00:00Z" |
| 165 | + } |
| 166 | + } |
| 167 | + ], |
| 168 | + "id": "31915bc8-088c-40d6-a014-7a98bcd70bcb", |
| 169 | + "type": [ |
| 170 | + "VerifiableCredential", |
| 171 | + "MembershipCredential" |
| 172 | + ], |
| 173 | + "issuer": { |
| 174 | + "id": "did:web:eonax-authority-url:api:did", |
| 175 | + "additionalProperties": {} |
| 176 | + }, |
| 177 | + "issuanceDate": "2024-08-14T14:33:40Z", |
| 178 | + "expirationDate": null, |
| 179 | + "credentialStatus": [], |
| 180 | + "description": null, |
| 181 | + "name": null |
| 182 | + } |
| 183 | + } |
| 184 | + } |
| 185 | + EOF |
| 186 | + )" http://localhost/ih/identity/v1alpha/participants/$didBase64Url/credentials |
0 commit comments