Compare commits

...

5 Commits

Author SHA1 Message Date
lars b125237880 Compose image 2023-10-06 15:55:37 -05:00
lars 711f36f4da Do triggeredoo 2023-10-06 15:53:49 -05:00
lars 5ad147032e Fix again 2023-10-06 15:52:33 -05:00
lars 68ce724d31 Fix 'content' 2023-10-06 15:51:01 -05:00
lars a54002252c Some deploy updates 2023-10-06 15:40:34 -05:00
6 changed files with 39 additions and 39 deletions

View File

@ -0,0 +1 @@
HOST=dvdemo.privatedns.org

View File

@ -3,5 +3,4 @@ PORTAINER_API_KEY=ptr_RwxH2Cd+htdD2FoFiG46erT9beyvj9VoF3BrQPtDH3Q=
PORTAINER_EP=CICD-runner PORTAINER_EP=CICD-runner
GITEA_API_KEY=f449c74ec7f04e54fe1e481eae43492b34cea406 GITEA_API_KEY=f449c74ec7f04e54fe1e481eae43492b34cea406
DEPLOY_REPO_URL=https://dvgit.privatedns.org/lars/DeployTests DEPLOY_REPO_URL=https://dvgit.privatedns.org/lars/DeployTests
DEPLOY_BRANCH=main DEPLOY_BRANCH=main
DEPLOY_HOST=dvdemo.privatedns.org

View File

