node.js – Requisição HTTP usando RAW/JSON Angular 7

Boa tarde, já tentei de quase tudo mas não consigo fazer um POST no angular usando uma lista, retorna sempre o erro 500. Essa é a chamada pelo component.

ngOnInit() {
    let CSVProduto: Array<CSVProduto> = (
      {nome: "Lucas", sobrenome: "Rodrigues" , idade: "22" },
      {nome: "Lucas", sobrenome: "Silva" , idade: "25" }
    );
    this.produtoService.uploadCSV(CSVProduto).subscribe(res => window.alert("Dados inseridos com sucesso")
    )
  }

Essa é a chamada pelo serviço.

uploadCSV(CSVProduto: Array<CSVProduto>) {
    console.log(CSVProduto)
    return this.httpClient.post(this.urlUpload, CSVProduto, this.httpOptions)
      .pipe(
        retry(1),
        catchError(this.handleError)
      )
  }

E esse é o código da API

exports.importCSV = (req,res) => {
    try {

        const produto = ()
        
        for(var i = 0; i < req.body.CSVProduto.length; i++){

            produto.nome                   = req.body.CSVProduto(i).nome;
            produto.sobrenome              = req.body.CSVProduto(i).sobrenome;
            produto.idade                  = req.body.CSVProduto(i).idade;

            const sqlQry = 'insert into teste (nome,sobrenome,idade) values (?,?,?)'
            
            connection.query(sqlQry,(produto.nome,produto.sobrenome,produto.idade), (err,result)=>{
                
                if(err){
                    try {
                        console.log(err)
                        return res.status(500).json({"message": + err})           
                    } catch (error) {}
                     
                }else{
                    try {
                        return res.status(201).json({"message": result.insertId + " - Dados inseridos com sucesso!"})
                    } catch (error){}
                }
            })
        }
    } catch (error) {
        return res.status(500).json({"message":"Internal Server Error"})
    }
}

Usando o Postman funciona normal, com esse body inserir a descrição da imagem aqui

Me desculpem, mas não sei o que estou fazendo de errado, já pesquisei e já testei quase de tudo. Alguém poderia ajudar? :/

Como imprimir dados de uma string em páginas diferentes Usando PrintPreviewDialog no C#

Olá, desde de já obrigado pela atenção.
Tenho o seguinte cenário:

Preciso imprimir cheques que vem do excel.
Cada lote tem um tamanho específico e adicionei as configurações.
Cada cheque é configurado por linha e coluna:
Segue Imagem o layout:Layout

Após os cheques serem configurados, gero uma lista de string, contendo cada cheque escrito em cada posição deste array, como mostra a figura:inserir a descrição da imagem aqui

Após isso jogo cada cheque em uma única string (não sei se é melhor assim, ou gerar uma página para cada cheque, seria o ideal).

Segue Código da classe para visualizar a impressão:

using System;

