Apuntes cosas aprendidas de IT

dissabte, 26 de setembre del 2020

s2i with docker to test images locally

this document explain how to create docker imges to redhad openshift and test images locally whith only docker

Install docker and configure docker for snap.

you need install docker. I have used snap docker for ubuntu20 but each docker daemaon and client shudl be ok

to work with images stream you need to have it in your dockerd and it is necessary have the capacity to pull images from redhad

create user docker and add your user if you want to avoid sudo docker.

docker login registry.redhat.io

this create a file with credentials tokens from user and pwd this file shud be accesible in ~/.docker In case of snapcraft this file is located inside of snap and you shuld copy it

cp /home/jordi/snap/docker/471/.docker/config.json /home/jordi/.docker/config.json

install s2i

only download from gith and set the executable in the path

create image from git

it is possible and easyest way to create image

 s2i  build  https://github.com/jordiesc/java-springboot-basic registry.redhat.io/redhat-openjdk-18/openjdk18-openshift jordi:v2
INFO Performing Maven build in /tmp/src
INFO Using MAVEN_OPTS -XX:+UseParallelOldGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:MaxMetaspaceSize=100m -XX:+ExitOnOutOfMemoryError
INFO Using Apache Maven 3.6.1 (Red Hat 3.6.1-6.3)
Maven home: /opt/rh/rh-maven36/root/usr/share/maven
Java version: 1.8.0_262, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "5.4.0-48-generic", arch: "amd64", family: "unix"
INFO Running 'mvn -e -Popenshift -DskipTests -Dcom.redhat.xpaas.repo.redhatga -Dfabric8.skip=true --batch-mode -Djava.net.preferIPv4Stack=true -s /tmp/artifacts/configuration/settings.xml -Dmaven.repo.local=/tmp/artifacts/m2  package'
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...

to run the container

❯ docker run -p 8080:8080  jordi:v1
Starting the Java application using /opt/jboss/container/java/run/run-java.sh ...
INFO exec  java -javaagent:/opt/jboss/container/jolokia/jolokia.jar=config=/opt/jboss/container/jolokia/etc/jolokia.properties -XX:+UseParallelOldGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:MaxMetaspaceSize=100m -XX:+ExitOnOutOfMemoryError -cp "." -jar /deployments/rest-service-0.0.1-SNAPSHOT.jar
I> No access restrictor found, access to any MBean is allowed
Jolokia: Agent started with URL https://172.17.0.2:8778/jolokia/

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.2.RELEASE)

create from source with maven or from binary

you can build from binary o from source code. you must to specify a folder in both cases

❯ cd java-springboot-basic
❯ ll
total 36K
-rwxrwxr-x 1 jordi jordi 9,9K sep 26 11:22 mvnw
-rw-rw-r-- 1 jordi jordi 6,5K sep 26 11:22 mvnw.cmd
-rw-rw-r-- 1 jordi jordi 1,4K sep 26 10:13 pom.xml
-rw-rw-r-- 1 jordi jordi  406 sep 26 11:34 README.md
drwxrwxr-x 4 jordi jordi 4,0K sep 26 10:14 src
drwxrwxr-x 9 jordi jordi 4,0K sep 26 11:09 target
❯ s2i build target  registry.redhat.io/redhat-openjdk-18/openjdk18-openshift jordi:v6
INFO S2I source build with plain binaries detected
INFO Copying binaries from /tmp/src to /deployments ...
rest-service-0.0.1-SNAPSHOT.jar
rest-service-0.0.1-SNAPSHOT.jar.original
classes/
classes/com/
classes/com/example/
classes/com/example/restservice/
classes/com/example/restservice/Greeting.class
classes/com/example/restservice/GreetingController.class
classes/com/example/restservice/Headers.class
classes/com/example/restservice/RestServiceApplication.class
generated-sources/
generated-sources/annotations/
generated-test-sources/
generated-test-sources/test-annotations/
maven-archiver/
maven-archiver/pom.properties
maven-status/
maven-status/maven-compiler-plugin/
maven-status/maven-compiler-plugin/compile/
maven-status/maven-compiler-plugin/compile/default-compile/
maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
maven-status/maven-compiler-plugin/testCompile/
maven-status/maven-compiler-plugin/testCompile/default-testCompile/
maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
surefire-reports/
surefire-reports/TEST-com.example.restservice.GreetingControllerTests.xml
surefire-reports/com.example.restservice.GreetingControllerTests.txt
test-classes/
test-classes/com/
test-classes/com/example/
test-classes/com/example/restservice/
test-classes/com/example/restservice/GreetingControllerTests.class
Build completed successfully

