Faits :
A.
Par jugement du 14 septembre 2016, le Tribunal pénal de l'arrondissement de la Gruyère a reconnu X._ coupable de tentative de lésions corporelles graves, agression et vol et l'a condamné à une peine privative de liberté ferme de 20 mois, sous déduction de la détention provisoire subie. En outre, les premiers juges ont révoqué le sursis de 4 ans accordé à X._ le 4 décembre 2013 par le Tribunal de police de Genève et prolongé d'un an le 17 avril 2015 par le Ministère public du canton de Genève, de sorte qu'il s'est vu astreint à exécuter une peine privative de liberté de 9 mois.
Par ce même jugement, le tribunal de première instance a également reconnu C._ (par défaut) et D._ coupables d'agression notamment. Il a acquitté E._ au bénéfice du doute, du chef de prévention d'agression.
Le tribunal de première instance a condamné X._, C._ et D._, solidairement responsables des dommages subis par A._ et B._, à verser à ces derniers des indemnités à titre de dommages-intérêts et d'indemnisation des frais de défense.
B.
Par arrêt du 16 mars 2018, la Cour d'appel pénal du Tribunal cantonal fribourgeois a rejeté l'appel formé exclusivement par X._ contre le jugement de première instance qu'elle a confirmé.
B.a. En substance, l'arrêt se fonde sur les faits suivants.
Au terme d'une soirée en discothèque à F._, le 2 février 2014, vers 3h30, un événement déclencheur est survenu et a porté l'attention et la hargne d'un groupe d'amis sur A._ et B._. D._ a sorti du coffre de sa voiture la batte de baseball qu'il détenait, faisant fi de l'opposition verbale de son amie et a asséné un premier coup de batte dans le dos de A._. Une tierce personne est venue protéger le visage de A._ alors à terre. C._ a par la suite arraché la batte de baseball des mains de D._, avant de s'en prendre à B._ et de s'acharner sur lui. Chacun de ces deux protagonistes ainsi que X._ ont asséné des coups de poing et de pied à B._, alors qu'il se trouvait à terre. X._ l'a finalement dépouillé de son téléphone, sa montre et son portemonnaie et lui a donné un dernier coup de pied au visage qui lui a fait perdre connaissance. B._ a été conduit à l'hôpital après avoir subi un traumatisme crânien. Des rapports médicaux de mars 2014 font état de différentes lésions subies par A._ et B._.
B.b. X._ figure au casier judiciaire à raison de 9 inscriptions (notamment pour vol, dommages à la propriété, violation de domicile).
C.
X._ forme un recours en matière pénale auprès du Tribunal fédéral contre l'arrêt cantonal et conclut, avec suite de frais et dépens, à sa réforme en ce sens qu'il est acquitté du chef d'accusation d'agression et au renvoi de la cause à la cour cantonale pour qu'elle statue à nouveau sur la peine, le sursis, les conclusions civiles et les frais de procédure. Subsidiairement, il conclut au renvoi de la cause à la cour cantonale pour nouvelle décision. Il sollicite le bénéfice de l'assistance judiciaire.

