-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
4022 lines (2752 loc) · 267 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[Coding4ever's Blog]]></title>
<link href="http://coding4ever.net/atom.xml" rel="self"/>
<link href="http://coding4ever.net/"/>
<updated>2019-08-31T09:51:02+07:00</updated>
<id>http://coding4ever.net/</id>
<author>
<name><![CDATA[Admin]]></name>
</author>
<generator uri="http://octopress.org/">Octopress</generator>
<entry>
<title type="html"><![CDATA[Menyimpan Konfigurasi Aplikasi Secara Terpusat Menggunakan Consul Key-Value Store Bagian #2]]></title>
<link href="http://coding4ever.net/blog/2019/08/31/menyimpan-konfigurasi-terpusat-menggunakan-consul-key-value-store-bagian-number-2/"/>
<updated>2019-08-31T09:26:47+07:00</updated>
<id>http://coding4ever.net/blog/2019/08/31/menyimpan-konfigurasi-terpusat-menggunakan-consul-key-value-store-bagian-number-2</id>
<content type="html"><![CDATA[<p><img class="left" src="https://coding4ever.files.wordpress.com/2019/08/consul-logo.jpg" width="85" height="93">Oke, hari ini saya ingin melanjutkan pembahasan <a href="http://coding4ever.net/blog/2019/08/02/menyimpan-konfigurasi-terpusat-menggunakan-consul-key-value-store-bagian-number-1/">postingan</a> saya sebelumnya tentang penyimpanan konfigurasi aplikasi secara terpusat menggunakan <a href="https://www.consul.io/">consul</a>. Jika pada <a href="http://coding4ever.net/blog/2019/08/02/menyimpan-konfigurasi-terpusat-menggunakan-consul-key-value-store-bagian-number-1/">postingan</a> sebelumnya fokus pembahasan pada instalasi kemudian dilanjutkan dengan demo cara mengakses data yang tersimpan pada <code>key-value store</code> menggunakan salah satu tool REST Client favorit saya yaitu <a href="https://www.getpostman.com/downloads/">Postman</a>, maka fokus pembahasan kali ini adalah bagaimana cara mengakses data <code>key-value store</code> menggunakan bahasa pemrograman Visual Basic 6 dan C# (.NET).</p>
<!-- more -->
<h3>Mengakses Data Key-Value Store</h3>
<p>Sebagai review untuk data yang tersimpan di <code>key-value store</code> bisa diakses via RESTful API (Web API) menggunakan <code>HTTP METHOD GET</code>. Adapun endpoint yang digunakan yaitu <code>/v1/kv/NAMA_KEY</code>. Contoh</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-01.png"></p>
<p>Informasi <code>endpoint</code> dan <code>HTTP METHOD</code> ini penting untuk dicatat karena berhubungan dengan kode program yang akan kita tulis di pembahasan berikutnya.</p>
<h3>Mengakses Data Key-Value Store Dari Visual Basic 6</h3>
<p>Sebagai contoh kasus kita akan membuat form login, di mana form login ini selain membutuhkan <code>user</code> dan <code>password</code> juga membutuhkan informasi <code>server</code>, <code>database</code> dan <code>port</code>. Khusus untuk informasi <code>server</code>, <code>database</code> dan <code>port</code> secara otomatis akan membaca data yang tersimpan di dalam <code>Key-Value Store</code>.</p>
<p>Untuk tampilannya kita buat yang sederhana aja ya :-D</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-02.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-03.png"></p>
<p>Karena data yang diakses berupa RESTful API (dokumen web), di Visual Basic 6 kita menggunakan library <code>Microsoft XML v6.0</code></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-04.png"></p>
<p>Setelah itu kita buat sebuah method dengan nama <code>GetRequest</code> untuk mengakses RESTful API dengan menggunakan library <code>Microsoft XML v6.0</code>.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-05.png"></p>
<p>Kemudian tambahkan lagi sebuah method dengan nama <code>LoadAppConfig</code>, di dalam method ini kita memanggil method <code>GetRequest</code> dan menampilkan hasilnya ke console. Agar method ini bisa dipangil secara otomatis, kita panggil method ini di event form load.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-06.png"></p>
<p>Jika berhasil, hasilnya seperti berikut:</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-07.png"></p>
<p>Nah dari gambar di atas, kita lihat bahwa hasil pemanggilan endpoint <code>Key-Value Store</code> ini mengembalikan data string dengan format <a href="https://www.json.org/">JSON</a>. Secara built-in VB6 tidak menyediakan library untuk mengolah data dengan format <a href="https://www.json.org/">JSON</a>, tapi untungnya di luar sana sudah ada yang berbaik hati membuatkan <a href="http://www.ediy.co.nz/vbjson-json-parser-library-in-vb6-xidc55680.html">librarynya</a>, sehingga mempermudah kita untuk mengolah data dengan format <a href="https://www.json.org/">JSON</a> menggunakan Visual Basic 6.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-08.png"></p>
<p>Setelah menambahkan library <a href="http://www.ediy.co.nz/vbjson-json-parser-library-in-vb6-xidc55680.html">VB-JSON</a> sekarang kita bisa langsung mengolah data <a href="https://www.json.org/">JSON</a>nya sebagai sebuah objek dan kemudian langsung menampilkan hasilnya ke dalam textbox <code>server</code>, <code>database</code> dan <code>port</code>. Berikut adalah hasil revisinya method <code>LoadAppConfig</code>nya:</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-09.png"></p>
<p>Ok sampai di sini, kita bisa langsung menjalankan aplikasi untuk melihat hasilnya. Setelah form loginnya tampil aktifkan tab Connection, di mana informasi server, database dan port sudah otomatis terisi sesuai dengan informasi <code>Key-Value Store</code> yang tersimpan di server consul.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-10.png"></p>
<p>Sudah tampil bukan?</p>
<p>Sekarang kita coba edit informasi db-confignya, melalui menu <code>Key/Value</code>, kemudian jalankan sekali lagi aplikasinya.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-11.png"></p>
<p>Nah secara otomatis perubahan data yang tersimpan di <code>Key-Value Store</code> juga akan terbaca oleh aplikasi.</p>
<h3>Mengakses Data Key-Value Store Dari C# (.NET)</h3>
<p>Untuk contoh berikutnya kita akan mengakses data <code>Key-Value Store</code> menggunakan bahasa pemrograman C# (.NET). Di C# saya biasanya menggunakan library <a href="https://www.nuget.org/packages/RestSharp/">RestSharp</a> untuk mengakses web api, selain itu kita juga membutuhkan library <a href="https://www.nuget.org/packages/Newtonsoft.Json">Newtonsoft.Json</a>, kenapa? Karena hasil dari pemanggilan web apinya berupa string dengan format json. Jadi kita membutuhkan library ini untuk mengkonversi string json ke objek class. Untuk menginstall kedua library ini Anda bisa menggunakan <a href="http://coding4ever.net/blog/categories/nuget/">Nuget Package Manager Console</a> dengan perintah berikut:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>Install-Package RestSharp -Version 105.2.3
</span><span class='line'>Install-Package Newtonsoft.Json -v 9.0.1
</span></code></pre></td></tr></table></div></figure>
<p>Setelah menginstall ke dua library di atas, langkah berikutnya adalah kita akan menambahkan class model terlebih dulu. Class model ini saya beri nama <code>AppConfig</code> agar nanti hasil dari pemanggilan webnya bisa langsung kita konversi ke objek class model ini dengan bantuan library <a href="https://www.nuget.org/packages/Newtonsoft.Json">Newtonsoft.Json</a>. Berikut contoh class model yang dibuat.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-15.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-12.png"></p>
<p>Pada gambar di atas, kita bisa lihat untuk struktur class modelnya dibuat menyesuaikan struktur json yang ada di <code>Key-Value Store</code>.</p>
<p>Setelah itu tambahkan kode berikut untuk pemanggilan web apinya.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-13.png"></p>
<p>Kemudian kita bisa langsung menjalankan aplikasi untuk melihat hasilnya. Setelah form loginnya tampil aktifkan tab Connection, di mana informasi server, database dan port sudah otomatis terisi sesuai dengan informasi <code>Key-Value Store</code> yang tersimpan di server consul.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190829-14.png"></p>
<h3>Kesimpulan</h3>
<p>Dengan menggunakan <a href="https://www.consul.io/">consul</a> sebagai pusat penyimpanan konfigurasi aplikasi, akan mempermudah kita ketika terjadi perubahan konfigurasi aplikasi yang selama ini biasanya disimpan secara lokalan. Jadi kita tidak perlu merubah konfigurasi lokal aplikasi satu per satu di pc/lapton klien.</p>
<p>Selamat mencoba :-)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Solusi Mengakses Database Lokal (IP Private) Secara Online]]></title>
<link href="http://coding4ever.net/blog/2019/08/25/solusi-mengakses-database-lokal-ip-private-secara-online/"/>
<updated>2019-08-25T16:00:03+07:00</updated>
<id>http://coding4ever.net/blog/2019/08/25/solusi-mengakses-database-lokal-ip-private-secara-online</id>
<content type="html"><![CDATA[<p><img class="left" src="https://coding4ever.files.wordpress.com/2019/08/websocket-logo.png" width="85" height="93">Salah satu tantangan bagi software developer untuk aplikasi bisnis berbasis desktop adalah ketika klien meminta untuk mengonlinekan database mereka. Karena memang rata-rata aplikasi desktop hanya digunakan untuk keperluan internal kantor/perusahaan.</p>
<p>Biasanya ada beberapa solusi yang bisa kita tawarkan, ketika klien menginginkan database lokal mereka (ip private) bisa diakses secara online, seperti:</p>
<!-- more -->
<ul>
<li>Upgrade paket internet, jika klien kita berlangganan paket internet indihome bisa upgrade ke paket enterprise, tapi klo berat dibiaya bisa langganan IP Dynamic Indihome. Apakah masalah sudah selesai sampai di sini? Engga juga sih, kita masih harus menyeting portforwarding dan setting-lainnya lainya.</li>
<li>Menggunakan software VPN seperti <a href="http://coding4ever.net/blog/2010/02/02/belajar-winsock-bagian-4-e28093-membuat-jaringan-vpn-sendiri/">Hamachi</a>, <a href="https://www.zerotier.com/">ZeroTier</a>, atau <a href="http://coding4ever.net/blog/2018/07/05/membuat-jaringan-vpn-menggunakan-softether-vpn-bagian-number-1/">SoftEther VPN</a>, tapi cara kedua ini akan mengurangi koneksi internet kita karena harus menyediakan jalur untuk koneksi VPNnya.</li>
<li>Menyewa layanan <code>Shared Hosting</code>, biaya langganannya juga lumayan murah, sekitar 100 ribuan pertahun. Dengan menyewa layanan <code>Shared Hosting</code> berarti kita harus membuat copyan database lokal untuk ditempatkan di <code>Shared Hosting</code> agar bisa diakses secara online. Tantangannya adalah kita harus membuat aplikasi kecil yang bertugas menyinkronkan database lokal dan database yang ada di <code>Shared Hosting</code>.</li>
<li>Membuat sendiri service yang berfungsi sebagai gateway yang bertugas menjembatani antara aplikasi klien dan database. Untuk cara yang terakhir ini kita membutuhkan sebuah server dengan ip public, contoh disini saya menyewa VPS dengan OS Linux (Ubuntu) di <a href="https://www.digitalocean.com/">digitalocean</a>.</li>
</ul>
<p>Nah dipostingan ini kita akan membahas solusi terakhir. Idenya adalah kita ingin memberikan kemudahan kepada klien/customer dalam menggunakan aplikasi yang kita buat, jadi dengan konfigurasi yang sangat minim sekali, aplikasi client bisa langsung konek ke database. Keuntungan lainnya adalah dengan cara ini bisa dijadikan lahan bisnis untuk layanan sewa server, jadi klo klien ingin databasenya bisa diakses secara online ya harus sewa server dulu hehehe :-D</p>
<p>Karena postingan kali ini adalah hasil dari riset komersil yang saya kerjakan, jadi saya hanya akan membahas tentang <code>arsitektur</code> dan <code>teknologi</code> yang digunakan, tanpa kode ya… :-D.</p>
<h3>Arsitektur Aplikasi</h3>
<p>Untuk arsitektur aplikasi yang digunakan seperti gambar berikut:</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/2019082507.png"></p>
<p>Keterangan gambar:</p>
<ol>
<li>Database yang diinstall di jaringan lokal, bisa database PostgreSql, FirebirdSql, SQL Server, MySQL, dan lain-lain. Tergantung database yang Anda gunakan.</li>
<li><p>WebSocketService – Aplikasi ini bisa diinstall secara terpisah atau satu mesin dengan database. Jadi aplikasi inilah yang terkoneksi langsung dengan database via jaringan lokal (LAN). Aplikasi ini dibuat menggunakan WinForm atau bisa juga berbasis windows service, intinya disesuaikan dengan kebutuhan Anda. Karena aplikasi ini menggunakan library <a href="https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-2.2">SignalR Core</a> untuk berkomunikasi dengan aplikasi WebSocketGateway yang ada di VPS, maka untuk menjalankan aplikasi ini minimal windows yang dibutuhkan adalah Windows 7 SP1 (.NET Framework 4.6.x).
<img class="center" src="https://coding4ever.files.wordpress.com/2019/08/2019082502.png"></p></li>
<li><p>WebSocketGateway – Aplikasi ini berfungsi sebagai WebSocket server, dibuat menggunakan ASP.NET Core. Selain bertugas untuk menghandle komunikasi via websocket (signalR), juga bertugas untuk menghandle komunikasi via http (web api). WebSocketGateway ini nantinya akan di deploy ke VPS dengan bantuan <a href="https://www.docker.com/">Docker</a>.
<img class="center" src="https://coding4ever.files.wordpress.com/2019/08/2019082503.png"></p></li>
<li><p>Aplikasi klien, bisa berupa desktop, web dan mobile. Aplikasi ini akan berkomunikasi dengan WebSocketGateway via web api (web service)
<img class="center" src="https://coding4ever.files.wordpress.com/2019/08/2019082504.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/2019082505.png"></p></li>
</ol>
<h3>Teknologi yang digunakan:</h3>
<ul>
<li>ASP.NET Core, teknologi ini saya gunakan karena VPS yang disewa berbasis linux (Ubuntu)</li>
<li>Websocket menggunakan <a href="http://coding4ever.net/blog/categories/signalr/">SignalR</a></li>
<li><a href="https://www.docker.com/">Docker</a> digunakan untuk mempermudah proses deploy aplikasi ASP.NET Corenya</li>
</ul>
<h3>Apa itu ASP.NET Core?</h3>
<p>ASP.NET Core adalah sebuah framework yang bisa digunakan untuk membangun sebuah layanan Web API berbasis teknologi .NET. Framework ini adalah versi open-source dari ASP.NET, yang bisa berjalan di berbagai platform seperti macOS, Linux, dan Windows.</p>
<p>Untuk informasi lebih lanjut mengenai ASP.NET Core bisa Anda baca di <a href="https://docs.microsoft.com/en-us/aspnet/core/?view=aspnetcore-2.2">sini</a>.</p>
<h3>Apa itu SignalR?</h3>
<p>SignalR adalah library yang memudahkan kita untuk menambahkan fungsi komunikasi real-time pada aplikasi yang kita kembangkan. Fungsi real-time di sini adalah kemampuan server melakukan pengiriman (push) konten atau data kepada client yang sudah terkoneksi ke server, sehingga server tidak perlu menunggu client untuk melakukan permintaan (request) data terbaru.</p>
<p>SignalR selain digunakan untuk pengembangan aplikasi web, juga bisa digunakan untuk platform lainnya seperti desktop (console dan windows form) ataupun mobile (windows phone, android dan iOS).</p>
<p>SignalR menyediakan API yang memungkinkan server memanggil fungsi/method yang dimiliki oleh client atau pun sebaliknya. Proses memanggil method secara remote ini dikenal dengan istilah remote procedure call (RPC).</p>
<p>Komunikasi antara client dan server SignalR dibangun di atas koneksi <a href="https://en.wikipedia.org/wiki/WebSocket">WebSocket</a>.</p>
<p>Beberapa waktu lalu saya pernah menulis implementasi SignalR untuk aplikasi berbasis windows yang bisa Anda baca di<a href="http://coding4ever.net/blog/categories/signalr/">sini</a>.</p>
<h3>Apa itu Docker?</h3>
<p>Docker adalah teknologi container yang memudahkan kita untuk melakukan proses <code>deployment</code> aplikasi ke berbagai platform (macOS, Linux, dan Windows). Untuk informasi lebih lanjut tentang Docker, bisa Anda baca di<a href="https://www.docker.com/">sini</a>.</p>
<h3>Demo Aplikasi</h3>
<p>Cara menghubungan aplikasi klien (desktop atau mobile) dengan WebSocketService sangat mudah, cukup menginputkan app id yang ditampilkan aplikasi WebSocketService pada tab Pengaturan. Setelah itu aplikasi klien Anda langsung terhubung ke database lokal.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/2019082506.png"></p>
<p>Jika Anda juga penasaran dengan cara kerja aplikasi ini, dan ingin mencoba langsung, bisa Anda download demonya di <a href="https://github.com/k4m4r82/demo-websocket-signalr">sini</a>.</p>
<p>Selamat mencoba :-)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Menyimpan Konfigurasi Aplikasi Secara Terpusat Menggunakan Consul Key-Value Store Bagian #1]]></title>
<link href="http://coding4ever.net/blog/2019/08/02/menyimpan-konfigurasi-terpusat-menggunakan-consul-key-value-store-bagian-number-1/"/>
<updated>2019-08-02T15:13:39+07:00</updated>
<id>http://coding4ever.net/blog/2019/08/02/menyimpan-konfigurasi-terpusat-menggunakan-consul-key-value-store-bagian-number-1</id>
<content type="html"><![CDATA[<p><img class="left" src="https://coding4ever.files.wordpress.com/2019/08/consul-logo.jpg" width="85" height="93">Cara apa yang biasa Anda gunakan untuk menyimpan konfigurasi aplikasi? Biasanya ada beberapa pilihan seperti menyimpan dalam format text (<a href="https://en.wikipedia.org/wiki/INI_file">INI</a>, <a href="https://en.wikipedia.org/wiki/XML">XML</a>, <a href="https://www.json.org/">JSON</a>), database atau langsung di hardcode di dalam kode program. Nah cara terakhir adalah yang paling ekstrim, jika terjadi perubahan konfigurasi aplikasi berarti kita harus merubah kode program dan melakukan kompilasi ulang :-D.</p>
<!-- more -->
<p>Konfigurasi lokalan ini memang sedikit merepotkan bagai programmer desktop, karana aplikasinya biasanya diinstall dibeberapa tempat sesuai dengan jumlah klien yang ada.</p>
<p>Konfigurasi apa saja sih yang biasanya diperlukan oleh sebuah aplikasi? Ini juga tergantung kebutuhan, biasanya yang paling umum itu ya konfigurasi yang berhubungan dengan database seperti, <em>ip server</em>, <em>nama database</em> dan <em>port</em> yang digunakan. Contoh:</p>
<div><script src='https://gist.github.com/acd0b3a14f3830fff0c603909ef4a097.js'></script>
<noscript><pre><code>[database]
server=192.168.1.1
database=DbOpenRetail
port=5432</code></pre></noscript></div>
<div><script src='https://gist.github.com/817ed3721c9d6a62e2a17b1e58f51129.js'></script>
<noscript><pre><code><?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="server" value="192.168.1.1" />
<add key="database" value="DbOpenRetail" />
<add key="port" value="5432" />
</appSettings>
</configuration></code></pre></noscript></div>
<div><script src='https://gist.github.com/872fa7d5e9775078e13c922c9e301cf4.js'></script>
<noscript><pre><code>{
"server": "192.168.1.1",
"database": "DbOpenRetail",
"port": 5432
}</code></pre></noscript></div>
<p>Pada contoh di atas konfigurasi aplikasi disimpan dengan berbagai format seperti <a href="https://en.wikipedia.org/wiki/INI_file">INI</a>, <a href="https://en.wikipedia.org/wiki/XML">XML</a> dan <a href="https://www.json.org/">JSON</a>.</p>
<p>Untuk aplikasi yang dibuat menggunakan VB6 biasanya akan menyimpan konfigurasi dengan format <a href="https://en.wikipedia.org/wiki/INI_file">INI</a>, sedangkan yang menggunakan .NET lebih senang menggunakan format <a href="https://en.wikipedia.org/wiki/XML">XML</a> atau <a href="https://www.json.org/">JSON</a>.</p>
<p>Jadi apapun pilihan format konfigurasi aplikasi yang Anda gunakan, ketika ada perubahan konfigurasi berarti kita harus merubah satu per satu konfigurasi lokal dari aplikasi kita yang sudah terinstall di pc/laptop klien, baik dilakukan secara langsung (datang ke lokasi) atau dengan bantuan tool remote seperti Radmin. Anda bayangkan saja klo pengguna aplikasi kita sudah ratusan bahkan ribuan, tentu akan menjadi pekerjaan yang merepotkan alias buang-buang waktu :-D</p>
<h3>Apa itu Consul?</h3>
<p><a href="https://www.consul.io/">Consul</a> adalah tool yang digunakan untuk keperluan discovery dan konfigurasi service. Tool ini mempunyai beberapa fitur utama yaitu:</p>
<ul>
<li>Service Discovery</li>
<li>Health Checking</li>
<li>Key/Value Store</li>
<li>Multi Datacenter</li>
</ul>
<p>Saya sendiri mencoba tool ini ketika mempelajari arsitektur <a href="https://microservices.io/">microservices</a> untuk keperluan monitoring service. Nah salah satu fitur tool ini yaitu <code>Key/Value Store</code> yang bisa kita gunakan untuk keperluan menyimpan konfigurasi aplikasi secara terpusat.</p>
<h3>Cara Menginstall Consul</h3>
<p>Cara installnya gampang, Anda tinggal <a href="https://www.consul.io/downloads.html">download</a> consul sesuai dengan versi OS yang Anda gunakan.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-01.png"></p>
<p>Contoh di sini saya mendownload consul versi Windows dan menyimpannya di folder c:\consul.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-02.png"></p>
<p>Setelah itu kita bisa langsung menjalankan consul dengan mode development.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-03.png"></p>
<p>Setelah jalan, kita bisa langsung mengakses web administrasi consul di alamat localhost:8500</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-04.png"></p>
<p>Menjalankan consul dengan mode development ini ada sedikit kekurangan yaitu perubahan data yang kita lakukan misal menambahkan data di menu <code>Key/Value</code> itu tidak tersimpan secara permanen, jadi kita akan menjalankan consul agent dengan mode production. Caranya adalah dengan menambahkan file konfigurasi, misal kita simpan di folder c:\consul\config dengan nama <code>consul.json</code>.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-05.png"></p>
<p>Kemudian untuk isinya seperti gambar berikut:</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-06-1.png"></p>
<p>Untuk element <code>bind_addr</code> diisi dengan ip pc/server dimana consul dijalankan. Dan untuk informasi lebih lanjut tentang bagaimana cara mengkonfigurasi consul, bisa anda cek di link <a href="https://www.consul.io/docs/agent/options.html">ini</a>.</p>
<p>Setelah itu kita jalankan kembali consul dengan mode production.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-07.png"></p>
<h3>Consul Key-Value Store</h3>
<p>Seperti yang sudah saya jelaskan di atas, salah satu fitur menarik yang dimiliki oleh consul yaitu <code>Key-Value Store</code>. Dengan fitur ini kita bisa menyimpan konfigurasi aplikasi secara terpusat di pc/server yang sudah terinstall consul. Jadi konfigurasi aplikasi kita yang awalnya tersimpan di lokalan, apakah itu menggunakan format <a href="https://en.wikipedia.org/wiki/INI_file">INI</a>, <a href="https://en.wikipedia.org/wiki/XML">XML</a> atau <a href="https://www.json.org/">JSON</a> bisa langsung kita pindah ke sini.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-08.png"></p>
<h3>Mengakses Data Key-Value Store</h3>
<p>Data yang tersimpan di <code>Key-Value Store</code> bisa diakses via RESTful API, untuk postingan <a href="http://coding4ever.net/blog/2019/08/02/menyimpan-konfigurasi-terpusat-menggunakan-consul-key-value-store-bagian-number-1/">pertama</a> ini kita akan menggunakan salah satu tool REST Client yaitu <a href="https://www.getpostman.com/downloads/">Postman</a> untuk mengakses data tersebut. Adapun endpoint yang digunakan yaitu <code>/v1/kv</code>.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-09.png"></p>
<p>Untuk response valuenya sudah diencoded menggunakan algoritma Base64, tapi jika ingin langsung menampilkan data aslinya kita tinggal tambahkan parameter <code>?raw=true</code>.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-10.png"></p>
<h3>Menambahkan token</h3>
<p>Kayaknya kurang aman klo semua orang bisa langsung mengakses endpoint <code>Key-Value Store</code> tersebut tanpa memasukan token terlebih dulu. Jadi kita bisa menambahkan token pada saat mengakses endpoint <code>Key-Value Store</code>. Caranya adalah dengan mengedit kembali file konfigurasi consulnya.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-11-1.png"></p>
<p>Setelah itu kita coba akses kembali untuk mengakses endpoint <code>Key-Value Store</code>nya tanpa token. Apakah masih bisa?</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-12.png"></p>
<p>Karna sudah tertolak, sekarang coba tambahkan parameter <code>?token</code> untuk mengakses endpointya.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2019/08/20190802-13.png"></p>
<p>Horeee berhasil :-)</p>
<p>Nah dengan adanya fitur <code>Key-Value Store</code> yang di miliki oleh <a href="https://www.consul.io/">Consul</a> ini, akan memudahkan kita jika terjadi perubahan konfigurasi aplikasi karena bisa dilakukan secara terpusat.</p>
<p>Mungkin cukup ya untuk postingan bagian <a href="http://coding4ever.net/blog/2019/08/02/menyimpan-konfigurasi-terpusat-menggunakan-consul-key-value-store-bagian-number-1/">pertama</a> ini, insyaAlloh di postingan <a href="http://coding4ever.net/blog/2019/08/31/menyimpan-konfigurasi-terpusat-menggunakan-consul-key-value-store-bagian-number-2/">berikutnya</a> kita akan bahas bagaimana mengakses data <code>Key-Value Store</code> langsung dari aplikasi yang dibuat menggunakan VB6 dan .NET.</p>
<p>Oh iya ada yang kelupaan, gimana caranya agar consul bisa diinstall sebagai service (windows service)? Gampang, Anda tinggal ikuti langkah-langkah yang ada di <a href="https://learn.hashicorp.com/consul/datacenter-deploy/windows">sini</a> :-D.</p>
<p>Selamat mencoba :-)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Membuat Jaringan VPN Menggunakan SoftEther VPN Bagian #1]]></title>
<link href="http://coding4ever.net/blog/2018/07/05/membuat-jaringan-vpn-menggunakan-softether-vpn-bagian-number-1/"/>
<updated>2018-07-05T14:50:45+07:00</updated>
<id>http://coding4ever.net/blog/2018/07/05/membuat-jaringan-vpn-menggunakan-softether-vpn-bagian-number-1</id>
<content type="html"><![CDATA[<p><img class="left" src="https://coding4ever.files.wordpress.com/2018/07/softethervpn-logo-small.png" width="85" height="93">Salah satu tantangan bagi kita, pengembang software untuk aplikasi bisnis berbasis desktop adalah ketika klien kita bertanya “Mas, databasenya kalau di taruh di server saja bisa ya? Jadi bisa di akses dari mana saja, soalnya butuh juga akses dari luar”, sedangkan kondisi database server mereka hanya mempunyai <code>ip private</code>. Solusi paling cepat dan murah (gratis) yang mungkin bisa kita tawarkan adalah dengan menggunakan software VPN. Ada banyak pilihan software VPN, mulai dari instalasinya yang gampang seperti <a href="https://www.vpn.net/">Hamachi</a> dan <a href="https://www.zerotier.com/">ZeroTier One</a> atau yang sedikit lebih ribet tapi menawarkan segudang fitur yang wah seperti <a href="https://www.softether.org/">SoftEther VPN</a>.</p>
<!-- more -->
<h3>Apa itu VPN?</h3>
<p><a href="https://en.wikipedia.org/wiki/Virtual_private_network">VPN (Virtual Private Network)</a> adalah koneksi private melalui jaringan publik (dalam hal ini internet) yang bersifat virtual, dengan kata lain tidak ada koneksi jaringan secara riil antara 2 atau lebih perangkat (bisa pc, laptop, dll) yang akan berhubungan. VPN bersifat private sehingga tidak semua orang bisa mengaksesnya. Data yang dikirimkan terenkripsi sehingga tetap rahasia meskipun menggunakan jaringan publik. Selain untuk masalah keamanan data, VPN juga bisa digunakan untuk membuat koneksi private dari rumah ke jaringan toko atau kantor misalnya, tanpa menggunakan ip publik, cukup akses internet saja.</p>
<p>Aslinya saya tidak terlalu tertarik dengan solusi software VPN, tapi ini hanya buat jaga-jaga saja. Seperti yang sudah saya jelaskan di bagian intro.</p>
<h3>Environment Test</h3>
<p>Pembuatan jaringan VPN ini menggunakan environment test sebagai berikut:</p>
<h4>Server VPN</h4>
<ul>
<li>Sistem Operasi: Windows 7</li>
<li>Software: <a href="http://www.softether-download.com/en.aspx?product=softether">SoftEther VPN Server</a></li>
<li>Relay Server: VPN Azure Cloud, layanan VPN gratis dari Microsoft</li>
</ul>
<h4>Client VPN</h4>
<ul>
<li>Sistem Operasi: Windows 7</li>
<li>Software: <a href="http://www.softether-download.com/en.aspx?product=softether">SoftEther VPN Client</a></li>
</ul>
<p>Selain Windows, <a href="https://www.softether.org/">SoftEther VPN</a> juga mendukung OS Linux, Mac, FreeBSD dan Solaris.</p>
<h3>Skema Jaringan</h3>
<p>Sebelum dimulai, kita lihat terlebih dulu skema jaringan yang saya gunakan untuk uji coba membuat jaringan VPN menggunakan SoftEther VPN.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-01.png"></p>
<p>Pada gambar di atas kita bisa melihat, untuk koneksi VPN dari pc/laptop klien ke server VPN kantor melewati VPN Azure Cloud. Apa itu VPN Azure Cloud? VPN Azure Cloud adalah layanan VPN gratis dari Microsoft, dengan menggunakan layanan VPN ini sebagai relay server kita bisa membuat server VPN cukup dengan menggunakan <code>ip private</code>. Jadi itu alasan kenapa di <a href="http://coding4ever.net/blog/2018/07/05/membuat-jaringan-vpn-menggunakan-softether-vpn-bagian-number-1/">postingan bagian pertama</a> ini kita menggunakan layanan VPN Azure Cloud.</p>
<h3>Instalasi SoftEther VPN Server</h3>
<h4>Langkah 1: Download SoftEther VPN versi Server</h4>
<p>Klik link <a href="http://www.softether-download.com/en.aspx?product=softether">download SoftEther VPN</a>, kemudian pilih <code>SoftEther VPN Server</code> di bawah drop-down list <code>Select Component</code>. Berikutnya di pilihan <code>Select Platform</code> pilih <code>Windows</code></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-02.png"></p>
<p>Versi terakhir saat postingan ini ditulis adalah versi (4.27, Build 9668, beta). Karna masih beta (artinya masih dalam tahap pengembangan dan tes), jadi saya akan menggunakan rilis stabil versi sebelumnya yaitu versi (4.25, Build 9656, rtm).</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-03.png"></p>
<p>Kemudian klik link <a href="http://www.softether-download.com/files/softether/v4.25-9656-rtm-2018.01.15-tree/Windows/SoftEther_VPN_Server_and_VPN_Bridge/softether-vpnserver_vpnbridge-v4.25-9656-rtm-2018.01.15-windows-x86_x64-intel.exe">SoftEther VPN Server and VPN Bridge (Ver 4.25, Build 9656, rtm)</a> untuk memulai proses download.</p>
<h4>Langkah 2: Instalasi SoftEther VPN versi Server</h4>
<p>Jalankan file EXE SoftEther VPN Server yang sudah didownload untuk memulai instalasi SoftEther VPN versi Server. Setelah instalasi berjalan untuk pertama kali akan tampil jendela welcome, klik tombol Next untuk melanjutkan instalasi.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-04.png"></p>
<p>Selanjutnya akan tampil jendela untuk memilih jenis <code>SoftEther VPN Server</code>.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-05.png"></p>
<p>Pilih SoftEther VPN Server kemudian klik tombol Next. Selanjutnya di jendela End User License Agreement, aktifkan pilihan I agree … , kemudian klik Next.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-06.png"></p>
<p>Kemudian klik tombol Next beberapa kali sampai proses instalasi SoftEther VPN Server dimulai.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-07.png"></p>
<p>Setelah instalasi selesai, di jendela Setup Finished, aktifkan pilihan Start the SoftEther VPN Server Manager kemudian klik tombol Finish.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-08.png"></p>
<h3>Konfigurasi SoftEther VPN Server</h3>
<h4>Langkah 1: Mengatur setting koneksi untuk SoftEther VPN Server</h4>
<p>Setelah proses instalasi selesai, akan tampil jendela SoftEther VPN Server Manager, kemudian klik tombol Connect.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-09.png"></p>
<p>Setelah itu akan diminta untuk menginputkan password administrator.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-10.png"></p>
<h4>Langkah 2: Memilih jenis SoftEther VPN Server</h4>
<p>Pada jendela ini kita aktifkan pilihan Remote Access VPN Server.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-11.png"></p>
<h4>Langkah 3: Konfigurasi Virtual Hub</h4>
<p>Jendela berikutnya adalah mengeset konfigurasi Virtual Hub. Penamaan Virtual Hub biasanya berdasarkan lokasi dari server, misal KANTOR-JOGJA-VPN.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-12.png"></p>
<h4>Langkah 4: Konfigurasi Dynamic DNS Function</h4>
<p>Jendela berikutnya adalah pengaturan Dynamic DNS Function. Di jendela ini Anda bisa menggunakan pengaturan default atau bisa juga mengganti nilai dari Dynamic DNS Hostname</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-13.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-14.png"></p>
<p>Jika gagal, ada kemungkinan Dynamic DNS Hostname sudah digunakan, Anda bisa mencoba Hostname yang lain. Setelah itu klik tombol Exit</p>
<h4>Langkah 5: Konfigurasi IPSec / L2TP / L2TPv3</h4>
<p>Untuk saat ini kita tidak perlu melakukan perubahan konfigurasi di jendela ini karna kita akan menggunakan layanan VPN Azure Cloud relay server sebagai layanan VPN gratis dari Microsoft.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-15.png"></p>
<p>Kecuali jika ingin menggunakan layanan VPS (Virtual Private Server) sendiri apakah berbasis windows atau linux, Anda harus mengaktifkan pilihan Enable L2TP Server Function, agar server VPNnya bisa diakses dari client.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-16.png"></p>
<h4>Langkah 6: Mengaktifkan layanan VPN Azure Cloud</h4>
<p>Langkah berikutnya adalah mengaktifkan layanan VPN Azure Cloud relay server sebagai layanan VPN gratis dari Microsoft.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-17.png"></p>
<p>Aktifkan pilihan Enable VPN Azure, kemudian tunggu sampai statusnya menjadi Connected. Untuk penamaan hostname VPN Azure, menyesuaikan dengan Konfigurasi Dynamic DNS Function (langkah 4).</p>
<h4>Langkah 7: Membuat User</h4>
<p>Langkah berikutnya adalah membuat user yang boleh mengakses server VPN. Pada langkah ini sangat penting untuk membuat kombinasi password yang kompleks mengingat hubungannya dengan keamanan server VPN Anda.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-18.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-19.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-20.png"></p>
<h4>Langkah 8: Konfigurasi Local Bridge</h4>
<p>Setelah berhasil membuat user, langkah berikutnya adalah mengeset konfigurasi Local Bridge dengan cara memilih network adapter dari daftar yang tersedia. Pilihlah network adapter yang terhubungan dengan jaringan lokal. Jangan memilih Wi-Fi adapter karena tidak direkomendasikan untuk membuat Local Bridge.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-21.png"></p>
<h4>Langkah 9: Mengaktifkan Konfigurasi SecureNAT (optional)</h4>
<p>Langkah ini sifatnya optional, jadi tergantung kondisi jaringan lokal dari server VPN Anda. Jika jaringan lokal dari server VPN mengaktifkan fungsi DHCP Server (ip dinamis) maka setting ini tidak perlu diaktifkan, sebaliknya jika jaringan lokal server VPN menggunakan ip statis, maka setting ini harus diaktifkan dengan mengklik tombol Manage Virtual Hub.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-22.png"></p>
<p>Kemudian klik tombol Virtual NAT and Virtual DHCP Server (SecureNAT)</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-23.png"></p>
<p>Untuk melihat konfigurasi default DHCP Server yang digunakan, klik tombol SecureNAT Configuration</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-24.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-25.png"></p>
<p>Anda bisa mengganti konfigurasi di atas sesuai dengan kebutuhan.</p>
<p>Kemudian klik tombol Enable SecureNAT untuk mengaktifkan konfigurasi SecureNAT</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-26.png"></p>
<h3>Instalasi SoftEther VPN Client</h3>
<h4>Langkah 1: Download SoftEther VPN versi Client</h4>
<p>Klik link <a href="http://www.softether-download.com/en.aspx?product=softether">download SoftEther VPN</a>, kemudian pilih <code>SoftEther VPN Client</code> di bawah drop-down list <code>Select Component</code>. Berikutnya di pilihan <code>Select Platform</code> pilih <code>Windows</code></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-27.png"></p>
<p>Kemudian download versi stabil pada saat postingan ini ditulis yaitu versi (4.25, Build 9656, rtm)</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-28.png"></p>
<p>Kemudian klik link <a href="http://www.softether-download.com/files/softether/v4.25-9656-rtm-2018.01.15-tree/Windows/SoftEther_VPN_Client/softether-vpnclient-v4.25-9656-rtm-2018.01.15-windows-x86_x64-intel.exe">SoftEther VPN Client (Ver 4.25, Build 9656, rtm)</a> untuk memulai proses download.</p>
<h4>Langkah 2: Instalasi SoftEther VPN versi Client</h4>
<p>Jalankan file EXE SoftEther VPN Client yang sudah didownload untuk memulai instalasi SoftEther VPN versi Client. Setelah instalasi berjalan untuk pertama kali akan tampil jendela welcome, klik tombol Next untuk melanjutkan instalasi.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-29.png"></p>
<p>Selanjutnya akan tampil jendela untuk memilih jenis <code>SoftEther VPN Client</code>.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-30.png"></p>
<p>Pilih SoftEther VPN Client kemudian klik tombol Next. Selanjutnya di jendela End User License Agreement, aktifkan pilihan I agree … , kemudian klik Next.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-31.png"></p>
<p>Kemudian klik tombol Next beberapa kali sampai proses instalasi SoftEther VPN Client dimulai.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-32.png"></p>
<p>Setelah instalasi selesai, di jendela Setup Finished, aktifkan pilihan Start the SoftEther VPN Client Manager kemudian klik tombol Finish.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-33.png"></p>
<h3>Konfigurasi SoftEther VPN Client</h3>
<h4>Langkah 1: Membuat Virtual Network Adapter</h4>
<p>Virtual Network Adapter digunakan oleh SoftEther VPN Client untuk melakukan koneksi ke server VPN. Cara untuk menambahkan Virtual Network Adapter dengan mengklik kanan list Virtual Network Adapter kemudian pilih New Virtual Network Adapter…</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-34.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-35.png"></p>
<p>Untuk saat ini kita menggunakan nama default saja, kemudian klik tombol Ok. Setelah itu akan tampil jendela proses pembuatan Virtual Network Adapter.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-36.png"></p>
<p>Virtual Network Adapter berhasil ditambahkan.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-37.png"></p>
<h4>Langkah 2: Membuat Koneksi VPN</h4>
<p>Klik ganda item Add VPN Connection</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-38.png"></p>
<p>Setelah itu akan tampil jendela New VPN Connection setting</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-39.png"></p>
<p>Untuk informasi <code>Host Name</code>, <code>Port Number</code> dan <code>Virtual Hub Name</code>, nilainya disesuaikan dengan konfigurasi SoftEther Server Manager</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-40.png"></p>
<p>Selanjutnya klik tombol Advanced Settings …</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-41.png"></p>
<p>Kemudian lakukan perubahan konfigurasi seperti berikut.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-42.png"></p>
<p>Sampai di sini semua konfigurasi sudah selesai baik di sisi server maupun klien.</p>
<h4>Langkah 3: Tes Koneksi VPN</h4>
<p>Untuk melakukan tes koneksi VPN, klik ganda item Koneksi VPN Kantor Jogja.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-43.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-44.png"></p>
<p>Tunggu beberapa saat, dan jika berhasil status koneksi VPN menjadi Connected</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2018/07/20180705-45.png"></p>
<p>Setelah terkoneksi ke server VPN, kita bisa melakukan beberapa tes, misal:</p>
<ol>
<li>Melakukan <code>ping</code> ke beberapa pc yang ada di kantor.</li>
<li>Melakukan <code>remote</code> menggunakan RDC (Remote Desktop Connection).</li>
<li>Atau query langsung ke server database.</li>
</ol>
<p>Dan jika berhasil, selamat !!!, Anda sudah mempunyai server VPN sendiri dan bisa mengakses jaringan internal kantor dari mana saja.</p>
<h3>Kesimpulan</h3>
<p>Dengan menggunakan software <a href="https://www.softether.org/">SoftEther VPN</a> dan layanan VPN Azure Cloud dari Microsoft, proses pembuatan server VPN menjadi mudah cukup menggunakan <code>ip private</code> dengan biaya 0 rupiah.</p>
<p>Selamat Mencoba :-)</p>
<p>Referensi:</p>
<ul>
<li><a href="https://www.softether.org/">https://www.softether.org/</a></li>
<li><a href="http://www.vpnazure.net/en/">http://www.vpnazure.net/en/</a></li>
</ul>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[GitLab CI Untuk .NET Developer Bagian #2]]></title>
<link href="http://coding4ever.net/blog/2017/09/09/gitlab-ci-untuk-net-developer-bagian-number-2/"/>
<updated>2017-09-09T22:17:36+07:00</updated>
<id>http://coding4ever.net/blog/2017/09/09/gitlab-ci-untuk-net-developer-bagian-number-2</id>
<content type="html"><![CDATA[<p><img class="left" src="https://coding4ever.files.wordpress.com/2017/08/gitlabci.png">Melanjutkan pembahasan tentang <a href="http://coding4ever.net/blog/categories/continuous-integration/">Continuous Integration</a> menggunakan <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a>. Di <a href="http://coding4ever.net/blog/2017/08/30/gitlab-ci-untuk-net-developer-bagian-number-1/">postingan</a> sebelumnya kita sudah melakukan konfigurasi <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> dengan menambahkan file <a href="https://gist.github.com/k4m4r82/f88e4bb02eb8ade0d9d049a07ec6ee30">.gitlab-ci.yml</a>.</p>
<p>Di konfigurasi awal ini kita sudah menambahkan dua job yang bertugas untuk merestore paket nuget dan melakukan proses build. Berikutnya kita akan menambahkan satu job lagi yang bertugas untuk membuat paket instalasi menggunakan <a href="http://coding4ever.net/blog/categories/inno-setup/">Inno Setup</a> jika job pertama dan kedua berhasil dijalankan. Nah dengan menggunakan CI semua proses ini bisa dilakukan secara otomatis dan terpusat, sehingga kita mempunyai histori hasil build dari waktu ke waktu. Jadi untuk mencari file setup/paket installer terakhir enggak usah lagi nanya ke developer karena bisa langsung kita download dari server CI-nya.</p>
<!-- more -->
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-07.png"></p>
<h3>Inno Setup</h3>
<p><a href="http://jrsoftware.org/">Inno Setup</a> adalah tool yang digunakan untuk membuat <a href="http://coding4ever.net/blog/categories/tools-installer/">paket installer</a> yang gratis dan open source. Selain <a href="http://jrsoftware.org/">Inno Setup</a>, kita juga bisa menggunakan <a href="http://coding4ever.net/blog/categories/tools-installer/">tool installer</a> lainnya seperti <a href="http://nsis.sourceforge.net/">NSIS</a>. Untuk informasi lebih lanjut tentang <a href="http://jrsoftware.org/">Inno Setup</a> dan <a href="http://nsis.sourceforge.net/">NSIS</a> bisa langsung ke <a href="http://coding4ever.net/blog/categories/inno-setup/">sini</a> dan <a href="http://coding4ever.net/blog/categories/nsis/">sini</a>.</p>
<p>Jadi di postingan kali ini kita akan menggunakan <a href="http://jrsoftware.org/">Inno Setup</a> untuk keperluan pembuatan file setup/paket installer. Sebagai contoh, berikut adalah skrip <a href="http://jrsoftware.org/">Inno Setup</a> yang digunakan untuk membuat file setup/paket installer untuk project <a href="https://gitlab.com/rudi.krsoftware/Northwind">Northwind</a> yang kita gunakan sebagai contoh project.</p>
<div><script src='https://gist.github.com/5eee78a4609377dcce794683958b9147.js'></script>
<noscript><pre><code>#define AppName 'Northwind App'
#define AppDir 'Northwind'
#define BuildDir 'src\Northwind.ConsoleApp\bin\Debug'
#define AppExeName 'Northwind.ConsoleApp.exe'
#define AppVendorName 'KR Software'
#define AppCopyright 'Copyright © 2016. ' + AppVendorName
#define AppURL 'http://coding4ever.net/'
#define AppVersion GetFileVersion('src\Northwind.ConsoleApp\bin\Debug\' + AppExeName)
[Setup]
AppName={#AppName}
AppVerName={#AppName} Versi {#AppVersion}
AppPublisher={#AppVendorName}
AppVersion={#AppVersion}
AllowCancelDuringInstall = yes
DefaultDirName={pf}\{#AppVendorName}\{#AppDir}
DefaultGroupName={#AppVendorName}
Compression = lzma
SolidCompression = yes
OutputDir=.
OutputBaseFilename=Setup-v{#AppVersion}
AllowNoIcons = yes
AlwaysRestart = no
AlwaysShowComponentsList = no
DisableProgramGroupPage = yes
AppendDefaultDirName = yes
CreateUninstallRegKey = yes
DisableStartupPrompt = yes
LanguageDetectionMethod=none
ShowLanguageDialog=no
UsePreviousLanguage=no
Uninstallable = yes
UninstallFilesDir={app}\uninst
UninstallDisplayIcon={app}\{#AppExeName},0
UninstallDisplayName={#AppName}
WindowVisible = no
AppCopyright={#AppCopyright}
FlatComponentsList = yes
PrivilegesRequired = admin
VersionInfoVersion={#AppVersion}
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: checkedonce
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
[Files]
;My Application Runtime
Source: {#BuildDir}\*.config; DestDir: {app}; Flags: ignoreversion
Source: {#BuildDir}\*.exe; DestDir: {app}; Flags: ignoreversion
Source: {#BuildDir}\*.dll; DestDir: {app}; Flags: ignoreversion
[Icons]
Name: {group}\{#AppName}; Filename: {app}\{#AppExeName}; WorkingDir: {app}
Name: {userdesktop}\{#AppName}; Filename: {app}\{#AppExeName}; WorkingDir: {app}; Tasks: desktopicon
[Code]
procedure AboutButtonOnClick(Sender: TObject);
begin
MsgBox('{#AppName}' #13#13 '{#AppCopyright}' #13 '{#AppURL}', mbInformation, mb_Ok);
end;
procedure CreateAboutButtonAndURLLabel(ParentForm: TSetupForm; CancelButton: TNewButton);
var
AboutButton: TNewButton;
begin
AboutButton := TNewButton.Create(ParentForm);
AboutButton.Left := ParentForm.ClientWidth - CancelButton.Left - CancelButton.Width;
AboutButton.Top := CancelButton.Top;
AboutButton.Width := CancelButton.Width;
AboutButton.Height := CancelButton.Height;
AboutButton.Caption := '&About...';
AboutButton.OnClick := @AboutButtonOnClick;
AboutButton.Parent := ParentForm;
end;
procedure InitializeWizard();
begin
CreateAboutButtonAndURLLabel(WizardForm, WizardForm.CancelButton);
end;</code></pre></noscript></div>
<p>Skrip Inno Setup ini kita tambahkan ke folder yang sama dengan folder source code kemudian kita simpan juga ke repository git.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-01.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-02.png"></p>
<h3>Menambahkan Job untuk Membuat Paket Instalasi</h3>
<p>Setelah menambahkan file <a href="https://gist.github.com/k4m4r82/5eee78a4609377dcce794683958b9147">Inno Setup</a>, langkah berikutnya adalah kita mengedit file <a href="https://gist.github.com/k4m4r82/f88e4bb02eb8ade0d9d049a07ec6ee30">.gitlab-ci.yml</a> untuk menambahkan job baru yang bertugas untuk mengeksekusi file <a href="https://gist.github.com/k4m4r82/5eee78a4609377dcce794683958b9147">setup.iss</a></p>
<p>Berikut isi file <a href="https://gist.github.com/k4m4r82/f88e4bb02eb8ade0d9d049a07ec6ee30">.gitlab-ci.yml</a> yang sudah kita edit:</p>
<div><script src='https://gist.github.com/d07cb047d26f2df4778606c48db35b14.js'></script>
<noscript><pre><code>variables:
MsBuildPath: "C:\\Program Files (x86)\\MSBuild\\12.0\\Bin\\MSBuild.exe"
NugetPath: "C:\\GitLab-Runner\\NuGet\\nuget.exe"
InnoSetupPath: "C:\\Program Files (x86)\\Inno Setup 5\\ISCC.exe" # tambah var InnoSetupPath
SolutionName: "Northwind.sln"
stages: # tipe dari job
- restore # stage untuk merestore paket nuget
- build # stage untuk proses build
- setup # stage untuk proses eksekusi skrip inno setup
cache:
untracked: true
paths:
- lib # folder hasil restore nuget package
restore_nuget_package: # job 1
stage: restore
script:
- echo "Sedang merestore paket nuget untuk %SolutionName%..."
- '"%NugetPath%" restore "src\%SolutionName%"'
build_solution: # job 2
stage: build
script:
- echo "Sedang melakukan proses build untuk %SolutionName%..."
- '"%MsBuildPath%" "src\%SolutionName%"'
create_file_setup: # job 3
stage: setup
script:
- echo "Sedang membuat file setup untuk %SolutionName%..."
- '"%InnoSetupPath%" "setup.iss"'
artifacts: # upload file setup
name: "Setup"
when: on_success
paths:
- Setup-v*.exe</code></pre></noscript></div>
<p>Coba perhatikan skrip di atas, di baris ke-4 kita menambahkan variabel <code>InnoSetupPath</code> yang isinya adalah lokasi file ISCC.exe yang digunakan untuk mengompile skrip <a href="https://gist.github.com/k4m4r82/5eee78a4609377dcce794683958b9147">inno setup</a>. Kemudian di baris ke-10 kita menambahkan stage baru dengan nama <code>setup</code> yang digunakan untuk job baru yang akan kita tambahkan yaitu job <code>create_file_setup</code>. Terakhir di baris ke-29, kita menambahkan job baru dengan nama <code>create_file_setup</code>. Job ini akan melakukan proses kompilasi skrip <a href="https://gist.github.com/k4m4r82/5eee78a4609377dcce794683958b9147">inno setup</a> menjadi file setup/paket instalasi (baris ke-33), kemudian mengupload ke server GitLab. Untuk keperluan upload ini, kita menambahkan keyword <a href="https://docs.gitlab.com/ee/user/project/pipelines/job_artifacts.html">artifacts</a> masih di job <code>create_file_setup</code>, kemudian diikuti dengan beberapa konfigurasi. <a href="https://docs.gitlab.com/ee/user/project/pipelines/job_artifacts.html">Artifact</a> adalah output dari proses build, bisa berupa file exe, dll atau file dengan ekstensi lainnya</p>
<p>Setelah itu simpan perubahan file <a href="https://gist.github.com/k4m4r82/d07cb047d26f2df4778606c48db35b14">.gitlab-ci.yml</a> ke repository git.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-03.png"></p>
<p>Kemudian langsung di push, untuk melihat apakah semua job (restore, build dan pembuatan paket instalasi) berhasil dijalankan.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-04.png"></p>
<p>Tunggu beberapa saat, kemudian cek link <a href="https://gitlab.com/rudi.krsoftware/Northwind/pipelines">Pipelines</a> untuk melihat status <a href="https://gitlab.com/rudi.krsoftware/Northwind/pipelines">Pipelines</a> yang sedang dijalankan.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-05.png"></p>
<p><a href="https://docs.gitlab.com/ee/ci/pipelines.html">Pipelines</a> digunakan untuk mengelompokkan job. Jika ingin melihat job apa saja yang ada di dalam <a href="https://docs.gitlab.com/ee/ci/pipelines.html">Pipelines</a>, kita tinggal klik aja link statusnya.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-06.png"></p>
<p>Jika sudah selesai, kita bisa melihat link download <code>artifacts</code> di kolom terakhir.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-07.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-08.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/09/20170909-09.png"></p>
<p>Selesai…, untuk contoh lengkap hasil buildnya bisa Anda cek di <a href="https://gitlab.com/rudi.krsoftware/Northwind/pipelines">sini</a></p>
<p>Selamat <a href="https://gitlab.com/rudi.krsoftware/Northwind">MENCOBA</a> :-)</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[GitLab CI Untuk .NET Developer Bagian #1]]></title>
<link href="http://coding4ever.net/blog/2017/08/30/gitlab-ci-untuk-net-developer-bagian-number-1/"/>
<updated>2017-08-30T12:32:47+07:00</updated>
<id>http://coding4ever.net/blog/2017/08/30/gitlab-ci-untuk-net-developer-bagian-number-1</id>
<content type="html"><![CDATA[<p><img class="left" src="https://coding4ever.files.wordpress.com/2017/08/gitlabci.png">Sudah hampir setahun saya menggunakan <a href="http://coding4ever.net/blog/categories/jenkins/">Jenkins</a> sebagai tool/software CI <a href="http://coding4ever.net/blog/categories/continuous-integration/">Continuous Integration</a>. Ada banyak manfaat yang saya rasakan terutama untuk mengurangi pekerjaan-pekerjaan <code>sepele</code> tapi <code>berulang</code> seperti pembuatan paket instalasi, upload updatean terbaru ke server atau deploy web api/service ke server development atau production. Dengan menggunakan software CI(<a href="http://coding4ever.net/blog/categories/continuous-integration/">Continuous Integration</a>) seperti <a href="http://coding4ever.net/blog/categories/jenkins/">Jenkins</a> pekerjaan-pekerjaan membosankan tersebut bisa dilakukan hanya dengan mengklik satu tombol atau bisa juga dibuat otomatis ketika kita mem-push perubahan source code ke repository git. Waktu yang dibutuhkan juga biasanya tidak lama sekitar 1-3 menit, ya tergantung besar atau kecilnya project yang akan dibuild/deploy.</p>
<!-- more -->
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-011.png"></p>
<p>Selain itu dari sisi dokumentasi juga ikut terbantu, karena tool seperti <a href="http://coding4ever.net/blog/categories/jenkins/">Jenkins</a> dan dengan bantuan pluginnya bisa otomatis mengenerate history build dari waktu ke waktu.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-021.png"></p>
<p>Tapi pada postingan kali ini saya ingin membahas tool/software CI(<a href="http://coding4ever.net/blog/categories/continuous-integration/">Continuous Integration</a>) yang lain yaitu <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a>. Beberapa hari ini saya menyempatkan untuk mencoba <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> dan kesimpulannya ada beberapa kelebihan <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> dibandingkan <a href="http://coding4ever.net/blog/categories/jenkins/">Jenkins</a> yaitu:</p>
<ul>
<li><a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> sudah terintegrasi dengan <a href="https://gitlab.com/">GitLab </a>. <a href="https://gitlab.com/">GitLab </a> adalah layanan cloud untuk repository git, jadi mirip dengan <a href="http://github.com/">github</a> atau <a href="http://bitbucket.org/">bitbucket</a>. Kelebihan gitlab dibandingkan dengan github dan bitbucket adalah untuk layanan gratisnya tidak ada pembatasan jumlah tim atau jumlah repository private yang bisa dibuat. Sedangkan untuk <a href="http://coding4ever.net/blog/categories/jenkins/">Jenkins</a> repository gitnya harus diinstall terpisah atau menggunakan layanan repository git yang sudah ada seperti gitlab, github atau bitbucket.</li>
<li>Konfigurasi Job di <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> lebih sederhana dibandingkan <a href="http://coding4ever.net/blog/categories/jenkins/">Jenkins</a>. Konfigurasi job <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> menggunakan file text biasa dengan format <a href="https://en.wikipedia.org/wiki/YAML">YAML</a>, sehingga file konfigurasi ini bisa kita tambahkan ke repository git.</li>
<li>Satu konfigurasi <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> sudah bisa digunakan untuk beberapa <a href="https://docs.gitlab.com/ee/ci/yaml/#jobs">job</a> dan <a href="https://docs.gitlab.com/ee/ci/yaml/README.html#stages">stage</a> sedangkan dengan <a href="http://coding4ever.net/blog/categories/jenkins/">Jenkins</a> kita harus membuat beberapa job untuk masing-masing stage (<a href="https://en.wiktionary.org/wiki/CMIIW">CMIIW</a>).</li>
<li>Penggunaan <a href="http://coding4ever.net/blog/categories/jenkins/">Jenkins</a> sangat cocok untuk keperluan internal kantor, jadi jika ingin digunakan secara public (di akses via internet) harus menyediakan mesin khusus yang mempunyai ip public atau bisa juga menggunakan VPS. Sedangkan untuk <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> sendiri kita cukup menyediakan mesin yang mempunyai akses internet dan tidak harus mempunyai ip public.</li>
<li>Apalagi ya…, silahkan dicoba sendiri he he :-D</li>
</ul>
<h3>Continuous Integration</h3>
<p>Sebelum kita lanjut ke pembahasan <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a>, saya ingin mereview kembali apa yang dimaksud dengan CI (<a href="http://coding4ever.net/blog/categories/continuous-integration/">Continuous Integration</a>). <a href="http://coding4ever.net/blog/categories/continuous-integration/">Continuous Integration</a>, untuk selanjutnya kita sebut CI saja, merupakan salah satu kegiatan untuk meningkatkan produktivitas dalam pengembangan aplikasi di mana seluruh hasil kerja (source code) dari masing-masing developer digabungkan (push) ke dalam satu wadah (server repository source code). Bisa sekali sehari, bisa juga beberapa kali dalam sehari. Setiap penggabungan source code akan diverifikasi secara otomatis oleh server CI, yang memungkinkan tim untuk mendeteksi secara dini jika ada masalah/konflik/error pada saat penggabungan source code.</p>
<p>Setelah penggabungan hasil kerja (source code) selesai, server CI otomatis akan melakukan proses build untuk memastikan tidak ada kode yang merusak/membuat proses build gagal. Jadi semakin cepat kegagalan build ini diketahui semakin cepat pula kita meresponnya. Dan jika proses build-nya berhasil akan dilanjutkan dengan proses deploy. Selain itu server CI juga bisa dikonfigurasi untuk melakukan proses lain seperti menjalankan unit testing, integration testing dan testing otomatis lainnya.</p>
<p>Sebagai .NET developer kita sudah biasa melakukan proses build dengan menekan tombol F5 (Start Debugging) atau Ctrl+F5 (Start Without Debugging) baik pada waktu development atau perbaikan bug. Sedangkan untuk contoh deploy anggap saja seperti kita membuat paket installer yang akan didistribusikan ke komputer/server klien. Nah dengan menggunakan CI semua proses ini bisa dilakukan secara otomatis dan terpusat, sehingga kita mempunyai arsip hasil build dan deploy dari waktu ke waktu. Jadi untuk mencari file setup/paket installer terakhir enggak usah lagi nanya ke developer karena bisa langsung kita download dari server CI-nya.</p>
<p>Proses build ini selain bisa dibuat otomatis setiap kita mem-push source code ke server repository bisa juga kita buatkan jadwalnya, misal pas jam makan siang atau jam pulang kantor. Jadi di kantor dibuat kesepakatan/aturan klo ada yang merusak build pas jam makan siang enggak boleh makan siang sampai proses build-nya berhasil atau yang merusak build pas jam pulang kantor enggak boleh pulang sampai proses build-nya berhasil :-D</p>
<p>Jadi dengan menggunakan CI, alur kerja kita lebih kurang seperti berikut :</p>
<ul>
<li>Menulis kode, build dan tes di komputer masing-masing (seperti biasa).</li>
<li>Commit dan push kode ke server repository/source control seperti GIT atau SVN.</li>
<li>Server CI akan meng-clone/pull repository kemudian melakukan build, menjalankan tes otomatis (jika ada) dan deploy secara otomatis. Jika buildnya gagal ulangi lagi langkah pertama.</li>
</ul>
<p>Nah mudah-mudahan sampai di sini sudah punya gambaran ya tentang apa itu <a href="http://coding4ever.net/blog/categories/continuous-integration/">Continuous Integration</a> dan bagaimana cara kerjanya.</p>
<h3>Apa saja yang perlu dipelajari ?</h3>
<p>Untuk belajar CI, tentu saja ada pengetahun penunjang yang perlu Anda pelajari yaitu penggunaan <a href="https://en.wikipedia.org/wiki/Version_control">Source/Version Control</a> terutama <a href="https://git-scm.com/">GIT</a> dan aplikasi GIT Client seperti <a href="https://tortoisegit.org/download/">TortoiseGit</a>. Pengetahun lainnya adalah pembuatan paket instalasi menggunakan <a href="http://coding4ever.net/blog/categories/inno-setup/">Inno Setup</a> untuk aplikasi desktop atau bisa juga pengetahuan mendeploy web api/service ke server.</p>
<h3>GitLab CI</h3>
<p><a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> adalah salah satu tool/software <a href="http://coding4ever.net/blog/categories/continuous-integration/">Continuous Integration</a> gratis yang merupakan bagian dari <a href="https://about.gitlab.com/">GitLab</a>. <a href="https://about.gitlab.com/">GitLab</a> sendiri merupakan layanan cloud repository git, jadi mirip dengan <a href="http://github.com/">github</a> atau <a href="http://bitbucket.org/">bitbucket</a>. Kelebihan dari <a href="https://about.gitlab.com/">GitLab</a> ini sendiri, untuk versi gratisnya tidak dibatasi seperti halnya <a href="http://github.com/">github</a> dan <a href="http://bitbucket.org/">bitbucket</a>. Jadi dengan versi gratisnya tidak ada pembatasan jumlah private repository yang bisa kita buat ataupun jumlah tim yang terlibat. Menarik bukan untuk sebuah layanan cloud repository git yang gratis.</p>
<p><a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> sendiri kalo kita lihat lebih mirip dengan sebuah dashboard untuk mengelola job dan log hasil buildnya. Jadi aslinya yang melakukan build dan deploy itu bukanlah <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> tapi tool lain yang disebut dengan <a href="https://docs.gitlab.com/runner/#using-gitlab-runner">GitLab Runner</a>. <a href="https://docs.gitlab.com/runner/#using-gitlab-runner">GitLab Runner</a> ini harus kita install di mesin (pc/server) yang mempunyai akses internet agar bisa terhubung ke service <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a>. Mesin untuk <a href="https://docs.gitlab.com/runner/#using-gitlab-runner">GitLab Runner</a> tidak harus mempunyai ip public yang penting terkoneksi dengan internet.</p>
<p>Idenya sederhana tapi brilian, dengan konsep seperti ini akan menghemat resource dari server <a href="https://about.gitlab.com/">GitLab</a> itu sendiri, karena semua resource yang dibutuhkan untuk proses build dan deploy di tanggung oleh mesin dari user/developer. Tapi dari sisi user/developer juga diuntungkan karena mesin untuk build dan deploynya adalah milik kita sendiri, sehingga kita punya akses full untuk setup/konfigurasi tool/software apa saja yang dibutuhkan untuk proses build dan deploy tersebut.</p>
<h3>GitLab Runner</h3>
<p><a href="https://docs.gitlab.com/runner/#using-gitlab-runner">GitLab Runner</a> adalah tool/software yang bertugas untuk menjalankan job dan mengirimkan kembali hasilnya ke <a href="https://about.gitlab.com/">GitLab</a>, nah data-data inilah yang akan diolah oleh <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a>.</p>
<p>GitLab Runner bisa diinstall untuk GNU/Linux, macOS, FreeBSD, dan Windows.</p>
<h4>Instalasi GitLab Runner</h4>
<p><a href="https://docs.gitlab.com/runner/install/windows.html">Instalasi GitLab Runner</a> sendiri sangat mudah, ditambah dengan dokumentasi yang lengkap. Jadi seharusnya Anda tidak akan mendapatkan masalah untuk langkah-langkah instalasinya. Untuk petunjuknya bisa ada cek di <a href="https://docs.gitlab.com/runner/install/windows.html">sini</a>.</p>
<p>Untuk memastikan instalasinya GitLab Runnernya berhasil, silahkan Anda cek service GitLab Runnernya.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-03.png"></p>
<p>Selain menginstall <a href="https://docs.gitlab.com/runner/install/">GitLab Runner</a>, kita juga perlu menginstall beberapa tool pendukung seperti:</p>
<ul>
<li>.NET Framework 4.0, 4.5.x</li>
<li><a href="https://www.microsoft.com/en-us/download/details.aspx?id=48159">Microsoft Build 2015</a></li>
<li>Source/version control <a href="https://git-scm.com/">Git</a></li>
<li>Pembuat paket installer seperti <a href="http://www.jrsoftware.org/">Inno Setup</a></li>
<li><a href="https://www.nuget.org/downloads">Nuget</a> untuk merestore paket nuget</li>
<li>FTP Client seperti <a href="https://winscp.net/eng/index.php">WinSCP</a></li>
</ul>
<p>Intinya semua tool pendukung di atas, diinstall sesuai dengan kebutuhan environment development.</p>
<h4>Mendaftarkan Repository ke GitLab Runner</h4>
<p>Setelah instalasi GitLab Runner, berikutnya adalah mendaftarkan repository git ke GitLab Runner. Berikut langkah-langkahnya:</p>
<p><strong>Langkah 1</strong>. Login ke <a href="https://about.gitlab.com/">GitLab</a>, klo belum punya ya silahkan daftar terlebih dulu.</p>
<p><strong>Langkah 2</strong>. Buat repository baru</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-04.png"></p>
<p><strong>Langkah 3</strong>. Setelah membuat repositorynya berhasil, klik link <code>Settings</code> -> <code>Pipelines</code></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-05.png"></p>
<p>Scroll ke bawah sedikit, kemudian catat informasi <code>Specific Runners</code> untuk poin 2 dan 3.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-06.png"></p>
<p>Kemudian di bagian <code>Shared Runners</code> klik tombol <code>Disable shared Runners</code></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-07.png"></p>
<p><strong>Langkah 4</strong>. Berikutnya adalah mengaktifkan <code>Command Prompt</code> dengan mode <code>Administrator</code> kemudian masuk ke folder instalasi GitLab Runner</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-08.png"></p>
<p>Setelah itu ketik perintah <code>gitlab-runner register</code>, kemudian tinggal jawab pertanyaan yang ada termasuk informasi <code>Specific Runners</code> yang kita dapatkan di <code>langkah 3</code>.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-09.png"></p>
<p>Jika proses registrasinya berhasil, kita bisa cek runner aktifnya dibawah informasi <code>Specific Runners</code></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-10.png"></p>
<h3>Contoh Project</h3>
<p>Untuk keperluan uji coba kali ini saya menggunakan contoh aplikasi Northwind yang bisa Anda download di <a href="https://github.com/k4m4r82/RepositoryPattern">sini</a>. Setelah itu kita <code>push</code> source codenya ke link repository gitlab yang sudah kita buat di langkah-langkah sebelumnya.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-11.png"></p>
<p>Dan untuk proses <code>push</code>-nya saya menggunakan <a href="https://tortoisegit.org/download/">TortoiseGit</a>.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-12.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-13.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-14.png"></p>
<h3>Menambahkan file .gitlab-ci.yml</h3>
<p>Untuk melakukan konfigurasi <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a>, kita perlu menambahkan file dengan nama <a href="https://docs.gitlab.com/ee/ci/yaml/">.gitlab-ci.yml</a>. File ini adalah file text biasa yang menggunakan format <a href="https://en.wikipedia.org/wiki/YAML">YAML</a>, sehingga file konfigurasi ini bisa kita tambahkan ke folder source code kemudian kita simpan juga ke repository git.</p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-15.png"></p>
<p><img class="center" src="https://coding4ever.files.wordpress.com/2017/08/20170830-161.png"></p>
<p>Berikut contoh isi file <code>.gitlab-ci.yml</code></p>
<div><script src='https://gist.github.com/f88e4bb02eb8ade0d9d049a07ec6ee30.js'></script>
<noscript><pre><code>variables:
MsBuildPath: "C:\\Program Files (x86)\\MSBuild\\12.0\\Bin\\MSBuild.exe"
NugetPath: "C:\\GitLab-Runner\\NuGet\\nuget.exe"
SolutionName: "Northwind.sln"
stages: # tipe dari job
- restore # stage untuk merestore paket nuget
- build # stage untuk proses build
cache:
untracked: true
paths:
- lib # folder hasil restore nuget package
restore_nuget_package: # job 1
stage: restore
script:
- echo "Sedang merestore paket nuget untuk %SolutionName%..."
- '"%NugetPath%" restore "src\%SolutionName%"'
build_solution: # job 2
stage: build
script:
- echo "Sedang melakukan proses build untuk %SolutionName%..."
- '"%MsBuildPath%" "src\%SolutionName%"'
only:
- master # validasi untuk branch atau tag</code></pre></noscript></div>
<p>Coba perhatikan skrip di atas, di baris ke-6 kita mendefinisikan beberapa stage yaitu <code>restore</code> dan <code>build</code>, kita bisa juga menambahkan stage yang lain misal <code>test</code>, <code>deploy</code>, <code>development</code>, <code>production</code>, dst. Stage digunakan untuk menentukan jenis dari job. Jadi perlu diingat bahwa stage dan job itu berbeda, walaupun dibanyak contoh menggunakan nama yang sama untuk stage dan job.</p>
<p>Eksekusi antar job di <a href="https://about.gitlab.com/features/gitlab-ci-cd/">GitLab CI</a> itu sifatnya independen atau dengan kata lain tidak ada hubungan antar job. Ketika job B membutuhkan file yang dihasilkan oleh job A secara default tidak bisa, sehingga kita perlu menambahkan konfigurasi <code>cache</code>, seperti yang terlihat di baris ke-10. Kita mendaftarkan folder <code>lib</code> ke dalam konfigurasi <code>cache</code>. Folder <code>lib</code> ini berisi file-file library (*.dll) hasil dari job <code>restore_nuget_package</code>. Semua file yang ada di folder <code>lib</code> ini dibutuhkan pada saat menjalankan job <code>build_solution</code>.</p>
<p>Berikutnya kita pindah ke baris 15, di baris ini kita mendefinisikan job dengan nama <code>restore_nuget_package</code> dengan tipe stage <code>restore</code>, kemudian menjalankan skrip untuk merestore paket nuget.</p>