alternatively

<LeftMouse>❯ cd java-springboot-basic
❯ ll
total 36K
-rwxrwxr-x 1 jordi jordi 9,9K sep 26 11:22 mvnw
-rw-rw-r-- 1 jordi jordi 6,5K sep 26 11:22 mvnw.cmd
-rw-rw-r-- 1 jordi jordi 1,4K sep 26 10:13 pom.xml
-rw-rw-r-- 1 jordi jordi  406 sep 26 11:34 README.md
drwxrwxr-x 4 jordi jordi 4,0K sep 26 10:14 src
drwxrwxr-x 9 jordi jordi 4,0K sep 26 11:09 target
❯ cd ..
❯ s2i build java-springboot-basic  registry.redhat.io/redhat-openjdk-18/openjdk18-openshift jordi:v5

from Docker file

export a docker file

s2i generate registry.redhat.io/redhat-openjdk-18/openjdk18-openshift Dockerfile.jordi

create a folder and move the Dockerfile.jordi to this folder and rename it to Dockerfile

below a sampel with the only the jar, this docker file also work with source code with maven

❯ cd s2idocker
❯ tree
.
├── Dockerfile
├── s3i.adoc
└── target
    └── rest-service-0.0.1-SNAPSHOT.jar

here the docker file

❯ cat Dockerfile
FROM registry.redhat.io/redhat-openjdk-18/openjdk18-openshift
LABEL "io.openshift.s2i.build.image"="registry.redhat.io/redhat-openjdk-18/openjdk18-openshift" \
      "io.openshift.s2i.scripts-url"="image:///usr/local/s2i" \
      "io.openshift.s2i.destination"="/tmp"

USER root
# Copying in source code
COPY ./target /tmp/src
#COPY /home/jordi/jordi/repositorios/github/sprign-securty-saml/target /tmp/src
# Change file ownership to the assemble user. Builder image must support chown command.
RUN chown -R 1001:0 /tmp/src
USER 1001
# Assemble script sourced from builder image based on user input or image metadata.
# If this file does not exist in the image, the build will fail.
RUN /usr/local/s2i/assemble
# Run script sourced from builder image based on user input or image metadata.
# If this file does not exist in the image, the build will fail.
CMD /usr/local/s2i/run

build the docker file

docker build . -t jordi:v4

test and run image

❯ docker images
REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
jordi                                                      v4                  3f13a7f2bbfc        2 minutes ago       539MB
jordi                                                      v3                  1dbdc19facc1        33 minutes ago      506MB
jordi                                                      v2                  3d9fbf5de1db        2 hours ago         555MB
<none>                                                     <none>              1e244fb4b7a1        2 hours ago         555MB
jordi                                                      v1                  dd78eb8ca2c9        2 hours ago         555MB
jordi                                                      latest              a1064a60f7e6        2 hours ago         555MB
registry.redhat.io/redhat-openjdk-18/openjdk18-openshift   latest              46b0b4cf8a00        2 months ago        473MB
hello-world                                                latest              bf756fb1ae65        8 months ago        13.3kB

❯ docker run -p 8080:8080  -itd  jordi:v4
27e11949e11f9ed432a53804f1ef4ec44dcdd39cc03d0ffcba791a3e508f278f
❯ curl -H "name1: value1" -H "name2: value2" http://localhost:8080/headers
{"host":"localhost:8080","name2":"value2","name1":"value1","user-agent":"curl/7.68.0","accept":"*/*"}%

later

divendres, 6 de desembre del 2019

SAML MELLON POC

Introduction

the Poc consist on VM installed used Vagrant.Git with the scripts and the configuration. Apache httpd , mellon and Tomcat with small application.

Vagrant

The installation has been done by vagrant in Centos7

you can do it without vagrant but it is needed to has NAT ports forward enables 8888 and 8180.

Port 80 is not recomended because Windows use ti internally.

Once the vagrant is done go to git and clone the

repository.

Install begin

execute ./installbegin.sh. This install basic softwarebase along sets up the heroes.org in the hosts file.

It also disable SELinux and reboot.

Install Mellon and Apahce httpd

execute ./installmellon.sh

it will copy the heroes.org.conf virtual host apache and create mellon section and it crate the XML SP metadata.

Listen 8888
<VirtualHost *:8888>
    ServerName heroes.org
    ServerAlias heroes.org
    DocumentRoot /var/www/heroes.org/public_html

