feat: création auto de l'image et du conteneur
This commit is contained in:
@@ -6,69 +6,120 @@ locals {
|
||||
}
|
||||
}
|
||||
|
||||
frontend_dir = "../../../../apps/frontend"
|
||||
image_name = "enervision-front"
|
||||
image_tag = "latest"
|
||||
container_name = "enervision-frontend"
|
||||
|
||||
selected_frontend = local.frontend_environments[var.deployment_environment]
|
||||
}
|
||||
|
||||
provider "docker" {
|
||||
host = "npipe:////.//pipe//docker_cli"
|
||||
host = var.docker_host
|
||||
}
|
||||
|
||||
resource "docker_image" "frontend" {
|
||||
name = "enervision-front:latest"
|
||||
keep_locally = false
|
||||
|
||||
depends_on = [module.k3s]
|
||||
|
||||
# Build le front
|
||||
resource "null_resource" "build_frontend" {
|
||||
triggers = {
|
||||
environment = var.deployment_environment
|
||||
|
||||
build_hash = sha256(join("", [
|
||||
for file in fileset(local.selected_frontend.source_dir, "**") :
|
||||
filesha256("${local.selected_frontend.source_dir}/${file}")
|
||||
frontend_files = sha256(join("", [
|
||||
for file in fileset(local.frontend_dir, "src/**,package.json") :
|
||||
filesha256("${local.frontend_dir}/${file}")
|
||||
]))
|
||||
}
|
||||
|
||||
// Variables pour la connexion SSH
|
||||
provisioner "local-exec" {
|
||||
command = "cd ${local.frontend_dir} && npm ci && npm run build"
|
||||
}
|
||||
}
|
||||
|
||||
# Build l'image docker du front
|
||||
resource "docker_image" "frontend" {
|
||||
name = "${local.image_name}:${local.image_tag}"
|
||||
|
||||
build {
|
||||
context = local.frontend_dir
|
||||
dockerfile = "Dockerfile"
|
||||
}
|
||||
|
||||
triggers = {
|
||||
build_hash = sha256(join("", [
|
||||
for file in fileset(local.frontend_dir, "**") :
|
||||
filesha256("${local.frontend_dir}/${file}")
|
||||
]))
|
||||
}
|
||||
|
||||
depends_on = [null_resource.build_frontend]
|
||||
}
|
||||
|
||||
# Création du container Docker
|
||||
resource "docker_container" "frontend" {
|
||||
image = docker_image.frontend.image_id
|
||||
name = local.container_name
|
||||
|
||||
ports {
|
||||
internal = 3000
|
||||
external = var.frontend_port
|
||||
}
|
||||
|
||||
# Volume pour les logs
|
||||
volumes {
|
||||
host_path = "/var/log/enervision"
|
||||
container_path = "/var/log/nginx"
|
||||
}
|
||||
|
||||
depends_on = [docker_image.frontend]
|
||||
}
|
||||
|
||||
# Déploiement du container sur le serveur via SSH
|
||||
resource "null_resource" "deploy_to_server" {
|
||||
depends_on = [docker_image.frontend]
|
||||
|
||||
triggers = {
|
||||
image_id = docker_image.frontend.image_id
|
||||
}
|
||||
|
||||
connection {
|
||||
type = "ssh"
|
||||
host = var.ssh_host
|
||||
port = var.ssh_port
|
||||
user = var.ssh_user
|
||||
password = var.ssh_password
|
||||
private_key = file(pathexpand(var.ssh_private_key_path))
|
||||
private_key = try(file(pathexpand(var.ssh_private_key_path)), null)
|
||||
timeout = "5m"
|
||||
}
|
||||
|
||||
// Lancement de script en SSH avec remote-exec
|
||||
// Installation de Nginx et initialisation du répertoire du frontend
|
||||
provisioner "remote-exec" {
|
||||
inline = [
|
||||
"sudo apt-get update",
|
||||
"sudo apt-get install -y nginx",
|
||||
"sudo mkdir -p /var/www/enervision",
|
||||
"sudo rm -rf /var/www/enervision/*"
|
||||
]
|
||||
}
|
||||
|
||||
// Copie des fichiers vers le serveur
|
||||
# Copie le Dockerfile et nginx.conf
|
||||
provisioner "file" {
|
||||
source = "${local.selected_frontend.source_dir}/"
|
||||
destination = "/tmp/enervision-frontend"
|
||||
source = "${local.frontend_dir}/Dockerfile"
|
||||
destination = "/tmp/Dockerfile"
|
||||
}
|
||||
|
||||
// Déplacement des fichiers
|
||||
provisioner "file" {
|
||||
source = "${local.frontend_dir}/nginx.conf"
|
||||
destination = "/tmp/nginx.conf"
|
||||
}
|
||||
|
||||
# Copie les sources pour le build
|
||||
provisioner "file" {
|
||||
source = "${local.frontend_dir}/"
|
||||
destination = "/tmp/frontend/"
|
||||
}
|
||||
|
||||
# Build et lance le container sur le serveur
|
||||
provisioner "remote-exec" {
|
||||
inline = [
|
||||
"sudo cp -r /tmp/enervision-frontend/ /var/www/enervision/",
|
||||
"sudo chown -R www-data:www-data /var/www/enervision"
|
||||
"cd /tmp/frontend",
|
||||
"sudo docker stop ${local.container_name} 2>/dev/null || true",
|
||||
"sudo docker rm ${local.container_name} 2>/dev/null || true",
|
||||
"sudo docker build -t ${local.image_name}:${local.image_tag} .",
|
||||
"sudo docker run -d \\",
|
||||
" --name ${local.container_name} \\",
|
||||
" -p ${var.frontend_port}:3000 \\",
|
||||
" --restart always \\",
|
||||
" -v /var/log/enervision:/var/log/nginx \\",
|
||||
" ${local.image_name}:${local.image_tag}"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
resource "docker_container" "nginx" {
|
||||
image = "enervision-front:latest"
|
||||
name = "front"
|
||||
ports {
|
||||
internal = 4200
|
||||
external = 3000
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,24 @@ variable "ssh_password" {
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
variable "remote_path" {
|
||||
type = string
|
||||
description = "Chemin distant sur le serveur pour le deploiement."
|
||||
default = "/var/www/enervision"
|
||||
}
|
||||
|
||||
variable "docker_host" {
|
||||
type = string
|
||||
default = "npipe:////.//pipe//docker_engine"
|
||||
description = "Host Docker (local ou distant)"
|
||||
}
|
||||
|
||||
variable "frontend_port" {
|
||||
type = number
|
||||
default = 3000
|
||||
description = "Port externe du frontend"
|
||||
}
|
||||
|
||||
variable "k3s_version" {
|
||||
type = string
|
||||
description = "Version k3s a epingler pour un deploiement reproductible (ex: v1.31.5+k3s1). Voir https://github.com/k3s-io/k3s/releases."
|
||||
|
||||
Reference in New Issue
Block a user