Considérant en droit :
1.
Le recourant conteste exclusivement l'infraction d'agression et considère que la cour cantonale a établi les faits de manière manifestement inexacte sur un point. Selon lui, la cour cantonale aurait omis que B._ avait asséné un coup de poing à l'un des agresseurs. En prenant en compte cet élément, il aurait fallu, selon le recourant, qualifier les faits de rixe.
1.1.
1.1.1. Le Tribunal fédéral n'est pas une autorité d'appel, auprès de laquelle les faits pourraient être rediscutés librement. Il est lié par les constatations de fait de la décision entreprise (<ref-law>), à moins qu'elles n'aient été établies en violation du droit ou de manière manifestement inexacte au sens des art. 97 al. 1 et 105 al. 2 LTF, à savoir, pour l'essentiel, de façon arbitraire au sens de l'art. 9 Cst. Une décision n'est pas arbitraire du seul fait qu'elle apparaît discutable ou même critiquable; il faut qu'elle soit manifestement insoutenable et cela non seulement dans sa motivation mais aussi dans son résultat (<ref-ruling> consid. 1.1 p. 503). En matière d'appréciation des preuves et d'établissement des faits, il n'y a arbitraire que lorsque l'autorité ne prend pas en compte, sans aucune raison sérieuse, un élément de preuve propre à modifier la décision, lorsqu'elle se trompe manifestement sur son sens et sa portée, ou encore lorsque, en se fondant sur les éléments recueillis, elle en tire des conclusions insoutenables (<ref-ruling> consid. 2.3 p. 266 et les références citées). Le Tribunal fédéral n'entre ainsi pas en matière sur les critiques de nature appellatoire (<ref-ruling> consid. 2.4 p. 368).
1.1.2. A la différence de la rixe (<ref-law>), qui suppose un assaut réciproque ou une bagarre plus ou moins confuse à laquelle plusieurs personnes prennent part activement (cf. <ref-ruling> consid. 2 p. 151 ss), l'agression (<ref-law>) se caractérise comme une attaque unilatérale de deux personnes au moins, dirigée contre une ou plusieurs victimes, qui restent passives ou se contentent de se défendre. Pour que l'on puisse parler d'une attaque unilatérale, il faut que la ou les personnes agressées n'aient pas eu elles-mêmes, au moment de l'attaque, une attitude agressive, impliquant que le déclenchement de la bagarre, en définitive, dépendait surtout du hasard, et qu'elles aient par la suite conservé une attitude passive ou alors uniquement cherché à se défendre. En revanche, si leur réaction défensive dépasse par son intensité et sa durée ce qui était nécessaire pour se défendre, l'agression peut se transformer en rixe (arrêts 6B_745/2017 du 12 mars 2018 consid. 2.3; 6B_637/2012 du 21 janvier 2013 consid. 3.1; 6B_410/2012 du 7 janvier 2013 consid. 2.1.1; 6B_989/2009 du 22 mars 2010 consid. 3.1.1 et les références citées).
1.2. Au vu du manque de crédibilité des déclarations des prévenus et de la concordance des déclarations des victimes, des témoins et des constats médicaux, la cour cantonale a, à l'instar du tribunal de première instance, retenu la version des faits précise, constante et empreinte de sincérité telle que relatée par les victimes.
A teneur de l'arrêt entrepris, le recourant et ses comparses ont attaqué par surprise, avec violence et acharnement les deux victimes en leur assénant des coups de batte, de pied et de poing et étaient ainsi à l'origine de l'attaque. Il s'agissait d'une agression unilatérale tellement soudaine et violente, que les victimes n'ont pas eu le temps de l'esquiver, ni même d'esquisser un quelconque geste de défense. Pour s'en convaincre, il suffisait de constater qu'aucun des prévenus n'avait subi la moindre lésion. Quant au seul et unique coup que A._ avait - selon ses propres déclarations - asséné à l'un des agresseurs pour tenter de les faire fuir, rien n'indiquait qu'il avait effectivement touché sa cible, dès lors qu'aucun des prévenus n'avait prétendu avoir reçu un quelconque coup, pas même le recourant (arrêt entrepris consid. 2.4 à 2.6 p. 7 à 9).
1.3. Le recourant ne conteste d'aucune manière l'attaque par surprise ni son implication dans les événements. En particulier, il ne nie pas avoir asséné des coups de poing et de pied à B._, alors qu'il se trouvait à terre et lui avoir donné un dernier coup au visage lui faisant perdre connaissance, après l'avoir dépouillé.
En se fondant sur les procès-verbaux d'audition de B._ (cf. PV d'audition des 2 et 3 février 2014, pce 2048, l. 28 et pce 3309, l. 114), le recourant reproche à la cour cantonale d'avoir omis de manière arbitraire que l'intimé 2 avait déclaré avoir donné un coup de poing à l'un des agresseurs. Or il est patent qu'en faisant mention du coup de poing de A._ à l'un des agresseurs pour tenter de les faire fuir, la cour cantonale a commis une simple erreur de plume en attribuant ce geste à l'intimé 1 plutôt qu'à l'intimé 2. Elle a expressément tenu compte de ce comportement dans l'établissement des faits, à l'instar des juges de première instance, en précisant qu'il visait à faire fuir les agresseurs (cf. arrêt entrepris consid. 2.6 p. 9 et jugement de première instance, III.1.2.b p.9; PV d'audition du 2 février 2014, pce 2048, l. 28: " donné un coup à un gars pour essayer de les faire fuir "). Ainsi, le recourant se méprend lorsqu'il prétend que cet élément n'aurait pas été pris en compte pour qualifier l'infraction.
De manière purement appellatoire, partant irrecevable, le recourant affirme que B._ a pris part à l'altercation activement et a déclenché une rixe, sans critiquer la motivation cantonale sur le caractère défensif du coup de poing. En tout état, par ses affirmations, il ne parvient pas à démontrer l'arbitraire de la constatation selon laquelle, lui et ses comparses, pourvus de hargne, ont attaqué par surprise et avec violence les intimés; B._ ayant uniquement tenté, par un unique coup, de faire fuir les agresseurs. En cela, on ne saurait parler d'assaut réciproque ou de participation active de l'intimé 2 à la bagarre.
En tant que le recourant reproche à la cour cantonale de ne pas avoir retenu l'infraction de rixe, à laquelle l'intimé 2 aurait participé, il se fonde sur des faits qui s'écartent de manière inadmissible de ceux retenus par la cour cantonale (cf. art. 105 al. 2 et 97 al. 2 LTF), de sorte qu'il n'y a pas lieu d'entrer en matière sur ce point.
Pour le reste, il ne fait pas valoir de grief recevable sous l'angle de l'<ref-law> à l'encontre de sa condamnation du chef d'agression. Il ne conteste pas les autres infractions retenues contre lui. Indépendamment de son acquittement, il ne s'en prend pas non plus à la peine, telle que motivée par la cour cantonale, ni à la révocation du sursis (cf. arrêt entrepris consid. 4 à 6 p. 9 à 12).
Le recourant conteste l'admission des prétentions civiles de B._ sous prétexte qu'il aurait participé à la rixe et qu'il doit lui-même être acquitté. Au vu du sort de ses griefs précédents, il n'y a pas lieu d'entrer en matière sur ce point.
2.
Le recours doit être rejeté dans la mesure où il est recevable. Comme il était dénué de chances de succès, la demande d'assistance judiciaire doit être rejetée (<ref-law>). Le recourant supportera les frais judiciaires, qui seront fixés en tenant compte de sa situation économique, laquelle n'apparaît pas favorable (art. 65 al. 2 et 66 al. 1 LTF). Les intimés, qui n'ont pas été invités à se déterminer, ne sauraient prétendre à des dépens.

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté dans la mesure où il est recevable.
2.
La demande d'assistance judiciaire est rejetée.
3.
Les frais judiciaires, arrêtés à 1'200 fr., sont mis à la charge du recourant.
4.
Le présent arrêt est communiqué aux parties et au Tribunal cantonal de l'Etat de Fribourg, Cour d'appel pénal.
Lausanne, le 21 juin 2018
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
La Greffière : Klinke