<Location / >
    AuthType Mellon
    MellonEnable auth
    Require valid-user
    MellonEndpointPath /mellon/
    MellonSPMetadataFile /etc/httpd/saml2/http_heroes.org_8888.xml
    MellonSPPrivateKeyFile /etc/httpd/saml2/http_heroes.org_8888.key
    MellonSPCertFile /etc/httpd/saml2/http_heroes.org_8888.cert
    MellonIdPMetadataFile /etc/httpd/saml2/meta_idp.xml

    MellonUser "NAME_ID"
    MellonSetEnv "display_name" "displayName"
    MellonSamlResponseDump On
    ProxyPassInterpolateEnv On
 RequestHeader set X-WEBAUTH-USER "%{MELLON_NAME_ID}e"
 #RequestHeader set X-WEBAUTH-DUMP "%{MELLON_SAML_RESPONSE}e"


</Location>

   #Pass most connections to backend app, once it has been secured.
    ProxyPass / http://localhost:8080/mellon
    ProxyPassReverse / http://localhost:8080/mellon

</VirtualHost>

Install keyclaock

execute ./installkeycloack the web administration console is there.

you later must to create a realm called heroes, create a client impoting the SP.xml file configuration create by mellon http_heroes.org_8888.xml

you can log into http://heroes.org:8180/auth/ with user admin and pwd admin

Once imported go to the heroes client configuration is useful to disable encryption fo the saml assertion and pass the username as user Id.

  • Encrypt Assertions Off

  • Name ID Format username

the realm is exported as realm-export.json althought it has not been tested the import

Create a user and its pwd in the Users section.

Once the client and user is done you must to install metadata in mellon

ssh into the guest and execute

curl http://localhost:8180/auth/realms/heroes/protocol/saml/descriptor > meta-idp.xml

sudo cp meta_idp.xml /etc/httpd/saml2

Install Tomcat and small end point appliation

execute install_app_tomcat.sh thies goes to saml2/mellon and execute

mvn package

This install mvn tomcat and build a deploy small application into locally in the guest.

TEST

execute

it willl forward to keycloack IDP put user jordi and pwd jordi and you will see a output like this

Hola Mundo (1)
host=localhost:8080
user-agent=Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0
accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-language=es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
accept-encoding=gzip, deflate
referer=http://heroes.org:8180/
cookie=mellon-cookie=6e83894907480c27921539d940ba6f74
dnt=1
upgrade-insecure-requests=1
x-webauth-user=jordi (2)
1 Servlet System.out
2 User Id.

the User Id comes in the SAML assertion in the subcject element of the XML. if you want a code like jordi is when you must to change Idp Client configuration .

Below de default Id, to change it go to keycloack and change the Name Id format.

<saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">G-e535ce9b-5b55-4896-92a6-0e7777f9aa5c</saml:NameID>

TroubleShooting

SELinux enable or disable.

SELinux /etc/selinus/config to enable or disable SElinux

Apache

The logs are in /etc/httpd/logs Check status $httpd -d Check config $httpd -t

Dump SAML assertion in header

Tomcat Logs $journalctl -u tomcat

increase headers in /etc/tomcat/server.xml

In heroes.org.conf enable the dump to header #RequestHeader set X-WEBAUTH-DUMP "%{MELLON_SAML_RESPONSE}e"

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
maxHttpHeaderSize="65536"
redirectPort="8443" />

Others

Install Spring sample

Follow

jordi@LAPTOP-ELFAQNCG MINGW64 /c/Program Files/Java/jdk1.8.0_181/bin
$ jrunscript.exe -e 'print (javax.crypto.Cipher.getMaxAllowedKeyLength("RC5") >= 256);'
true

SAML certificates vorkflow

  • Create a new key pair for signing and/or encryption together with the respective X.509 certificate

  • Configure your SP to support the new key pair

  • Add a new KeyDescriptor to your SAML metadata

  • Support decrypting SAML messages using your new key

  • Send your metadata (or just the X.509 certificate) to the IdP(s). They must:

  • Switch the encryption certificate to the new one

  • Trust in your new signing certificate, without stop trusting in the old one

  • Wait for the IdP(s) to update its configurations

  • Do not start to use the new key for signing your messages until the IdP(s) confirm they are supporting your new certificate

  • Configure your SP to start using the new key for signing messages

  • The old keys may be completely removed

  • The IdP(s) can now untrust your old signing certificat

dimarts, 6 d’agost del 2019

Repository Spring

