为服务运行部署
在下面的指南中,您将在 Port 中创建一个自助操作,在幕后执行 GitHub 工作流。
本例中的 GitHub 工作流程将运行新的部署,并向 Port 报告部署实体。
先决条件
- Port API
CLIENT_ID
和CLIENT_SECRET
。
创建 GitHub 工作流程
首先,我们需要建立一个 GitHub 工作流来实现我们的业务逻辑,以便进行部署。
下面是工作流程的骨架--deploy.yml
(包括部署逻辑的占位符):
Deployment GitHub workflow
name: CI
on:
workflow_dispatch:
inputs:
service:
required: true
description: "Service name to deploy"
type: string
environment:
required: true
default: staging
description: "Environment to deploy service to"
type: string
port_payload:
required: true
description: "Port's payload, including details for who triggered the action and general context (blueprint, run id, etc...)"
type: string
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- id: echo-deploy
run: echo "deploy"
# ADD YOUR DEPLOYMENT LOGIC HERE!
report-deployment:
name: Report new deployment Entity
runs-on: ubuntu-latest
steps:
- name: Extract SHA short
run: echo "SHA_SHORT=${GITHUB_SHA:0:7}" >> $GITHUB_ENV
- name: "Report deployment Entity to port 🚢"
uses: port-labs/port-github-action@v1
with:
clientId: ${{ secrets.PORT_CLIENT_ID }}
clientSecret: ${{ secrets.PORT_CLIENT_SECRET }}
identifier: ${{ inputs.service }}-${{ inputs.environment }}-${{ env.SHA_SHORT }}
blueprint: deployment
properties: |
{
"jobUrl": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}",
"deployingUser": "${{ github.actor }}",
"imageTag": "latest",
"commitSha": "${{ env.SHA_SHORT }}"
}
runId: "${{fromJson(inputs.port_payload).context.runId}}"
请注意工作流程中名为
port_payload
的附加参数。默认情况下该参数以Port's action message 完成。您可以在 Port 的操作定义中指定 "omitPayload": true
来禁用它。 更多详情请点击here创建部署蓝图
让我们配置一个 "部署 "蓝图,它的基本结构是
{
"identifier": "deployment",
"title": "Deployment",
"icon": "Deployment",
"schema": {
"properties": {
"jobUrl": {
"type": "string",
"format": "url",
"title": "Job URL"
},
"deployingUser": {
"type": "string",
"title": "Deploying User"
},
"imageTag": {
"type": "string",
"title": "Image Tag"
},
"commitSha": {
"type": "string",
"title": "Commit SHA"
}
},
"required": []
},
"mirrorProperties": {},
"calculationProperties": {},
"relations": {}
}
下面是蓝图的 "python "代码(切记插入 "CLIENT_ID "和 "CLIENT_SECRET "以获取访问令牌)。
Click here to see the code
import requests
CLIENT_ID = 'YOUR_CLIENT_ID'
CLIENT_SECRET = 'YOUR_CLIENT_SECRET'
API_URL = 'https://api.getport.io/v1'
credentials = {'clientId': CLIENT_ID, 'clientSecret': CLIENT_SECRET}
token_response = requests.post(f'{API_URL}/auth/access_token', json=credentials)
access_token = token_response.json()['accessToken']
headers = {
'Authorization': f'Bearer {access_token}'
}
blueprint = {
"identifier": "deployment",
"title": "Deployment",
"icon": "Deployment",
"schema": {
"properties": {
"jobUrl": {
"title": "Job URL",
"type": "string",
"format": "url"
},
"deployingUser": {
"title": "Deploying User",
"type": "string"
},
"imageTag": {
"title": "Image Tag",
"type": "string"
},
"commitSha": {
"title": "Commit SHA",
"type": "string"
}
},
"required": []
},
"calculationProperties": {},
}
response = requests.post(f'{API_URL}/blueprints', json=blueprint, headers=headers)
print(response.json())
创建 Port 操作
现在让我们配置一个自助服务操作。 添加一个 CREATE
操作,开发人员每次要为服务启动新的部署时都会触发该操作。
以下是该操作的 JSON 文件:
{
"identifier": "deploy_service",
"title": "Deploy Service",
"icon": "DeployedAt",
"userInputs": {
"properties": {
"ref": {
"type": "string",
"description": "The GitHub branch to deploy (Optional, otherwise will use repo's default branch)"
},
"service": {
"type": "string",
"description": "The service to deploy"
},
"environment": {
"type": "string",
"description": "The environment to deploy the service to"
}
},
"required": ["service", "environment"]
},
"invocationMethod": {
"type": "GITHUB",
"org": "<GITHUB_ORG>",
"repo": "<GITHUB_REPO>",
"workflow": "deploy.yml"
},
"trigger": "CREATE",
"description": "Deploy a service to the environment"
}
您可以在下面看到创建此操作的 python
代码(请记住插入您的 CLIENT_ID
和 CLIENT_SECRET
以获取访问令牌)。
请注意 "部署 "蓝图标识符是如何被用于到新蓝图中的。
此外,不要忘记替换 YOUR_GITHUB_ORG
、YOUR_GITHUB_REPO
的占位符。
Click here to see code
import requests
CLIENT_ID = 'YOUR_CLIENT_ID'
CLIENT_SECRET = 'YOUR_CLIENT_SECRET'
GITHUB_ORG = 'YOUR_GITHUB_ORG'
GITHUB_REPO = 'YOUR_GITHUB_REPO'
GITHUB_WORKFLOW = 'deploy.yml'
API_URL = 'https://api.getport.io/v1'
credentials = {'clientId': CLIENT_ID, 'clientSecret': CLIENT_SECRET}
token_response = requests.post(f'{API_URL}/auth/access_token', json=credentials)
access_token = token_response.json()['accessToken']
headers = {
'Authorization': f'Bearer {access_token}'
}
blueprint_identifier = 'deployment'
action = {
'identifier': 'deploy_service',
'title': 'Deploy Service',
'icon': 'DeployedAt',
'description': 'Deploy a service to the environment',
'trigger': 'CREATE',
'invocationMethod': {
'type': 'GITHUB',
'org': GITHUB_ORG,
'repo': GITHUB_REPO,
'workflow': GITHUB_WORKFLOW
},
'userInputs': {
'properties': {
'ref': {
'type': 'string',
'title': 'The GitHub branch to deploy (Optional, otherwise will use repo's default branch)'
},
'service': {
'type': 'string',
'title': 'The service to deploy'
},
'environment': {
'type': 'string',
'title': 'The environment to deploy the service to'
},
},
'required': [
'service', 'environment'
]
}
}
response = requests.post(f'{API_URL}/blueprints/{blueprint_identifier}/actions', json=action, headers=headers)
print(response.json())
自助服务操作配置完成后,就可以开始调用了。
触发action
让我们使用 Port API 引用自助服务操作。
Click here to see the API call code
import requests
CLIENT_ID = 'YOUR_CLIENT_ID'
CLIENT_SECRET = 'YOUR_CLIENT_SECRET'
API_URL = 'https://api.getport.io/v1'
credentials = {'clientId': CLIENT_ID, 'clientSecret': CLIENT_SECRET}
token_response = requests.post(f'{API_URL}/auth/access_token', json=credentials)
access_token = token_response.json()['accessToken']
headers = {
'Authorization': f'Bearer {access_token}'
}
blueprint_identifier = 'deployment'
action_identifier = 'deploy_service'
action_run = {
'properties': {
'service': 'backend',
'environment': 'staging'
}
}
response = requests.post(f'{API_URL}/blueprints/{blueprint_identifier}/actions/{action_identifier}/runs', json=action_run, headers=headers)
print(response.json())
当操作完成后,它会将操作运行标记为成功。 这样,您的开发人员就可以了解您的部署已成功完成。
下一步
这是一个非常基本的示例,说明如何使用 Port 的自助操作触发 GitHub 工作流。 我们为您留下了占位符代码,以便您插入适合自己基础架构的自定义逻辑。