0
votes

Comment puis-je vous assurer que le code erroné ne construit pas dans un processus CI?

J'écris une bibliothèque C ++ et j'utilise déjà un processus CI (intégration continue) pour vous assurer que les fonctionnalités fonctionnent. La construction est basée sur le filet, de sorte que le script CI détient un test Test code>. Cette cible exécutera les tests automatisés (disons, à l'aide de la capture) et ne construira que si elle réussit.

Les bonnes pratiques exigent qu'une mauvaise utilisation de la bibliothèque par code d'utilisateur doit de préférence déclencher une erreur de compilation, au lieu d'une exécution. Erreur de temps. J'ai donc inclus beaucoup de vérification statique. P>

Cependant, je tiens à vous assurer dans mon processus de test automatisé que c'est vraiment le cas (que le code d'utilisateur à l'aide de la bibliothèque échouera à tort). P >

J'ai donc mis en place un dossier qui détient plusieurs fichiers .CPP, chacun démontrant une utilisation incorrecte de la bibliothèque, chacun d'entre eux ne devrait pas échouer. P>

Mon problème est que si j'ajoute un nouveau cible dans mon maquillage pour les construire, il reviendra après la première défaillance. P>

Ce que je veux faire est de vous assurer que Tous forts> Ces fichiers échouent et ne renvoient que 0 Ce cas. P>

Comment puis-je écrire une cible qui effectue cela? p>

Certains code (ne fonctionne pas), cela reviendra après la première défaillance. P>

SRC_FILES := $(wildcard *.cpp)
OBJ_FILES := $(patsubst %.cpp, %.o, $(SRC_FILES))

all: $(OBJ_FILES)
    @echo "done"

%.o: %.cpp
    $(CXX) -o $@ -c $<


1 commentaires

Kinda associée: Stackoverflow.com/questions/2188376 Mais cette question demande un code de retour nul si le code d'exécution échoue, pas la construction .


3 Réponses :


2
votes

Le seul moyen de le faire si vous souhaitez utiliser la même règle de motif, consiste à utiliser et à transmettre le drapeau -k code> ( - continuez code> ), comme ceci:

test_compile:
         ok=true; \
         for src in $(TEST_SRCS); do \
           $(CXX) -o $${src%.cpp}.o -c $$src || ok=false; \
         done; \
         $$ok


1 commentaires

Merci de jeter un coup d'œil, je vais vérifier et essayer cela dès que possible.



1
votes
srcs := fail1.cpp fail2.cpp fail3.cpp
failed := ${srcs:.cpp=.failed}

PHONY: test
test: ${failed} ; : $@ Success

${failed}: %.failed: %.cpp
    ! gcc blah blah $< -o ${@:.failed=.o}
    touch $@
What happens here is that when you want to build test, make first tries to build fail1.failed.If the compile succeeds, make fails with an error.OTOH if the compile fails, the output file fail1.failed is created.BTW, make knows that fail1.failed depends on fail1.cpp.
If the .failed is newer than the .cpp, the test will not even run.
Nice.Same for fail2.failed and fail3.failed. Parallel safe, and if you get your dependencies right, only the tests that need to run get run. The whole point of make really.

1 commentaires

Merci de réponse, une approche intéressante, je vais essayer.



0
votes

Accepter le formulaire de réponse @madscientist, mais pour l'enregistrement, il semble que cela puisse être fait aussi de cette façon: xxx

juste en inversant la valeur de retour de la commande shell compile: si un seul fichier réussit , alors faire une sortie immédiatement avec une valeur de retour "erreur".


0 commentaires