The use of @JPARepository or @CrudRepository is very handy, developers can do basic operations with no SQL operations. However it also hide the transaccion managemetn. By default every method has a transacciton scope. I have seen so many developers forget the use of @Transactional scope in their services. Hibernate and JPA force to you to create a Transaccion but with the use of frameworks it is deep hide and frecuantly ommited, skipped or simplely unknown by mediocre developers

Behaviour without Transaction management

the service produces different output depending of use of Transaccional scope

    @Transactional
    public void getGetOlder(int age, int plus) {

        List<User> listUsers = repoUser.findByAgeGreaterThan(age);
        for (User user : listUsers) {
            user.setAge(user.getAge() + plus);
            repoUser.save(user);
        }
    }

This give you a log with only one transaccion

2019-08-06 11:42:19,731 DEBUG [main] o.h.e.t.i.TransactionImpl [TransactionImpl.java:101] committing
2019-08-06 11:42:19,731 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:141] Processing flush-time cascades
2019-08-06 11:42:19,731 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:193] Dirty checking collections
2019-08-06 11:42:19,733 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:115] Flushed: 0 insertions, 2 updates, 0 deletions to 2 objects
2019-08-06 11:42:19,733 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:122] Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
2019-08-06 11:42:19,734 DEBUG [main] o.h.i.u.EntityPrinter [EntityPrinter.java:110] Listing entities:
2019-08-06 11:42:19,734 DEBUG [main] o.h.i.u.EntityPrinter [EntityPrinter.java:117] org.jordi.h2db.springboot.models.User{firstName=Joana, lastName=Fernandez, id=2, age=11}
2019-08-06 11:42:19,734 DEBUG [main] o.h.i.u.EntityPrinter [EntityPrinter.java:117] org.jordi.h2db.springboot.models.User{firstName=Rachel, lastName=Fernandez, id=1, age=11}
2019-08-06 11:42:19,735 DEBUG [main] o.h.SQL [SqlStatementLogger.java:94] update users set age=?, first_name=?, last_name=? where id=?
2019-08-06 11:42:19,739 DEBUG [main] o.h.SQL [SqlStatementLogger.java:94] update users set age=?, first_name=?, last_name=? where id=?
2019-08-06 11:42:19,759 DEBUG [Thread-3] o.h.i.SessionFactoryImpl [SessionFactoryImpl.java:792] HHH000031: Closing

whereras if you ommit the transaccion you will the below where you can see two commits instead of one.:

2019-08-06 12:00:19,763 DEBUG [main] o.h.e.t.i.TransactionImpl [TransactionImpl.java:101] committing
2019-08-06 12:00:19,764 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:141] Processing flush-time cascades
2019-08-06 12:00:19,765 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:193] Dirty checking collections
2019-08-06 12:00:19,766 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:115] Flushed: 0 insertions, 1 updates, 0 deletions to 1 objects
2019-08-06 12:00:19,767 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:122] Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
2019-08-06 12:00:19,767 DEBUG [main] o.h.i.u.EntityPrinter [EntityPrinter.java:110] Listing entities:
2019-08-06 12:00:19,768 DEBUG [main] o.h.i.u.EntityPrinter [EntityPrinter.java:117] org.jordi.h2db.springboot.models.User{firstName=Rachel, lastName=Fernandez, id=1, age=11}
2019-08-06 12:00:19,769 DEBUG [main] o.h.SQL [SqlStatementLogger.java:94] update users set age=?, first_name=?, last_name=? where id=?
2019-08-06 12:00:19,774 DEBUG [main] o.h.e.t.i.TransactionImpl [TransactionImpl.java:56] On TransactionImpl creation, JpaCompliance#isJpaTransactionComplianceEnabled == false
2019-08-06 12:00:19,775 DEBUG [main] o.h.e.t.i.TransactionImpl [TransactionImpl.java:84] begin
2019-08-06 12:00:19,776 DEBUG [main] o.h.l.Loader [Loader.java:2269] Loading entity: [org.jordi.h2db.springboot.models.User#2]
2019-08-06 12:00:19,777 DEBUG [main] o.h.SQL [SqlStatementLogger.java:94] select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.first_name as first_na3_0_0_, user0_.last_name as last_nam4_0_0_ from users user0_ where user0_.id=?
2019-08-06 12:00:19,780 DEBUG [main] o.h.l.Loader [DelegatingBasicLogger.java:384] Result set row: 0
2019-08-06 12:00:19,781 DEBUG [main] o.h.l.Loader [Loader.java:1532] Result row: EntityKey[org.jordi.h2db.springboot.models.User#2]
2019-08-06 12:00:19,784 DEBUG [main] o.h.e.i.TwoPhaseLoad [TwoPhaseLoad.java:145] Resolving associations for [org.jordi.h2db.springboot.models.User#2]
2019-08-06 12:00:19,785 DEBUG [main] o.h.e.i.TwoPhaseLoad [TwoPhaseLoad.java:290] Done materializing entity [org.jordi.h2db.springboot.models.User#2]
2019-08-06 12:00:19,785 DEBUG [main] o.h.l.Loader [Loader.java:2298] Done entity load
2019-08-06 12:00:19,786 DEBUG [main] o.h.e.t.i.TransactionImpl [TransactionImpl.java:101] committing
2019-08-06 12:00:19,787 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:141] Processing flush-time cascades
2019-08-06 12:00:19,787 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:193] Dirty checking collections
2019-08-06 12:00:19,788 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:115] Flushed: 0 insertions, 1 updates, 0 deletions to 1 objects
2019-08-06 12:00:19,789 DEBUG [main] o.h.e.i.AbstractFlushingEventListener [AbstractFlushingEventListener.java:122] Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
2019-08-06 12:00:19,789 DEBUG [main] o.h.i.u.EntityPrinter [EntityPrinter.java:110] Listing entities:
2019-08-06 12:00:19,790 DEBUG [main] o.h.i.u.EntityPrinter [EntityPrinter.java:117] org.jordi.h2db.springboot.models.User{firstName=Joana, lastName=Fernandez, id=2, age=11}
2019-08-06 12:00:19,790 DEBUG [main] o.h.SQL [SqlStatementLogger.java:94] update users set age=?, first_name=?, last_name=? where id=?
2019-08-06 12:00:19,810 DEBUG [Thread-3] o.h.i.SessionFactoryImpl [SessionFactoryImpl.java:792] HHH000031: Closing

diumenge, 9 de juny del 2019

VAGRANT W10


It took me a lot of time to get over the below problem Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT).