using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace Extensions._1MODEL
{
public static class Imprimir
{
static string altura = “”;
static string largura = “”;
static string cheque_impresso = “”;

    public static void Visualizar_Impressao(string chequeImpresso)
    {
        cheque_impresso = "";
        cheque_impresso = chequeImpresso;
        PrintPreviewDialog ppd = new PrintPreviewDialog();
        PrintDocument PD = new PrintDocument();
        PD.DocumentName = "Cheque";
        PD.DefaultPageSettings.Margins = new Margins(CentimetrosParaCentesimasPolegada(Util.MARGEM_DIREITA), CentimetrosParaCentesimasPolegada(Util.MARGEM_ESQUERDA),
                                                           CentimetrosParaCentesimasPolegada(Util.MARGEM_SUPERIOR), CentimetrosParaCentesimasPolegada(Util.MARGEM_INFERIOR));
        PaperSize papersize = new PaperSize("Padrão", CentimetrosParaCentesimasPolegada(Util.LARGURA), CentimetrosParaCentesimasPolegada(Util.ALTURA));

        PD.DefaultPageSettings.PaperSize = papersize;
        PD.PrinterSettings.DefaultPageSettings.PaperSize = papersize;
        PD.PrintPage += PrintDocument_Cheque_PrintPage;
        ppd.Document = PD;
        ppd.ShowDialog();
        // PD.Print();
        //.Print();
        //ppcVisualizar_Cheque.Document = 

    }

    /// <summary>
    /// Converte Centimetro para Centésimo de Polegada 
    /// </summary>
    /// <param name="cm"></param>
    /// <returns></returns>
    private static int CentimetrosParaCentesimasPolegada(double cm)
    {
        return (int)Math.Round((cm / 2.54) * 100, MidpointRounding.AwayFromZero);
    }
    /// <summary>
    /// Configura a Fonte, Página e adiciona o texto, usado para auxiliar o método Visualizar_Impressao()
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private static void PrintDocument_Cheque_PrintPage(object sender, PrintPageEventArgs e)
    {
        using (var font = new Font("Courier New", 15))

        using (var brush = new SolidBrush(Color.Black))
        {
            int caracteres = 0;
            int linhas = 0;



            //verificar quando mando imprimir texto específico da erro
            e.Graphics.MeasureString(cheque_impresso,
                                     font,
                                     //new Size(e.MarginBounds.Width, e.MarginBounds.Height), StringFormat.GenericTypographic, out caracteres, out linhas);
                                     new Size(CentimetrosParaCentesimasPolegada(Util.LARGURA), CentimetrosParaCentesimasPolegada(Util.ALTURA)), StringFormat.GenericTypographic, out caracteres, out linhas);
            Rectangle A = new Rectangle();
            //A.Size = new Size(CentimetrosParaCentesimasPolegada(Util.LARGURA), CentimetrosParaCentesimasPolegada(Util.ALTURA));
            A.Size = new Size(10000, 10000);
            //A.X = CentimetrosParaCentesimasPolegada(Util.MARGEM_SUPERIOR);
            //A.Y = CentimetrosParaCentesimasPolegada(Util.MARGEM_ESQUERDA);

            //cheque_impresso = cheque_impresso.Remove(CentimetrosParaCentesimasPolegada(Util.ALTURA));
            e.Graphics.DrawString(cheque_impresso, font, brush, A);
            if((Util.ALTURA * Util.LARGURA) * 3 < cheque_impresso.Length)
            {
                string temp = cheque_impresso.Substring(0,(Util.ALTURA*Util.LARGURA)*3);
                cheque_impresso = cheque_impresso.Replace(temp, "");

                e.HasMorePages = true;
            }
            else
            {
                e.HasMorePages = false;
            }

            //cheque_impresso = cheque_impresso.Substring(0, caracteres);
            //cheque_impresso = cheque_impresso.Substring(caracteres);
            //e.HasMorePages = string.IsNullOrWhiteSpace(cheque_impresso);
            //if(cheque_impresso == "")
            //{
            //    e.HasMorePages = false;
            //}

        }
    }

}

}

Após isso os cheques são gerados e apresenta essa visualização (por um PrintPreviewDialog) , note que o primeiro sai correto.
Como consigo gerar uma página para cada cheque, ou delimitar os tamanhos do cheque, tentei fazer isso no código que postei, criando um retângulo, mas não fica correto.

inserir a descrição da imagem aqui

Preciso muito resolver isso, qualquer dúvida só perguntar que respondo o mais rápido possível.

Obrigado!

python – Añadir módulos desde carpeta usando PyInstaller

Hola estoy intentando hacer un ejecutable de una aplicación de Kivy. He conseguido entender a partir de la documentación como agregar distintos archivos de datos pero no logro comprender como agregar lo siguiente a mi programa: El funcionamiento de mi programa es que al ejecutarse crea una carpeta data en la que va guardando archivos que posteriormente utiliza, a demás necesita leer un par de archivos que ya se encuentran en la carpeta con el código, la estructura es la siguiente:

