Faits :
A.
Par jugement du 23 octobre 2013, le Tribunal pénal de l'arrondissement de la Sarine a reconnu X._ coupable de lésions corporelles simples, d'agression, de vol, de dommages à la propriété, d'extorsion par brigandage et de vol d'usage. Il l'a condamné à une peine privative de liberté de 36 mois, dont 18 mois fermes et 18 mois assortis du sursis pendant 5 ans, ainsi qu'à une amende contraventionnelle de 200 francs.
Cette condamnation sanctionne principalement trois agressions commises, les 22 janvier 2011, 28 mai 2011 et 31 mars 2012, par le recourant et un groupe d'amis. Dans les trois cas, ils s'en sont pris, de nuit, à des individus isolés ou inférieurs en nombre qu'ils ont frappés intentionnellement et violemment pour s'amuser ou se défouler.
B.
Statuant le 5 décembre 2014, la Cour d'appel pénal du Tribunal cantonal fribourgeois a partiellement admis l'appel de X._, qu'elle a acquitté des chefs de prévention de lésions corporelles simples, brigandage, agression ainsi que vol; elle l'a en revanche reconnu coupable de lésions corporelles simples, d'agression, de vol, de dommages à la propriété, d'extorsion par brigandage et de vol d'usage. Elle l'a condamné à une peine privative de liberté ferme de 30 mois, ainsi qu'à une amende contraventionnelle de 200 francs.
C.
X._ forme un recours en matière pénale contre cet arrêt, qu'il ne conteste qu'en ce qui concerne la peine qui lui a été infligée. Il conclut, avec suite de frais et dépens, principalement, au prononcé d'une peine privative de liberté de 20 mois avec sursis pendant 5 ans et ordonnance d'une assistance de probation sous la forme d'un suivi psychothérapeutique ainsi que d'une amende contraventionnelle de 200 francs. Subsidiairement, il conclut au prononcé d'une peine privative de liberté de 30 mois, dont 15 mois fermes et 15 mois avec sursis pendant 5 ans ainsi que d'une amende contraventionnelle de 200 francs. Plus subsidiairement, il conclut au renvoi de la cause à la cour cantonale pour qu'elle statue à nouveau. Il sollicite en outre l'assistance judiciaire.
D.
Invités à présenter des observations, le ministère public et la cour cantonale ont renoncé à se déterminer.