@ -6,12 +6,12 @@ import argparse
import requests import requests
import json import json
import uuid import uuid
from dotenv import load_dotenv from dotenv import load_dotenv, dotenv_values
from string import Template from string import Template
from pathlib import Path from pathlib import Path
from urllib.parse import urlparse from urllib.parse import urlparse
load_dotenv() load_dotenv('.env.deploy')
required_env_vars = { required_env_vars = {
'PORTAINER': 'The portainer instance to deploy to', 'PORTAINER': 'The portainer instance to deploy to',
@ -20,7 +20,6 @@ required_env_vars = {
'GITEA_API_KEY': 'API-Key to access Gitea instance', 'GITEA_API_KEY': 'API-Key to access Gitea instance',
'DEPLOY_REPO_URL': 'The repository URL to deploy', 'DEPLOY_REPO_URL': 'The repository URL to deploy',
'DEPLOY_BRANCH': 'The branch to deploy', 'DEPLOY_BRANCH': 'The branch to deploy',
'DEPLOY_HOST': 'The host name under which the deployment will be reachable',
} }
# Try getting all arguments from (in order): 1 command line, 2 .env file, 3 Environment # Try getting all arguments from (in order): 1 command line, 2 .env file, 3 Environment
@ -58,7 +57,7 @@ try:
json_endpoints = response.json() json_endpoints = response.json()
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
raise Exception(f'Could not retrieve portainer endpoints: {err}') raise Exception(f'Could not retrieve portainer endpoints: {err}. \n\n Response: {response.content}')
endpoint_id = None endpoint_id = None
for endpoint in json_endpoints: for endpoint in json_endpoints:
@ -78,6 +77,17 @@ owner = repo_parts[0]
repo = repo_parts[1] repo = repo_parts[1]
### Template substitution for the portainer stack deployment ### ### Template substitution for the portainer stack deployment ###
app_env = dotenv_values('.env.app')
portainer_deploy_env = [{
"name": "COMPOSE_PROJECT_NAME",
"value": args.DEPLOY_BRANCH
}]
for key, value in app_env.items():
portainer_deploy_env.append({
"name": key,
"value": os.getenv(value) if value.startswith("$") else value
})
portainer_deploy_payload = { portainer_deploy_payload = {
"additionalFiles": [ "additionalFiles": [
"deploy/portainer/portainer_deploy.docker-compose.yml" "deploy/portainer/portainer_deploy.docker-compose.yml"
@ -86,16 +96,7 @@ portainer_deploy_payload = {
"webhook": deploy_webhook "webhook": deploy_webhook
}, },
"composeFile": "docker-compose.yml", "composeFile": "docker-compose.yml",
"env": [ "env": portainer_deploy_env,
{
"name": "HOST",
"value": args.DEPLOY_HOST
},
{
"name": "COMPOSE_PROJECT_NAME",
"value": args.DEPLOY_BRANCH
}
],
"fromAppTemplate": False, "fromAppTemplate": False,
"name": f"{owner}_{repo}_{args.DEPLOY_BRANCH.replace('/', '_')}".lower(), "name": f"{owner}_{repo}_{args.DEPLOY_BRANCH.replace('/', '_')}".lower(),
"repositoryAuthentication": True, "repositoryAuthentication": True,
@ -114,7 +115,7 @@ try:
deploy_response = response.json() deploy_response = response.json()
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
raise Exception(f'Could not deploy portainer stack: {err}') raise Exception(f'Could not deploy portainer stack: {err}.\n\n Response: {response.content}')
### Add Webhook to Gitea ### ### Add Webhook to Gitea ###
webhook_payload = { webhook_payload = {
@ -138,5 +139,5 @@ try:
webhook_response = response.json() webhook_response = response.json()
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
raise Exception(f'Could not add webhook to Gitea: {err}') raise Exception(f'Could not add webhook to Gitea: {err}.\n\n Response: {response.content}')
print(f'Successfully deployed project') print(f'Successfully deployed project')

View File

@ -1,10 +1,10 @@
version: '3.4' version: '3'
services: services:
http-echo: http-echo:
networks: networks:
- cicd - cicd
networks: networks:
cicd: cicd:
driver: bridge driver: bridge

View File

@ -11,7 +11,7 @@ from string import Template
from pathlib import Path from pathlib import Path
from urllib.parse import urlparse from urllib.parse import urlparse
load_dotenv() load_dotenv('.env.deploy')
required_env_vars = { required_env_vars = {
'PORTAINER': 'The portainer instance to deploy to', 'PORTAINER': 'The portainer instance to deploy to',
@ -53,7 +53,7 @@ try:
json_endpoints = endpoint_response.json() json_endpoints = endpoint_response.json()
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
raise Exception(f'Could not retrieve portainer endpoints: {err}') raise Exception(f'Could not retrieve portainer endpoints: {err}.\n\n Response: {endpoint_response.content}')
endpoint_id = None endpoint_id = None
for endpoint in json_endpoints: for endpoint in json_endpoints:
@ -73,7 +73,7 @@ try:
json_stacks = stacks_response.json() json_stacks = stacks_response.json()
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
raise Exception(f'Could not retrieve portainer stacks: {err}') raise Exception(f'Could not retrieve portainer stacks: {err}.\n\n Response: {stacks_response.content}')
stack_id = None stack_id = None
stack_webhook = None stack_webhook = None
@ -112,7 +112,7 @@ try:
json_webhooks = get_webhooks_response.json() json_webhooks = get_webhooks_response.json()
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
raise Exception(f'Could not get webhooks from Gitea: {err}') raise Exception(f'Could not get webhooks from Gitea: {err}.\n\n Response:{get_webhooks_response.content}')
webhook_id = None webhook_id = None
for webhook in json_webhooks: for webhook in json_webhooks:
@ -128,21 +128,19 @@ else:
### Remove Webhook from Gitea ### ### Remove Webhook from Gitea ###
remove_webhook_url = f"{gitea}/api/v1/repos/{repo_path}/hooks/{webhook_id}" remove_webhook_url = f"{gitea}/api/v1/repos/{repo_path}/hooks/{webhook_id}"
try: try:
#TODO: Webhooks are returned paginated, this only checks first page
del_webhooks_response = requests.delete(remove_webhook_url, headers=gitea_headers) del_webhooks_response = requests.delete(remove_webhook_url, headers=gitea_headers)
del_webhooks_response.raise_for_status() # Raise HTTPError for bad requests del_webhooks_response.raise_for_status() # Raise HTTPError for bad requests
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
raise Exception(f"Could not delete webhook '{webhook_id}' from Gitea: {err}") raise Exception(f"Could not delete webhook '{webhook_id}' from Gitea: {err}.\n\n Response: {del_webhooks_response.content}")
## Remove Stack from Portainer ### ## Remove Stack from Portainer ###
remove_stack_url = f"{args.PORTAINER}/api/stacks/{stack_id}?endpointId={endpoint_id}" remove_stack_url = f"{args.PORTAINER}/api/stacks/{stack_id}?endpointId={endpoint_id}"
try: try:
#TODO: Webhooks are returned paginated, this only checks first page
del_stack_response = requests.delete(remove_stack_url, headers=portainer_headers) del_stack_response = requests.delete(remove_stack_url, headers=portainer_headers)
del_stack_response.raise_for_status() # Raise HTTPError for bad requests del_stack_response.raise_for_status() # Raise HTTPError for bad requests
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
raise Exception(f"Could not delete stack '{stack_id}' from Portainer: {err}") raise Exception(f"Could not delete stack '{stack_id}' from Portainer: {err}.\n\n Response: {del_stack_response.content}")
print(f'Successfully undeployed project') print(f'Successfully undeployed project')

View File

@ -1,12 +1,13 @@
version: '3.4' version: '3.4'
services: services:
http-echo: http-echo:
build: build:
content: ./ image: ${COMPOSE_PROJECT_NAME}_httpecho
dockerfile: httpecho.Dockerfile context: ./
expose: dockerfile: httpecho.Dockerfile
- 8080 expose:
environment: - 8080
- VIRTUAL_PORT=8080 environment:
- VIRTUAL_PORT=8080
- VIRTUAL_HOST=${HOST} - VIRTUAL_HOST=${HOST}