-/pruebaEjecutable
         |-/backup
         |-/img
         |-/data
         |-/Scripts             
                 |-funciones.py
                 |-carga_archivo.py
                 |-copia.py
         |-main.py
         |-main-kv      
         |-include.txt
         |-icon.png
         |-imagen.png

estando en el desktop la carpeta raiz. Yo empleo el comando para añadir los hidden-imports necesarios y posteriormente añado los datos en el spec de la siguiente manera:

python -m PyInstaller –name prueba –hidden-import ‘pkg_resources.py2_warn’ –hidden-import ‘win32timezone’ ..pruebaEjecutablemain.py

Posteriormente sobre el archivo spec modifico varias opciones como se especifica en la guía de kivy :
Create a package for windows
quedando mi archivo spec así:

# -*- mode: python ; coding: utf-8 -*-
from kivy_deps import sdl2, glew

block_cipher = None


a = Analysis(('..\pruebaEjecutable\main.py'),
             pathex=('C:\Users\dpm24\Desktop\statistic'),
             binaries=(),
             datas=(('..\pruebaEjecutable\include.txt','.'),
             ('..\pruebaEjecutable\icon.png','.'),
             ('..\pruebaEjecutable\imagen.png','.')),
             hiddenimports=('pkg_resources.py2_warn', 'win32timezone'),
             hookspath=(),
             runtime_hooks=(),
             excludes=(),
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          (),
          exclude_binaries=True,
          name='prueba',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,Tree('C:\Users\dpm24\Desktop\pruebaEjecutable'),
          a.binaries,
          a.zipfiles,
          a.datas,
          *(Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)), 
          strip=False,
          upx=True,
          upx_exclude=(),
          name='ejecutable')

y por último ejecuto PyInstaller tal que :

python -m PyInstaller .prueba.spec

Pero al correr el ejecutable obtenido desde una terminal me dice “No module named ‘Scripts'”.
No tengo claro como añadir estos módulos para que funcionen con el programa. Si alguien pudiera ayudarme lo agradecería.

c# – consultar una list usando Ajax

estoy tratando de cargar una modal con unos datos especificos de un usuario seleccionado de una tabla.

Tengo una tabla donde se muestra una lista de usuarios, al darle a un boton me debe cargar una modal con la lista de propiedades las cuales posee ese usuario.

El id del usuario llega al controlador y hago la consulta de los datos que quiero, en el controlador puse un punto de quiebre y puedo ver la lista de propiedades del usurio, el problema es que me da error en la function jquery al querer recibir esos datos.

Asi lo tengo en el controlador:

(HttpPost)
    public ActionResult listaComunidades()
    {
        try
        {
            long userId = (long)Session("idTitular"); //Aqui esta almacenado el Id del usuario ya captado por el conrolador
            List<Titulo> titulosList = new List<Titulo>();
            List<community> listComunities = new List<community>();
            titulosList = ep.GetTitulosByTitular(userId);
            listComunities = ep.GetCommunityListByTitular(titulosList);
            return Json(new { result = listComunities });
        }
        catch (Exception ex)
        {
            return Json(new
            {
                data = "error",
                exception = ex.HResult
            });
        }
    }

Y este es mi codigo en jquery

function onCommunitiesList() { 
        var url = "@Url.Action("listaComunidades", "titulares", new { area = "webmaster" })";
        var errUrl = "@Url.Action("listado", "titulares", new { area = "webmaster", Error = "No se pudo procesar la solicitud."})";
       $.ajax({
    url: url,
    cache: false,
    type: 'POST',        
    success: function (result) {     // aqui no recibo nada o no se como puedo hacer que llegue la lista desde el controlador
                if (data != null) {
                    //listCommun = data;
                    //var t = $('.tablaComunidadesSe').DataTable();
                    //t.rows().remove().draw(false);
                    //for (var i = 0; i < data.length; i++) {
                    //    t.row.add((
                    //        data(i).Id,
                    //        data(i).first_name,
                    //    )).draw(false);
                    //}
                    $('#exampleModalLong').modal('show')
                } else {
                    window.location = errUrl;
                }
           },   
    processData: false,
            contentType: false
        })   
    }