Considérant en droit :
1.
Le recourant soutient que la cour cantonale a omis de prendre en considération des critères essentiels liés à l'aspect subjectif de l'infraction et à l'auteur lui-même et a accordé une importance excessive aux composantes objectives de l'acte, de sorte que la peine qui lui a été infligée viole l'<ref-law>.
Conformément à cette disposition, le juge fixe la peine d'après la culpabilité de l'auteur. Celle-ci doit être évaluée en fonction de tous les éléments objectifs pertinents, qui ont trait à l'acte lui-même, à savoir notamment la gravité de la lésion, le caractère répréhensible de l'acte et son mode d'exécution. Du point de vue subjectif, sont pris en compte l'intensité de la volonté délictuelle ainsi que les motivations et les buts de l'auteur. A ces composantes de la culpabilité, il faut ajouter les facteurs liés à l'auteur lui-même, à savoir ses antécédents, sa réputation, sa situation personnelle (état de santé, âge, obligations familiales, situation professionnelle, risque de récidive, etc.), sa vulnérabilité face à la peine, de même que son comportement après l'acte et au cours de la procédure pénale (<ref-ruling> et les arrêts cités). Le juge dispose d'un large pouvoir d'appréciation et le Tribunal fédéral n'intervient au motif que le droit fédéral est violé que s'il a fixé une peine en dehors du cadre légal, s'il s'est fondé sur des critères étrangers à l'<ref-law>, s'il a omis de prendre en considération des éléments d'appréciation prévus par cette disposition ou, enfin, si la peine prononcée est exagérément sévère ou clémente au point de constituer un abus du pouvoir d'appréciation.
La cour cantonale a relevé la très lourde culpabilité du recourant, qui a usé de violence gratuite en agissant lâchement à l'encontre de victimes vulnérables. Elle a en outre fait état du mobile particulièrement blâmable du recourant, qui a agi pour s'amuser ou se défouler. Elle relève par ailleurs la mauvaise collaboration du recourant au cours de l'enquête, n'avouant qu'au moment où plus aucun doute n'était possible quant à son implication et cherchant constamment à minimiser son rôle, rejetant la faute sur autrui et ne prenant pas conscience de la gravité de son comportement. Elle a, enfin, relevé en sa faveur le fait qu'il est un délinquant primaire.
Dans la mesure où le recourant soutient que c'est à tort que la cour cantonale a admis qu'il avait cherché à minimiser son rôle et que les excuses exprimées à ses victimes étaient peu convaincantes, il s'en prend à des éléments qui relèvent du for intérieur de l'auteur et constituent des constatations de fait, qui lient le Tribunal fédéral (<ref-law>), le recourant ne soulevant aucun grief recevable de constatation arbitraire des faits. Pour le surplus, le recourant se prévaut de circonstances qui pour certaines ne ressortent pas des constatations de l'arrêt attaqué, comme la pression du groupe ou une éducation basée sur la violence, et ne peuvent par conséquent pas être prises en considération (<ref-law>). L'absence de préméditation, également invoquée par le recourant, n'allège pas sa culpabilité; elle n'a pour effet que d'exclure l'aggravation qu'aurait impliqué cette circonstance si elle avait été réalisée. Enfin, le fait qu'il ait effectué un stage, commencé 5 jours avant la séance de la cour cantonale, ne saurait être déterminant.
Il appert ainsi que la cour cantonale ne s'est pas fondée sur des critères non pertinents, pas plus qu'elle n'a omis de prendre en considération des éléments pertinents. Elle n'est pas sortie du cadre légal et la peine prononcée n'apparaît pas exagérément sévère au point de constituer un abus du large pouvoir d'appréciation dont dispose le juge. Le grief de violation de l'<ref-law> doit donc être rejeté dans la mesure de sa recevabilité.
2.
Le recourant reproche à l'autorité cantonale d'avoir violé l'<ref-law> en lui infligeant une peine de 30 mois fermes alors que celle prononcée en première instance, certes plus longue, était de 36 mois, mais dont seuls 18 mois étaient fermes.
Conformément à l'<ref-law>, la juridiction d'appel ne peut modifier une décision au détriment du prévenu ou du condamné si le recours a été interjeté uniquement en leur faveur. Elle peut toutefois infliger une sanction plus sévère à la lumière de faits nouveaux qui ne pouvaient pas être connus du tribunal de première instance.
2.1. Le but de cette disposition est de permettre au prévenu d'exercer son droit de recours sans craindre d'être puni plus sévèrement (<ref-ruling> consid. 2.4.3 p. 287 et les références citées). La perspective de se voir privé, même partiellement, du bénéfice du sursis accordé en première instance est de nature à dissuader le prévenu d'intenter un recours, la situation la plus favorable pour lui étant celle où la peine qu'il devra inévitablement purger, à savoir la partie ferme de celle-ci, est la moins longue. Par conséquent, le refus par l'autorité de recours d'un sursis accordé en première instance viole l'interdiction de la reformatio in pejus, même dans l'hypothèse où la durée totale de la peine est parallèlement réduite (voir arrêt 6B_156/2011 du 17 octobre 2011 consid. 2.5.2; RICHARD CALAME, in Commentaire romand, Code de procédure pénale suisse, 2011, n° 8 ad art. 391; GILBERT KOLLY, Zum Verschlechterungsverbot im schweizerischen Strafprozess, in: RPS 113 [1995] p. 294 ss, spéc. p. 312, GÉRARD PIQUEREZ, L'interdiction de la reformatio in pejus en procédure civile et en procédure pénale, in: Mélanges Assista, Genève 1989, 495 ss, spéc. p. 515).
2.2. La cour cantonale estime avoir disposé de faits nouveaux qui lui permettaient d'infliger au recourant une sanction plus lourde, en application de la deuxième phrase de l'<ref-law>. Il s'agit d'une ordonnance pénale rendue le 15 juillet 2014 par laquelle le Ministère public du Nord vaudois a reconnu le recourant coupable de lésions corporelles, voies de fait et injures commises le 2 juin 2013 et l'a condamné à 120 jours-amende à 20 fr. ainsi qu'à une amende de 400 francs.
L'<ref-law> tend à tempérer l'interdiction de la reformatio in pejus, au motif qu'il " serait choquant que des faits, des documents ou des preuves dont on n'a eu connaissance qu'après le jugement du tribunal de première instance ne puissent pas être utilisés, y compris au détriment du prévenu " (Message du 21 décembre 2005 relatif à l'unification de la procédure pénale, FF 2006 p. 1295).
La portée de cette disposition est peu claire (voir ZIEGLER/KELLER, in Basler Kommentar, Schweizerische Strafprozessordnung, 2e éd., 2014, n° 5 ad <ref-law>; NIKLAUS SCHMID, Schweizerische Strafprozessordnung [StPO], Praxiskommentar, 2e éd., 2013, n° 6 ad <ref-law>; MOREILLON/PAREIN-REYMOND, Petit commentaire du Code de procédure pénale, 2013, n° 13 ad <ref-law>) et son application problématique (RICHARD CALAME, op. cit., n° 10 ad <ref-law>).
Plusieurs auteurs considèrent que cette disposition se justifie par des motifs d'économie de procédure, afin d'éviter de devoir mettre en oeuvre une procédure de révision pour pouvoir prendre en considération des faits qui étaient déjà connus de l'autorité de recours. Ils en concluent qu'il faut, par analogie avec l'<ref-law>, ne retenir que les faits de nature à motiver une condamnation sensiblement plus sévère du condamné (voir ZIEGLER/KELLER, op.cit., n° 5 ad <ref-law>; NIKLAUS SCHMID, op.cit., n° 6 ad <ref-law>; LIEBER, in Kommentar zur Schweizerischen Strafprozessordnung, Donatsch/Hansjakob/Lieber [éd.], 2e éd. 2014, n° 20 ad <ref-law> et les références citées).
Est également soutenue en doctrine l'opinion selon laquelle l'art. 391 al. 2 2ème phrase CPP ne saurait s'appliquer tel quel; en cas de découverte de faits nouveaux, c'est la procédure de révision qui doit être mise en oeuvre afin de garantir au justiciable à la fois son droit d'être entendu et son droit à un double degré de juridiction (PIQUEREZ/MACALUSO, Procédure pénale suisse, 3e éd. 2011, p. 641 n° 1948). Un auteur fait une distinction entre d'une part les faits antérieurs au prononcé du jugement de première instance et qui concernent le complexe de faits jugés par celui-ci et, d'autre part, les faits sans lien avec ceux jugés par le tribunal de première instance ou postérieurs au prononcé de son jugement. Le premier cas constitue un motif de révision alors que le second commande que le ministère public dépose un acte d'accusation régulier, respectivement que l'autorité de juridiction suive la procédure adéquate avant de prononcer, le cas échéant, une sanction plus sévère (RICHARD CALAME, op. cit., n° 10 ad <ref-law>).
D'autres auteurs relèvent que des faits nouveaux peuvent être pris en compte pour établir le pronostic quant au comportement futur du condamné; ainsi, l'autorité de recours pourra être amenée à poser un pronostic défavorable en raison de nouvelles infractions commises depuis le jugement de première instance (MARLÈNE KISTLER VIANIN, in Commentaire romand, Code de procédure pénale suisse, 2011, n° 5 ad <ref-law>; JO PITTELOUD, Code de procédure pénale suisse, commentaire à l'usage des praticiens, 2012, p. 774 n° 1143; voir aussi HAUSER/SCHWERI/HARTMANN, Schweizerisches Strafprozessrecht, 6ème éd., 2005, p. 480 n° 12).
2.3. Au regard de ce qui précède, en particulier du pronostic à poser quant au sursis, il convient d'admettre que la cour d'appel pouvait tenir compte de faits qui ne pouvaient pas être connus du tribunal de première instance. C'est donc sans violer le droit fédéral que la cour cantonale a pris en considération le fait nouveau que constituait la condamnation du 15 juillet 2014 du recourant, postérieure au jugement de première instance. Cet élément était susceptible d'aboutir à une nouvelle appréciation de la cour cantonale quant à la question du sursis partiel. Savoir si c'est à juste titre qu'elle a refusé le sursis partiel en vertu de cet élément nouveau relève de l'application de l'<ref-law> et doit être examiné séparément (cf. infra consid. 3).
2.4. Il y a lieu de noter enfin que certains auteurs relèvent que l'autorité qui entend modifier la décision attaquée au détriment du recourant doit respecter le droit d'être entendu de ce dernier (NIKLAUS SCHMID, op. cit., n° 7a ad <ref-law>; LIEBER, op. cit., n° 22 ad <ref-law>), ce qui lui laisserait la possibilité de retirer son recours (ZIEGLER/KELLER, op. cit., n° 5 ad <ref-law>). Le recourant ne se plaint toutefois pas d'une violation de son droit d'être entendu, de sorte que le Tribunal fédéral ne saurait entrer en matière sur ce point faute d'une motivation satisfaisant aux exigences de l'<ref-law>. Au demeurant, la juridiction d'appel a attiré l'attention du recourant sur l'<ref-law>.
3. Le recourant soutient que la cour cantonale a violé les art. 42 et 43 CP en lui infligeant une peine ferme.
3.1. Aux termes de l'<ref-law>, le juge suspend en règle générale l'exécution d'une peine privative de liberté de six mois au moins et de deux ans au plus lorsqu'une peine ferme ne paraît pas nécessaire pour détourner l'auteur d'autres crimes ou délits. Par ailleurs, en vertu de l'<ref-law>, le juge peut suspendre partiellement l'exécution d'une peine privative de liberté d'un an au moins et de trois ans au plus afin de tenir compte de façon appropriée de la faute de l'auteur. La partie à exécuter ne peut excéder la moitié de la peine; elle doit, comme la partie suspendue, être de six mois au moins.
La peine privative de liberté infligée au recourant est de 30 mois, de sorte que seul un sursis partiel entre en considération.
Les conditions subjectives permettant l'octroi du sursis (<ref-law>), à savoir les perspectives d'amendement, valent également pour le sursis partiel prévu à l'<ref-law> dès lors que la référence au pronostic ressort implicitement du but et du sens de cette dernière disposition. Ainsi, lorsque le pronostic quant au comportement futur de l'auteur n'est pas défavorable, la loi exige que l'exécution de la peine soit au moins partiellement suspendue. En revanche, un pronostic défavorable exclut également le sursis partiel. En effet, s'il n'existe aucune perspective que l'auteur puisse être influencé de quelque manière par un sursis complet ou partiel, la peine doit être entièrement exécutée (<ref-ruling> consid. 5.3.1 p. 10).
S'agissant du pronostic, la question de savoir si le sursis est de nature à détourner le prévenu de commettre de nouvelles infractions doit être tranchée sur la base d'une appréciation d'ensemble, tenant compte des circonstances de l'infraction, des antécédents de l'auteur, de sa réputation et de sa situation personnelle au moment du jugement, notamment de l'état d'esprit qu'il manifeste. Le pronostic doit être posé sur la base de tous les éléments propres à éclairer l'ensemble du caractère du prévenu et ses chances d'amendement. Le juge doit par ailleurs motiver sa décision de manière suffisante (voir <ref-law>), afin de permettre de vérifier s'il a été tenu compte de tous les éléments pertinents et comment ils ont été appréciés. Le juge dispose d'un large pouvoir d'appréciation en la matière (<ref-ruling> consid. 2.1; <ref-ruling> consid. 5.2. p. 9).
3.2. En l'espèce, la cour cantonale a noté la gravité des faits imputés au recourant et la longue période sur laquelle ils ont été commis. Elle a en outre relevé qu'il avait persisté à commettre des infractions en mai 2011 et mars 2012 alors même qu'une procédure pénale avait été ouverte contre lui à la suite de la première agression de janvier 2011 et qu'il avait de surcroît été condamné en juillet 2014 pour des actes commis en juin 2013. Il n'avait par ailleurs tout au long de la procédure cessé de minimiser son rôle.
La cour cantonale a fondé le refus total du sursis sur la nouvelle condamnation du recourant, le 15 juillet 2014, à 120 jours-amende ainsi qu'à une amende de 400 francs. Elle est postérieure au jugement de première instance mais sanctionne des faits antérieurs à celui-ci. La cour cantonale ne dit pas en quoi cette condamnation exclurait tout sursis partiel. Celle-ci n'est pas liée à des faits qui auraient été commis après le jugement de première instance. On ne perçoit pas en quoi elle pourrait avoir un rôle déterminant au point de ne pas permettre un sursis partiel, accordé en première instance. La répétition des actes délictueux est un critère d'appréciation défavorable. Toutefois, les infractions retenues n'ont pas été commises après une précédente condamnation en force. Le recourant n'a ainsi pas d'antécédents judiciaires. Dans le cadre de la fixation de la peine, la cour a relevé que le recourant était un délinquant primaire et qu'il avait consenti des efforts louables, certes récents, sur le plan professionnel. Dans ces conditions, la condamnation du 15 juillet 2014 pour des faits antérieurs au jugement de première instance n'apparaît pas pouvoir justifier un refus du sursis partiel. Le recours doit être admis sur ce point.
4.
Le recours est admis partiellement, l'arrêt attaqué est annulé et la cause renvoyée à l'autorité cantonale pour qu'elle statue à nouveau.
Le recourant a requis l'assistance judiciaire. Dans la mesure où il obtient gain de cause, il ne sera pas perçu de frais (art. 66 al. 1 et 4 LTF) et le recourant obtiendra des dépens, réduits, de la part du canton de Fribourg (<ref-law>). La requête d'assistance judiciaire est sans objet pour cette partie de la procédure. Pour le surplus, les conditions d'octroi de l'assistance judiciaire sont réunies (<ref-law>) et Me Christophe Tornare est désigné comme avocat d'office (<ref-law>).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est partiellement admis. L'arrêt attaqué est annulé et la cause est renvoyée à l'autorité cantonale pour nouvelle décision. Le recours est rejeté pour le surplus.
2.
Il n'est pas perçu de frais.
3.
Le canton de Fribourg versera au conseil du recourant une indemnité réduite de 2'000 fr. à titre de dépens pour la procédure devant le Tribunal fédéral.
4.
La demande d'assistance judiciaire est admise dans la mesure où elle n'est pas sans objet.
5.
Me Christophe Tornare est désigné comme avocat d'office du recourant et une indemnité de 1'000 fr., supportée par la caisse du Tribunal fédéral, lui est allouée à titre d'honoraires.
6.
Le présent arrêt est communiqué aux parties et à la Cour d'appel pénal du Tribunal cantonal fribourgeois.
Lausanne, le 11 avril 2016
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
La Greffière : Paquier-Boinay