to fix it   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity\Enabled set to 0

dissabte, 23 de febrer del 2019

CDI in JEE-Jakarta EE part I

Dependence injection commontly CI or CD/CI or CDI is the framework for JEE for dependence injection. Very similar to Spring. It also was know as IoC or inversion of control. the point is that de dependeces are injected instead of created by new…​ Injected means that the container created and pass the reference…​. thats all…​.

Specification

In case of OpenLiberty is based in JBooss implementation http://weld.cdi-spec.org/

Features

Instalation

In CDI 1.0 was necessary a file META-INF/beans.xml but not in later version. This file also can be located in anohter places.

Scopes

CDI is based in a concept of container which is actually a on memory key-value data object database. this container or database is partitionated in scopes so a bean only can see its neigbourds in its scope. the scope come from applications scope

  • @RequestScoped

  • @SessionScoped

  • @ApplicationScoped

  • @ConversationScoped. This is similar to transacctional in jpa…​.

Names

El Names or @Name("myname") is a name to be referenced either JSP or JSF

Creation

The below sample create a Bean of type String…​ how does it solve conflicts?

    @Produces
    @Property("")
    String  valueofProperty(InjectionPoint injectionPoint){
        Property property = injectionPoint.getAnnotated().getAnnotation(Property.class);
        return "clave mas "+ property.value();
           }

Ambiguity.

if CDI is actually a key-value. how does it look up objects?. by the type. and the ambibuguity is solved with custom anotations or called @Qualifier.

@Qualifier
@Target({ ElementType.FIELD,ElementType.METHOD, ElementType.TYPE,ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface Property {
    @Nonbinding
    String value() default "";

Use

The most commotn is by @Inject similar to @Autowired in Spring}

dilluns, 22 d’octubre del 2018

Instalation

browsesync is based on node/js platform so npm install -g browser-sync

Default running

browser-sync start --server

in my case to go fast i got an alias in my bashrc

alias bserve='browser-sync start --server' then to run for me is

$ bserve --file * -w

diumenge, 14 d’octubre del 2018

GIT most used comands

GIT log and info

set alias into .bashrc vimlog

alias gitlog='git log --all --oneline --graph'

to see diferences betwen branches write .. betwen branches

git diff branch_a..branch_b

GIT Commit

when I sure git commit -m -a "message" when not it allows check the diferences git add -p

GIT branch

create a branch called features git checkout -b features merge into branch into master git checkout master to go to master and the git merge features. if there is confilcs resolve or file to file editing one by one or use git mergetool it opens a nice tool based in vimlo git checkout --theirs or git checkout --ours in case you wan take iether feture or master

GIT rebase

Use rebase when you want get all the master o shared repo to you personal branch