¿Como puedo plotear un espectograma usando la funcion mlab.specgram() y acomodar los ejes?

estoy intentado aprender a realizar espectogramas y encontré que matplot.mlab.specgram() permite realizar la conversión a tiempo-frecuencia. Sin embargo, pese a que ya me leí la documentación y entiendo su funcionamiento (eso creo), no consigo comprender los resultados que arroja. Intenté graficarlos pero los resultados no concuerdan con lo que yo espero de acuerdo a la teoría.

Realice una pequeña señal de prueba:

time = np.linspace(0,10,40*10)

s1 = np.sin(20*np.pi*time)
(array2d, fre, times) = mlab.specgram(s1,NFFT=int(10),Fs=80,window=mlab.window_hanning(np.ones(int(10))),
                        noverlap=int(5))
plt.figure(figsize=(20,15))
plt.imshow(array2d)

lo cual me grafica lo siguiente:
introducir la descripción de la imagen aquí

y cuando imprimo los resultados de frecuencia y timpo, obtengo esto:

 print(times)
 out(1): (0.0625 0.125  0.1875 0.25   0.3125 0.375  0.4375 0.5    0.5625 0.625 0.6875 0.75   0.8125 0.875  0.9375 1.     1.0625 1.125  1.1875 1.25
 1.3125 1.375  1.4375 1.5    1.5625 1.625  1.6875 1.75   1.8125 1.875
 1.9375 2.     2.0625 2.125  2.1875 2.25   2.3125 2.375  2.4375 2.5
 2.5625 2.625  2.6875 2.75   2.8125 2.875  2.9375 3.     3.0625 3.125
 3.1875 3.25   3.3125 3.375  3.4375 3.5    3.5625 3.625  3.6875 3.75
 3.8125 3.875  3.9375 4.     4.0625 4.125  4.1875 4.25   4.3125 4.375
 4.4375 4.5    4.5625 4.625  4.6875 4.75   4.8125 4.875  4.9375)
 print(fre)
 out(2): ( 0.  8. 16. 24. 32. 40.)

Se supone que en el grafico deberia obtener, una respuesta maxima en 20Hz pero no comprendo los ejes Y y X. Además, no entiendo como se interpreta el vector de freq y times. Alguien me podría, por favor, ayudar a comprender y adaptar el grafico? es para usarlo en un proyecto academico donde tengo que hacer un fingerprint para cada archivo de audio y este grafico debe ir en el reporte. Gracias!!!

json – Filtrar dados de um array usando um campo de pesquisa com javascript

Estou fazendo um exercício e preciso fazer um campo de pesquisa no qual se for digitado pelo o usuário a letra A apareça todos os nomes que contenha a letra.
Nunca fiz um campo de pesquisa e estou precisando de ajuda para implementar ele no código abaixo.

Os dados dos usuários estão sendo salvos em allPeoples().

É possível usar o filter()? Se tiverem alguma dica de como ou o que usar.

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Usuários</title>

       <!-- Compiled and minified CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
    <link rel="stylesheet" type="text/css" href="./css/style.css">
    <link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.10.0/css/all.css" integrity="sha384-AYmEC3Yw5cVb3ZcuHtOA93w35dYTsvhLPVnYs9eStHfGJvOvKxVfELGroGkvsg+p" crossorigin="anonymous"/>


</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col s12 center-container">
                <h1>Pesquisa de Usuários</h1>
            </div>
        </div>
        <div class="row center-container">
            <div class="col s12">
                <input class="input-field col s10" type="text" name="search" id="inputDataSearch" placeholder="Digite um nome">
                <input class="waves-effect waves-light btn" type="button" id="btnSearch" value="buscar">
            </div>
        </div>
        <div class="row center-container">
            <div class="col s6 box" style="margin-right: 5px" id="resultSearch">
                tsdc
            </div>
            <div class="col s6 box" id="resultSum">
                as
            </div>
        </div>
    </div>
    <!-- Compiled and minified JavaScript -->
    <script src="https://pt.stackoverflow.com/./js/script.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
</body>
</html>

let allSexM = 0
let allSexF = 0

let somAges = 0
let middleAges = 0

let countPeople = 0
let i = 0

let allPeople = ()
let resultPeople = ()

let resultSearch = null
let resultSum = null
let inputDataSearch = null

let btnSearch


let url = 'https://randomuser.me/api/?seed=javascript&results=100&nat=BR&noinfo'

window.addEventListener('load', () => {

    resultSearch = document.querySelector('#resultSearch')
    resultSum = document.querySelector('#resultSum')
    inputDataSearch = document.querySelector('#inputDataSearch')
    btnSearch = document.querySelector('#btnSearch')

    fetchPeoples()
    //searchData()


    //console.log(inputDataSearch)
    //initSearch(inputDataSearch)

})

async function fetchPeoples() {

    const res = await fetch(url)
    const json = await res.json()

    allPeople = json.results.map(people => {

        const { name, age, sex, avatar} = people

/*      const nameFirst = {



        } */

        return {

            name: people.name,
            age: people.dob.age,
            sex: people.gender,
            avatar: people.picture.thumbnail

        }

        name

    })

    render()

    console.log()
}

function render() {

    renderSumary()
    renderListPeoples()

}

function renderSumary() {

    let allDataHTML = '<div>'

    allPeople.forEach(data => {

        const {name, age, sex, avatar} = data

        const dataListHTML = `
            <div class="list-data">
                <div>
                    <span>Sexo masculino:</span>
                    <span>Sexo feminino:</span>
                    <span>Soma das idades:</span>
                    <span>Média das idades:</span>
                </div>
            </div>
        `

        allDataHTML += dataListHTML
    })

    allDataHTML += '</div>'

    resultSum.innerHTML = allDataHTML

}

function renderListPeoples() {

    let peopleHTML = '<div>'

    allPeople.forEach(people => {

        const { name, age, sex, avatar} = people

        const peopleListHTML = `
            <div class="list-peoples">
                <div>
                    <span><img src="https://pt.stackoverflow.com/${avatar}">${name.first} ${name.last}, ${age} anos</span>
                </div>
            </div>

        `

        peopleHTML += peopleListHTML

    })

    peopleHTML += '</div>'

    resultSearch.innerHTML = peopleHTML

}

function searchData() {

    const inputValueData = document.querySelector('#inputDataSearch').value.toLowerCase()

    function keyEnterSearch() {

        inputDataSearch.addEventListener('keyup', event => {

            for (i = 0; i < allPeople.name.length; i++) {

                var encontrou = false;

            }

        })

    }

}

/*function initSearch(value) {

    const peopleSeach = allPeople.results.filter(people => {

        const nameFirst = people.results.name.first
        const nameLast = people.results.name.last

        if(nameFirst == '') {}

            return

    })

    btnSearch.addEventListener('click', event => {



    })

}*/

concatenação de strings usando + em Javascript

var nome= "João";
var sobrenome="Silva";
var idade=30;
var resultado= nome +"" + sobrenome + 'terá' +  idade  +""+ 'anos';
console.log(resultado);

o enunciado do exercício pede: declare uma variável com nome resultado e atribua uma string unindo suas variaveis da seguinte forma: ” João Silva terá 30 anos” e utilize o console.log pra mostrar o que acontece. Respeite os espaços!

Criei o código mas está dando erro, o que tá errado?

table – Preciso somar duas colunas usando XSL

Olá preciso de ajuda para somar duas colunas em um relatório. A baixo segue o que eu já fiz:
XML

-<MaterialCrossSects>

<MaterialCrossSect name="ATERRO - PISTA" cumVolume="0" volume="0" area="0"/>


-<MaterialCrossSect name="ATERRO - CALÇADA ESQUERDA" cumVolume="0" volume="0" area="0.022566610288095">


-<MaterialCrossSectEnvelop area="1.64352610684091E-02">

<CrossSectPnt OE=" -4.249904, 892.028701"/>

<CrossSectPnt OE=" -4.249800, 892.096449"/>

<CrossSectPnt OE=" -4.000200, 892.091457"/>

<CrossSectPnt OE=" -4.000178, 892.027546"/>

<CrossSectPnt OE=" -4.249904, 892.028701"/>

</MaterialCrossSectEnvelop>


-<MaterialCrossSectEnvelop area="6.13134921968594E-03">

<CrossSectPnt OE=" -5.885287, 892.036261"/>

<CrossSectPnt OE=" -5.750200, 892.126319"/>

<CrossSectPnt OE=" -5.750060, 892.035636"/>

<CrossSectPnt OE=" -5.885287, 892.036261"/>

</MaterialCrossSectEnvelop>

</MaterialCrossSect>


-<MaterialCrossSect name="ATERRO - CALÇADA DIREITA" cumVolume="0" volume="0" area="5.41631406135821E-02">


-<MaterialCrossSectEnvelop area="0.028201527166857">

<CrossSectPnt OE=" 5.232389, 891.986101"/>

<CrossSectPnt OE=" 5.750000, 891.996453"/>

<CrossSectPnt OE=" 5.750200, 892.126319"/>

<CrossSectPnt OE=" 6.014144, 891.950347"/>

<CrossSectPnt OE=" 5.356544, 891.986190"/>

<CrossSectPnt OE=" 5.232389, 891.986101"/>

</MaterialCrossSectEnvelop>


-<MaterialCrossSectEnvelop area="2.59616134467251E-02">

<CrossSectPnt OE=" 4.000165, 891.990559"/>

<CrossSectPnt OE=" 4.000200, 892.091457"/>

<CrossSectPnt OE=" 4.249800, 892.096449"/>

<CrossSectPnt OE=" 4.249965, 891.989404"/>

<CrossSectPnt OE=" 4.000165, 891.990559"/>

</MaterialCrossSectEnvelop>

</MaterialCrossSect>

</MaterialCrossSects>

</CrossSect>

Eu já consegui separar os valores de Aterro em Pista|Calçada Esquerda| Calçada Direita,
mas por algum motivo não consigo somar as calçadas, gostaria de apresentar na tabela apenas Aterro pista e aterro calçada.
Hoje está assim:

Hoje está assim:

Meu código está assim:

<xsl:for-each select="./MaterialCrossSects/MaterialCrossSect">

                    <xsl:variable name="Area" select="@area" />
                      <xsl:if test="@name='ATERRO - PISTA'">
                      <td align="left">
                        <xsl:value-of select="landUtils:FormatNumber(string($Area), string($SourceAreaUnit), string($Surface.2D_Area.unit), string($Surface.2D_Area.precision), string($Surface.2D_Area.rounding))" />
                      </td>
                        </xsl:if>
                        <xsl:if test="@name='ATERRO - CALÇADA ESQUERDA'">
                         <xsl:variable name="Teste1" select="@area" />
                      <td align="left">
                        <xsl:value-of select="landUtils:FormatNumber(string($Teste1), string($SourceAreaUnit), string($Surface.2D_Area.unit), string($Surface.2D_Area.precision), string($Surface.2D_Area.rounding))" />
                      </td>
                        </xsl:if>
                        <xsl:if test="@name='ATERRO - CALÇADA DIREITA'">
                         <xsl:variable name="Teste2" select="@area" />
                      <td align="left">
                        <xsl:value-of select="landUtils:FormatNumber(string($Teste2), string($SourceAreaUnit), string($Surface.2D_Area.unit), string($Surface.2D_Area.precision), string($Surface.2D_Area.rounding))" />
                      </td>
                        </xsl:if>
                          <xsl:value-of select="$Teste1+$Teste2" /> <!-- ERRO -->

                  </xsl:for-each>

Quando crio variáveis dentro dos ifs elas só funcionam dentro dos ifs não funcionam fora deles, não entendo por que

node.js – Qual a malhor maneira de fazer build de projeto NodeJS no Bamboo com testes de regressão usando docker-compose?

Atualmente tenho uma build no Bamboo que está demorando quase 30 minutos, é uma aplicação em ReactJS, e demora por precisar rodar testes de regressão pois para rodar esses testes preciso subir um ambiente com docker-compose dentro do processo de build. O build demora mais em dois momentos:

  • baixando as imagens (a cada build preciso baixar novamente por não ter cache no Bamboo agent)
  • instalando os pacotes do NodeJS

Esta build está deixando um processo zumbi do NPM que por fim fica em deadlock e temos que fazer o restart manual do agente do Bamboo.

Preciso criar um Job na build no Bamboo com os seguintes detalhes:

  • usar docker compose para subir environment para testes;
  • rodar testes de regressão;
  • build e envio de imagem para prod da aplicação para um registro docker;
  • o build não pode demorar mais de 5 minutos;
  • excluir todas imagens utilizadas ao final do build

O que já foi feito?

  • alterei todas as imagens base para usar versões com alpine (ficaram muito menores mas ainda demora para baixar e demora no build da nova imagem);
  • enxugamos as dependências, tanto nos containers, quanto nas packages do NodeJS;
  • fizemos alterações na instalação dos packages NodeJS adicionando o seguinte:
RUN npm set progress=false
RUN npm i -g pnpm
RUN npm ci # Usado no lugar de npm install

Bom é isso, espero que possam me ajudar, já busquei em vários lugares e não achei nada aplicável.

c – Como fazer scanf que funcione com struct usando for, eu fiz assim e ele pula as perguntas que faço

struct cadastro{

char titulo;
char nomeAutor;
char editora;
int quantidadeExemplar; 
char isbn;
int edicao;
int caixa;

};

int main()
{
struct cadastro livro(MAX);
struct cadastro revista(MAX);
int i, opcao;

while (opcao !=1 || opcao != 2 || opcao != 3 || opcao != 4){
    printf("n1)CADASTRARn2)LISTAR LIVROSn3)LISTAR REVISTASn4)LISTAR POR CAIXAn");
    scanf("%d", &opcao);

    if (opcao == 1){

    printf("n1)Revistan2)livron");
    scanf("%d", &opcao);



        switch (opcao){
            case 1:
                for (i = 0; i < MAX; i++){
                    printf("Informe O Títulon");
                    scanf("%c", &livro(i).titulo);

                    printf("Informe o Nome do Autor");
                    scanf("%c", &livro(i).nomeAutor);

                    printf("Informe o número da edição");
                    scanf("%d", &livro(i).edicao);

                    printf("Informe o Nome da editora");
                    scanf("%d", &livro(i).editora);

                    printf("Inform e o número do isbn do livro");
                    scanf("%c", &livro(i).isbn);

                    printf("Informe a quantidade de exemplares");
                    scanf("%d", &livro(i).quantidadeExemplar);

                    printf("Informe a caixa a ser armazenada");
                    scanf("%d", &livro(i).caixa);           
                }
            break;

            case 2:

            break;
    }

    }   

}

return 0;

}