From 5b1d205684cbb95878b522cca8ab70cb96d1e936 Mon Sep 17 00:00:00 2001 From: Brian (bex) Exelbierd Date: Jul 28 2018 09:50:01 +0000 Subject: antora conversion --- diff --git a/.gitignore b/.gitignore index fa62c5c..9f3ebf5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,3 @@ -## AsciiBinder-specific ignores -_preview -_package -*.swp -diag-*.png -diag-*.png.cache - -## Project-specific ignores -_l10n/pot/ +build +cache +public diff --git a/README.md b/README.md deleted file mode 100644 index bcf2acc..0000000 --- a/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Fedora Remix Creation and Maintenance - -This is the content repository for the documentation on creating and maintaining a Fedora Remix - - -## How to edit this document - -This document set is coded in AsciiDoc. Please see [https://asciidoctor.org/docs/](https://asciidoctor.org/docs/) for more information. - -## Testing your changes locally - -To test your changes, first install `asciibinder` - -`$ gem install ascii_binder` - -To build your changes, from the root directory: - -``` -$ asciibinder package -$ firefox -``` - diff --git a/_distro_map.yml b/_distro_map.yml deleted file mode 100644 index e86d2ee..0000000 --- a/_distro_map.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -fedora: - name: Remix Docs - author: Fedora Docs - site: main - site_name: Home - site_url: https://docs.fedoraproject.org/ - branches: - master: - name: - dir: master diff --git a/_images/404.html b/_images/404.html deleted file mode 100644 index 898edfb..0000000 --- a/_images/404.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - Fedora Documentation Website - - - - - - - - - - - - - -
-
- -
-
-
-

Fedora Documentation - 404 Page Not Found :(

-

Hi! You've arrived at Fedora documentation page which does not actually exist. This may be because you followed a link to an older document which has been retired. For reference, you can find those in our old document archive. Or, you can browse current docs.

-

It may also be that this page _should_ exist, but sadly does not. If this is the case, and you know what it should say, you can contribute via the Docs Project.

-
-
-
- -
-
-
- - -
-
-
- -
-
-
-
- - -

© 2017 Red Hat, Inc. and others. Please send any comments or corrections to the websites team

-
-
-
- -
-
-
- - - - - - diff --git a/_images/favicon.ico b/_images/favicon.ico deleted file mode 100644 index a912017..0000000 Binary files a/_images/favicon.ico and /dev/null differ diff --git a/_images/favicon32x32.png b/_images/favicon32x32.png deleted file mode 100644 index d33bd5e..0000000 Binary files a/_images/favicon32x32.png and /dev/null differ diff --git a/_images/fedora.svg b/_images/fedora.svg deleted file mode 100644 index e8fd52b..0000000 --- a/_images/fedora.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/_images/redhat-logo.png b/_images/redhat-logo.png deleted file mode 100644 index f085f1a..0000000 Binary files a/_images/redhat-logo.png and /dev/null differ diff --git a/_javascripts/.gitkeep b/_javascripts/.gitkeep deleted file mode 100644 index e69de29..0000000 --- a/_javascripts/.gitkeep +++ /dev/null diff --git a/_javascripts/bootstrap-offcanvas.js b/_javascripts/bootstrap-offcanvas.js deleted file mode 100644 index 62cf7b6..0000000 --- a/_javascripts/bootstrap-offcanvas.js +++ /dev/null @@ -1,6 +0,0 @@ -$(document).ready(function () { - $('[data-toggle="offcanvas"]').click(function () { - $('.sidebar').show(); - $('.row-offcanvas').toggleClass('active'); - }); -}); diff --git a/_stylesheets/asciibinder.css b/_stylesheets/asciibinder.css deleted file mode 100644 index 5ed14b9..0000000 --- a/_stylesheets/asciibinder.css +++ /dev/null @@ -1,576 +0,0 @@ -@import url(https://maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css); -/* ------------------------------------------------------------ -Image: "Spin" https://www.flickr.com/photos/eflon/3655695161/ -Author: eflon https://www.flickr.com/photos/eflon/ -License: https://creativecommons.org/licenses/by/2.0/ ----------------------------------------------------------------*/ -.attribution { - text-align: center; - position: relative; - bottom: -20px; -} -.attribution .btn { - color: #808080; - color: rgba(175,175,175, .65); - font-size: 11px; -} -.attribution .btn:hover { - text-decoration: none; - color: #aaa; -} -.popover-content { - font-size: 12px; - line-height: 1.3; - font-weight: normal; -} - -@media screen and (max-width: 980px) { - body { - margin-bottom: 200px; - } - footer { - text-align: center; - } - footer .text-right { - text-align: center !important; - } - #footer_social .first { - margin-left: 0; - } - #footer_social > a { - top: 24px; - } -} - -.fa-inverse:hover { - color: #ccc; -} - -.collapse a.active { - background-color: #DEEAF4; - color: #000; - position: relative; -} - -.collapse a.active:hover { - text-decoration: none; -} - -.collapse a.active:before { - background-color: #A0C3E5; - content: ""; - display: inline-block; - height: 100%; - left: 0; - position: absolute; - top: 0; - width: 3px; -} - -.main h2, .main .h2 { - border-top: 0px; - padding-top: 10px; - font-size: 28px; -} - -.page-header { - height: 100% !important; -} -.page-header .img-responsive { - display: inline; -} -.page-header h2 { - font-size: 32px; - display: inline; - vertical-align: bottom; -} - -.navbar-brand { - padding: initial; - height: initial; -} - -.nav > li > a.hover{ - background-color: none; -} - -h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { - position: relative; -} - -h2 > a.anchor, h3 > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { - display: block; - font-weight: normal; - margin-left: -1.5ex; - position: absolute; - text-align: center; - text-decoration: none !important; - visibility: hidden; - width: 1.5ex; - z-index: 1001; -} - -h2 > a.anchor:before, h3 > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { - content: "\f0c1"; - display: block; - font-family: FontAwesome; - font-size: 0.7em; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - padding-top: 0.2em; -} - -h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { - font-size: 1em; -} - -h2:hover > a.anchor, -h2 > a.anchor:hover, -h3:hover > a.anchor, -h3 > a.anchor:hover, -h4:hover > a.anchor, -h4 > a.anchor:hover, -h5:hover > a.anchor, -h5 > a.anchor:hover, -h6:hover > a.anchor, -h6 > a.anchor:hover { - visibility: visible; -} - -.main { - border-left: 1px solid #e7e7e7; - margin-left: -1px; - padding-left: 25px; -} - - -@media (min-width: 768px) { - .main { - padding-left: 30px; - } -} - -/* - * Sidebar - */ - -.nav-header { - font-size: 16px; -} - -.nav-header ul { - font-size: 14px; -} - -.nav-header ul li a { - display: block; - padding: 5px 20px 5px 25px; - font-size: 13px; - font-weight: normal; -} - -.nav-sidebar .fa { - text-align: center; - top: -1px; - width: 14px; -} - -.nav-sidebar li a { - color: inherit; -} - -.nav-sidebar li a:hover { - color: #000; -} - -.nav-sidebar ul li ul.nav-tertiary li a { - padding-left: 50px; -} - -.nav-sidebar > li > a { - padding: 7px 0; -} - -.nav-sidebar > li > a:focus, .nav-sidebar > li > a:hover { - background: transparent; -} - -.sidebar { - font-weight: 300; - display: none; - padding-top: 13px; -} - -@media screen and (max-width: 767px) { - .sidebar { - padding-left: 30px; - padding-right: 0; - } -} - -@media screen and (min-width: 768px) { - .sidebar { - border-right: 1px solid #e7e7e7; - display: block; - } -} - -/* - * Off Canvas - * -------------------------------------------------- - */ - -body, html { - overflow-x: hidden; /* Prevent scroll on narrow devices */ - font-family: "Overpass", sans-serif; -} - -.toggle-nav { - margin-right: 20px; -} - -@media screen and (max-width: 767px) { - .row-offcanvas { - position: relative; - -webkit-transition: all .25s ease-out; - -o-transition: all .25s ease-out; - transition: all .25s ease-out; - } - - .row-offcanvas-right { - right: 0; - } - - .row-offcanvas-left { - left: 0; - } - - .row-offcanvas-right - .sidebar-offcanvas { - right: -75%; /* 8 columns */ - } - - .row-offcanvas-left - .sidebar-offcanvas { - left: -75%; /* 8 columns */ - } - - .row-offcanvas-right.active { - right: 75%; /* 8 columns */ - } - - .row-offcanvas-left.active { - left: 75%; /* 8 columns */ - } - - .sidebar-offcanvas { - overflow: hidden; - position: absolute; - top: 0; - width: 75%; /* 8 columns */ - } -} - - p { - margin: 0 0 1.6em; - } - - /* Remnants of Asciidoctor default stylesheet - remove styles as needed */ - -#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; } -.left { float: left !important; } -.right { float: right !important; } -.text-left { text-align: left !important; } -.text-right { text-align: right !important; } -.text-center { text-align: center !important; } -.text-justify { text-align: justify !important; } -.hide { display: none; } -.subheader, #content #toctitle, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.4; color: #7a2518; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; } -abbr, acronym { text-transform: uppercase; font-size: 90%; color: #333333; border-bottom: 1px dotted #dddddd; cursor: help; } -abbr { text-transform: none; } -blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 3px solid #487c58; } -blockquote cite { display: block; font-size: inherit; color: #454545; } -blockquote cite:before { content: "\2014 \0020"; } -blockquote cite a, blockquote cite a:visited { color: #454545; } -blockquote, blockquote p { line-height: 1.6; color: #6e6e6e; } -@media only screen and (min-width: 768px) { - #toctitle, .sidebarblock > .content > .title { line-height: 1.4; } - #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; } -} -table { background: white; margin-bottom: 1.25em; border: solid 1px #dddddd; } -table thead, table tfoot { background: whitesmoke; font-weight: bold; } -table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: #333333; text-align: left; } -table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #333333; } -table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #f9f9f9; } -table tr.even.nostriping, table tr.alt, table tr:nth-of-type(even) { background: #ffffff; } -table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.6; } -.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; } -.clearfix:after, .float-group:after { clear: both; } -*:not(pre) > code { font-size: inherit; padding: 0; white-space: nowrap; background-color: inherit; border: 0 solid #dddddd; -webkit-border-radius: 4px; border-radius: 4px; text-shadow: none; line-height: 1; } -.keyseq { color: #666666; } -kbd:not(.keyseq) { display: inline-block; color: #333333; font-size: 0.75em; line-height: 1.4; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; margin: -0.15em 0.15em 0 0.15em; padding: 0.2em 0.6em 0.2em 0.5em; vertical-align: middle; white-space: nowrap; } -.keyseq kbd:first-child { margin-left: 0; } -.keyseq kbd:last-child { margin-right: 0; } -.menuseq, .menu { color: #1a1a1a; } -b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; } -b.button:before { content: "["; padding: 0 3px 0 2px; } -b.button:after { content: "]"; padding: 0 2px 0 3px; } -p a > code:hover { color: #561309; } -#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; } -#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; } -#header:after, #content:after, #footnotes:after, #footer:after { clear: both; } -#content:before { content: none; } -#header { margin-bottom: 2.5em; } -#header > h1 { color: black; font-weight: 300; border-bottom: 1px solid #d8d8d8; margin-bottom: -28px; padding-bottom: 32px; } -#header span { color: #6e6e6e; } -#header #revnumber { text-transform: capitalize; } -#header br { display: none; } -#header br + span { padding-left: 3px; } -#header br + span:before { content: "\2013 \0020"; } -#header br + span.author { padding-left: 0; } -#header br + span.author:before { content: ", "; } -#toc { border-bottom: 3px double #e5e5e5; padding-top: 1em; padding-bottom: 1.25em; } -#toc > ul { margin-left: 0.25em; } -#toc ul.sectlevel0 > li > a { font-style: italic; } -#toc ul.sectlevel0 ul.sectlevel1 { margin-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } -#toc ul { font-family: "Open Sans", "DejaVu Sans", "Sans", sans-serif; list-style-type: none; } -#toc a { text-decoration: none; } -#toc a:active { text-decoration: underline; } -#toctitle { color: #7a2518; } -@media only screen and (min-width: 768px) { body.toc2 { padding-left: 15em; padding-right: 0; } - #toc.toc2 { background-color: #fafaf9; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #e5e5e5; border-bottom: 0; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; } - #toc.toc2 #toctitle { margin-top: 0; font-size: 1.2em; } - #toc.toc2 > ul { font-size: .90em; margin-bottom: 0; } - #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; } - #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } - body.toc2.toc-right { padding-left: 0; padding-right: 15em; } - body.toc2.toc-right #toc.toc2 { border-right: 0; border-left: 1px solid #e5e5e5; left: auto; right: 0; } } -@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; } - #toc.toc2 { width: 20em; } - #toc.toc2 #toctitle { font-size: 1.375em; } - #toc.toc2 > ul { font-size: 0.95em; } - #toc.toc2 ul ul { padding-left: 1.25em; } - body.toc2.toc-right { padding-left: 0; padding-right: 20em; } } -#content #toc { border-style: solid; border-width: 1px; border-color: #e3e3dd; margin-bottom: 1.25em; padding: 1.25em; background: #fafaf9; border-width: 0; -webkit-border-radius: 4px; border-radius: 4px; } -#content #toc > :first-child { margin-top: 0; } -#content #toc > :last-child { margin-bottom: 0; } -#content #toctitle { font-size: 1.375em; } -#footer { max-width: 100%; background-color: #333333; padding: 1.25em; } -#footer-text { color: #cccccc; line-height: 1.44; } -.audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .verseblock, .videoblock { margin-bottom: 2.5em; } -.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; font-family: "Noto Serif", "DejaVu Serif", "Serif", serif; font-weight: normal; font-style: italic; } -table.tableblock > caption.title { white-space: nowrap; overflow: visible; max-width: 0; } -table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; } -.admonitionblock > table { border: 0; background: none; width: 100%; } -.admonitionblock > table td.icon { text-align: center; width: 80px; } -.admonitionblock > table td.icon img { max-width: none; } -.admonitionblock > table td.icon .title { font-weight: 300; text-transform: uppercase; } -.admonitionblock > table td.content { padding-left: 0; padding-right: 1.25em; color: #6e6e6e; } -.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; } -.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 4px; border-radius: 4px; } -.exampleblock > .content > :first-child { margin-top: 0; } -.exampleblock > .content > :last-child { margin-bottom: 0; } -.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6, .exampleblock > .content p { color: #333333; } -.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6 { line-height: 1; margin-bottom: 0.625em; } -.exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, .exampleblock > .content h3.subheader, .exampleblock > .content .subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, .exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, .exampleblock > .content h6.subheader { line-height: 1.4; } -.exampleblock.result > .content { -webkit-box-shadow: 0 1px 8px #e3e3dd; box-shadow: 0 1px 8px #e3e3dd; } -.sidebarblock { border-style: solid; border-width: 1px; border-color: #e3e3dd; margin-top: -1.0em; margin-bottom: 1.6em; margin-left: 1em; padding: .5em; background: #F1F3F5; -webkit-border-radius: 4px; border-radius: 4px; overflow-x: auto; float: right; width: 40%; } -.sidebarblock > :first-child { margin-top: 0; } -.sidebarblock > :last-child { margin-bottom: 0; } -.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6, .sidebarblock p { color: #333333; } -.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6 { line-height: 1; margin-bottom: 0.625em; } -.sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > .subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, .sidebarblock h6.subheader { line-height: 1.4; } -.sidebarblock > .content > .title { color: inherit; font-size: 28px; font-weight: 500; margin-top: 0; line-height: 1.6; } -.width50 { width: 50% ! important} -.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; } -.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { border: 0px; background-color: #F0F3F5; -webkit-border-radius: 5px; border-radius: 5px; padding: 1.5em 2.5em; word-wrap: break-word; } -.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; } -.literalblock pre > code, .literalblock pre[class] > code, .listingblock pre > code, .listingblock pre[class] > code { display: block; } -.listingblock > .content { position: relative; } -.listingblock:hover code[class*=" language-"]:before { text-transform: uppercase; font-size: 0.9em; color: #999; position: absolute; top: 0.375em; right: 0.375em; } -.listingblock:hover code.asciidoc:before { content: "asciidoc"; } -.listingblock:hover code.clojure:before { content: "clojure"; } -.listingblock:hover code.css:before { content: "css"; } -.listingblock:hover code.go:before { content: "go"; } -.listingblock:hover code.groovy:before { content: "groovy"; } -.listingblock:hover code.html:before { content: "html"; } -.listingblock:hover code.java:before { content: "java"; } -.listingblock:hover code.javascript:before { content: "javascript"; } -.listingblock:hover code.python:before { content: "python"; } -.listingblock:hover code.ruby:before { content: "ruby"; } -.listingblock:hover code.sass:before { content: "sass"; } -.listingblock:hover code.scss:before { content: "scss"; } -.listingblock:hover code.xml:before { content: "xml"; } -.listingblock:hover code.yaml:before { content: "yaml"; } -.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; } -.listingblock.terminal pre .command:not([data-prompt]):before { content: '$'; } -table.pyhltable { border: 0; margin-bottom: 0; } -table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; } -table.pyhltable td.code { padding-left: .75em; padding-right: 0; } -.highlight.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #d8d8d8; } -.highlight.pygments .lineno { display: inline-block; margin-right: .25em; } -table.pyhltable .linenodiv { background-color: transparent !important; padding-right: 0 !important; } -.quoteblock { margin: 0 0 1.25em 0; padding: 0.5625em 1.25em 0 1.1875em; border-left: 3px solid #487c58; } -.quoteblock blockquote { margin: 0 0 1.25em 0; padding: 0 0 0.625em 0; border: 0; } -.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; } -.quoteblock .attribution { margin-top: -0.625em; padding-bottom: 0.625em; font-size: inherit; color: #454545; line-height: 1.6; } -.quoteblock .attribution br { display: none; } -.quoteblock .attribution cite { display: block; } -table.tableblock { max-width: 100%; } -table.tableblock td .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; } -table.spread { width: 100%; } -table.tableblock, th.tableblock, td.tableblock { border: 0 solid #dddddd; } -table.grid-all th.tableblock, table.grid-all td.tableblock { border-width: 0 1px 1px 0; } -table.grid-all tfoot > tr > th.tableblock, table.grid-all tfoot > tr > td.tableblock { border-width: 1px 1px 0 0; } -table.grid-cols th.tableblock, table.grid-cols td.tableblock { border-width: 0 1px 0 0; } -table.grid-all * > tr > .tableblock:last-child, table.grid-cols * > tr > .tableblock:last-child { border-right-width: 0; } -table.grid-rows th.tableblock, table.grid-rows td.tableblock { border-width: 0 0 1px 0; } -table.grid-all tbody > tr:last-child > th.tableblock, table.grid-all tbody > tr:last-child > td.tableblock, table.grid-all thead:last-child > tr > th.tableblock, table.grid-rows tbody > tr:last-child > th.tableblock, table.grid-rows tbody > tr:last-child > td.tableblock, table.grid-rows thead:last-child > tr > th.tableblock { border-bottom-width: 0; } -table.grid-rows tfoot > tr > th.tableblock, table.grid-rows tfoot > tr > td.tableblock { border-width: 1px 0 0 0; } -table.frame-all { border-width: 1px; } -table.frame-sides { border-width: 0 1px; } -table.frame-topbot { border-width: 1px 0; } -th.halign-left, td.halign-left { text-align: left; } -th.halign-right, td.halign-right { text-align: right; } -th.halign-center, td.halign-center { text-align: center; } -th.valign-top, td.valign-top { vertical-align: top; } -th.valign-bottom, td.valign-bottom { vertical-align: bottom; } -th.valign-middle, td.valign-middle { vertical-align: middle; } -table thead th, table tfoot th { font-weight: bold; } -tbody tr th { display: table-cell; line-height: 1.6; background: whitesmoke; } -tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: #333333; font-weight: bold; } -td > div.verse { white-space: pre; } -ul.unstyled, ol.unnumbered, ul.checklist, ul.none { list-style-type: none; } -ul.unstyled, ol.unnumbered, ul.checklist { margin-left: 0.625em; } -ul.checklist li > p:first-child > .fa-check-square-o:first-child, ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; } -ul.checklist li > p:first-child > input[type="checkbox"]:first-child { position: relative; top: 1px; } -ul.inline { margin: 0 auto 0.625em auto; margin-left: -1.375em; margin-right: 0; padding: 0; list-style: none; overflow: hidden; } -ul.inline > li { list-style: none; float: left; margin-left: 1.375em; display: block; } -ul.inline > li > * { display: block; } -.unstyled dl dt { font-weight: normal; font-style: normal; } -ol.arabic { list-style-type: decimal; } -ol.decimal { list-style-type: decimal-leading-zero; } -ol.loweralpha { list-style-type: lower-alpha; } -ol.upperalpha { list-style-type: upper-alpha; } -ol.lowerroman { list-style-type: lower-roman; } -ol.upperroman { list-style-type: upper-roman; } -ol.lowergreek { list-style-type: lower-greek; } -.hdlist > table, .colist > table { border: 0; background: none; } -.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; } -td.hdlist1 { padding-right: .75em; font-weight: bold; } -td.hdlist1, td.hdlist2 { vertical-align: top; } -.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; } -.colist > table tr > td:first-of-type { padding: 0 .75em; line-height: 1; } -.colist > table tr > td:last-of-type { padding: 0.25em 0; } -.qanda > ol > li > p > em:only-child { color: #1d4b8f; } -.thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; } -.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; } -.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; } -.imageblock > .title { margin-bottom: 0; } -.imageblock.thumb, .imageblock.th { border-width: 6px; } -.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; } -.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; } -.image.left { margin-right: 0.625em; } -.image.right { margin-left: 0.625em; } -a.image { text-decoration: none; } -span.footnote, span.footnoteref { vertical-align: super; font-size: 0.875em; } -span.footnote a, span.footnoteref a { text-decoration: none; } -span.footnote a:active, span.footnoteref a:active { text-decoration: underline; } -#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; } -#footnotes hr { width: 20%; min-width: 6.25em; margin: -.25em 0 .75em 0; border-width: 1px 0 0 0; } -#footnotes .footnote { padding: 0 0.375em; line-height: 1.3; font-size: 0.875em; margin-left: 1.2em; text-indent: -1.2em; margin-bottom: .2em; } -#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; } -#footnotes .footnote:last-of-type { margin-bottom: 0; } -#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; } -.gist .file-data > table { border: none; background: #fff; width: 100%; margin-bottom: 0; } -.gist .file-data > table td.line-data { width: 99%; } -div.unbreakable { page-break-inside: avoid; } -.replaceable { font-style: italic; font-color: inherit; font-family: inherit; } -.parameter { font-style: italic; font-family: monospace; } -.userinput { font-weight: bold; font-family: monospace; } -.envar { font-weight: bold; font-family: monospace; font-size: 90%; } -.sysitem { font-weight: bold; font-size: 90%; } -.package { font-weight: bold; font-size: 90%; } -.filename { font-weight: bold; font-style: italic; font-size: 90%; } -.big { font-size: larger; } -.small { font-size: smaller; } -.underline { text-decoration: underline; } -.overline { text-decoration: overline; } -.line-through { text-decoration: line-through; } -.aqua { color: #00bfbf; } -.aqua-background { background-color: #00fafa; } -.black { color: black; } -.black-background { background-color: black; } -.blue { color: #0000bf; } -.blue-background { background-color: #0000fa; } -.fuchsia { color: #bf00bf; } -.fuchsia-background { background-color: #fa00fa; } -.gray { color: #606060; } -.gray-background { background-color: #7d7d7d; } -.green { color: #006000; } -.green-background { background-color: #007d00; } -.lime { color: #00bf00; } -.lime-background { background-color: #00fa00; } -.maroon { color: #600000; } -.maroon-background { background-color: #7d0000; } -.navy { color: #000060; } -.navy-background { background-color: #00007d; } -.olive { color: #606000; } -.olive-background { background-color: #7d7d00; } -.purple { color: #600060; } -.purple-background { background-color: #7d007d; } -.red { color: #bf0000; } -.red-background { background-color: #fa0000; } -.silver { color: #909090; } -.silver-background { background-color: #bcbcbc; } -.teal { color: #006060; } -.teal-background { background-color: #007d7d; } -.white { color: #bfbfbf; } -.white-background { background-color: #fafafa; } -.yellow { color: #bfbf00; } -.yellow-background { background-color: #fafa00; } -span.icon > .fa { cursor: default; } -.admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; cursor: default; } -.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #4E9FDD; } -.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; color: #2C8596; } -.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #ec7a08; } -.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #ec7a08; } -.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #c00; } -.conum[data-value] { display: inline-block; color: white !important; background-color: #333333; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; width: 20px; height: 20px; font-size: 12px; line-height: 20px; font-family: "Open Sans", "Sans", sans-serif; font-style: normal; font-weight: bold; text-indent: -1px; } -.conum[data-value] * { color: white !important; } -.conum[data-value] + b { display: none; } -.conum[data-value]:after { content: attr(data-value); } -pre .conum[data-value] { position: relative; top: -2px; } -b.conum * { color: inherit !important; } -.conum:not([data-value]):empty { display: none; } -.print-only { display: none !important; } -@media print { @page { margin: 1.25cm 0.75cm; } - * { -webkit-box-shadow: none !important; box-shadow: none !important; text-shadow: none !important; } - a, a:visited { color: inherit !important; text-decoration: underline !important; } - a[href^="http:"]:after, a[href^="https:"]:after { content: " (" attr(href) ")"; } - a[href^="#"], a[href^="#"]:visited, a[href^="mailto:"], a[href^="mailto:"]:visited { text-decoration: none !important; } - abbr[title]:after { content: " (" attr(title) ")"; } - pre, blockquote { page-break-inside: avoid; } - code { color: #191919; } - thead { display: table-header-group; } - tr, img { page-break-inside: avoid; } - img { max-width: 100% !important; } - p { orphans: 3; widows: 3; } - h2, h3, #toctitle, .sidebarblock > .content > .title, #toctitle, .sidebarblock > .content > .title { page-break-after: avoid; } - #toc, .sidebarblock { background: none !important; } - #toc { border-bottom: 1px solid #d8d8d8 !important; padding-bottom: 0 !important; } - .sect1 { padding-bottom: 0 !important; } - .sect1 + .sect1 { border: none !important; } - body.book #header { text-align: center; } - body.book #header > h1 { border: none !important; margin: 2.5em 0 1em 0; padding: 0; } - body.book #header span { line-height: 1.6; } - body.book #header br { display: block; } - body.book #header br + span { padding-left: 0; } - body.book #header br + span:before { content: none !important; } - body.book #toc { border: none !important; text-align: left !important; padding: 0 !important; } - #footer { background: none !important; } - #footer-text { color: #333333 !important; } - .hide-on-print { display: none !important; } - .print-only { display: block !important; } - .hide-for-print { display: none !important; } - .show-for-print { display: inherit !important; } } diff --git a/_templates/_css.html.erb b/_templates/_css.html.erb deleted file mode 100644 index 0fca7ae..0000000 --- a/_templates/_css.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -<%- Dir.glob("_stylesheets/*").sort.each do |sheet| -%> - -<%- end -%> diff --git a/_templates/_nav.html.erb b/_templates/_nav.html.erb deleted file mode 100644 index 95a7e5c..0000000 --- a/_templates/_nav.html.erb +++ /dev/null @@ -1,31 +0,0 @@ - diff --git a/_templates/page.html.erb b/_templates/page.html.erb deleted file mode 100644 index ded5df7..0000000 --- a/_templates/page.html.erb +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - <%= distro %> <%= version %> | <%= [group_title, subgroup_title, topic_title].compact.join(' | ') %> - - - - - - - - - <%= render("_templates/_css.html.erb", :css_path => css_path) %> - - - - - - " rel="shortcut icon" type="text/css"> - - - - - -
-

- -

- -
- -
- - <%= content %> -
-
-
-
-
-
- - -
- -
-
- - -

© 2017 Red Hat, Inc. and others. Please send any comments or corrections to the websites team

-
-
-
- -
-
-
- - - - - - - - diff --git a/_topic_map.yml b/_topic_map.yml deleted file mode 100644 index 1aa5bf4..0000000 --- a/_topic_map.yml +++ /dev/null @@ -1,28 +0,0 @@ -# This configuration file dictates the organization of the topic groups and -# topics on the main page of the doc site for this branch. Each record -# consists of the following: -# -# --- <= Record delimiter -# Name: Origin of the Species <= Display name of topic group -# Dir: origin_of_the_species <= Directory name of topic group -# Topics: -# - Name: The Majestic Marmoset <= Topic name -# File: the_majestic_marmoset <= Topic file under group dir +/- -# - Name: The Curious Crocodile <= Topic 2 name -# File: the_curious_crocodile <= Topic 2 file -# - Name: The Numerous Nematodes <= Sub-topic group name -# Dir: the_numerous_nematodes <= Sub-topic group dir -# Topics: -# - Name: The Wily Worm <= Sub-topic name -# File: the_wily_worm <= Sub-topic file under / -# - Name: The Acrobatic Ascarid <= Sub-topic 2 name -# File: the_acrobatic_ascarid <= Sub-topic 2 file under / -# -# The ordering of the records in this document determines the ordering of the -# topic groups and topics on the main page. ---- -Name: Remix Documentation -Dir: remix-docs -Topics: - - Name: Automated Build System For Remixes Without Koji - File: remix-ci diff --git a/antora.yml b/antora.yml new file mode 100644 index 0000000..08ecdf4 --- /dev/null +++ b/antora.yml @@ -0,0 +1,6 @@ +name: remix-building +title: Remix Docs +version: master +start_page: ROOT:remix-ci +nav: +- modules/ROOT/nav.adoc diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..c9349e3 --- /dev/null +++ b/build.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +if [ "$(uname)" == "Darwin" ]; then + # Running on macOS. + # Let's assume that the user has the Docker CE installed + # which doesn't require a root password. + docker run --rm -it -v $(pwd):/antora antora/antora --html-url-extension-style=indexify site.yml + +elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then + # Running on Linux. + # Let's assume that it's running the Docker deamon + # which requires root. + echo "" + echo "This build script is using Docker to run the build in an isolated environment. You might be asked for a root password in order to start it." +sudo docker run --rm -it -v $(pwd):/antora:z antora/antora --html-url-extension-style=indexify site.yml +fi diff --git a/index-main.html b/index-main.html deleted file mode 100644 index 472b880..0000000 --- a/index-main.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - Fedora Remix Docs Website - - - - - - - - - - - - - - -
-
- -
-
-
-

Fedora Remix Docs Site

-

Test Build.

-
-
-
Fedora Remix Docs
- -
-
-
-
-
-
- - -
-
-
- -
-
-
-
- - -

© 2017 Red Hat, Inc. and others. Please send any comments or corrections to the websites team

-
-
-
- -
-
-
- - - - - - diff --git a/modules/ROOT/assets/attachments/playbook-builder.yml b/modules/ROOT/assets/attachments/playbook-builder.yml new file mode 100644 index 0000000..50cade4 --- /dev/null +++ b/modules/ROOT/assets/attachments/playbook-builder.yml @@ -0,0 +1,80 @@ +--- +- hosts: 127.0.0.1 + tasks: + - name: Install packages + dnf: name="{{ item }}" state=present + become: true + with_items: + - copr-rpmbuild + - dnf-automatic + - fail2ban + - fail2ban-server + - git + - iptables + - jenkins + - openssh-server + - python-jenkins + - pungi + - mosh + - rpm-sign + - vim + # need to get anaconda install class for TigerOS possibly + - name: Allow SSH access + firewalld: + service: ssh + permanent: true + state: enabled + - name: Allow 8080 (Jenkins) + firewalld: + port: 8080/tcp + permanent: true + state: enabled + - name: Allow Cockpit + firewalld: + service: cockpit + permanent: true + state: enabled + - name: Enable Jenkins service + systemd: + name: jenkins + enabled: yes + state: started + - name: Enable Cockpit service + systemd: + name: cockpit + enabled: yes + state: started + - name: Enable sshd (openssh-server) service + systemd: + name: sshd + enabled: yes + state: started + - name: Enable fail2ban service + systemd: + name: fail2ban + enabled: yes + state: started + - name: Reload Firewall + command: firewall-cmd --reload + become: true + - name: Update packages + command: dnf update + become: true + - name: Allow Jenkins sudo access for devel + become: true + lineinfile: + path: /etc/sudoers + line: 'jenkins ALL=NOPASSWD: /path/to/jenkins/job/script' + state: present + - name: Allow Jenkins sudo access for master + become: true + lineinfile: + path: /etc/sudoers + line: 'jenkins ALL=NOPASSWD: /path/to/jenkins/job/script' + state: present +# - jenkins_job: +# name: TigerOS-Master +# state: present +# - jenkins_job: +# name: TigerOS-Devel +# state: present diff --git a/modules/ROOT/assets/attachments/playbook-mirror.yml b/modules/ROOT/assets/attachments/playbook-mirror.yml new file mode 100644 index 0000000..33fe898 --- /dev/null +++ b/modules/ROOT/assets/attachments/playbook-mirror.yml @@ -0,0 +1,169 @@ +--- +- hosts: all + tasks: + - name: Create a login user + user: + name: mirror + # generated with python3 -c "from passlib.hash import sha512_crypt; import getpass; hash=sha512_crypt.using(rounds=5000).hash(getpass.getpass());print(hash)" + password: ' fill with a sha512 hash for your password' + groups: # Empty by default, here we give it some groups + - wheel + state: present + become: true + - name: Install EPEL + yum: name="https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm" state=present + become: true + - name: Install packages + yum: name="{{ item }}" state=present + become: true + with_items: + - certbot + - cockpit + - createrepo_c + - fail2ban + - fail2ban-server + - firewalld + - git + - iptables + - nginx + - openssh-server + - vim + - name: Install python-firewall + package: name=python-firewall + when: ansible_python_version|version_compare('3', '<') + become: true + - name: Install python3-firewall + package: name=python3-firewall + when: ansible_python_version|version_compare('3', '>=') + become: true + - name: Enable and start firewalld service + service: + name: firewalld + state: started + enabled: yes + become: true + - name: Allow HTTPS (nginx) + firewalld: + service: https + permanent: true + state: enabled + become: true + - name: Allow HTTP (nginx) + firewalld: + service: http + permanent: true + state: enabled + become: true + - name: Allow SSH access + firewalld: + service: ssh + permanent: true + state: enabled + become: true + - name: Allow Cockpit + firewalld: + service: cockpit + permanent: true + state: enabled + become: true + - name: Enable nginx service + systemd: + name: nginx + enabled: yes + state: started + become: true + - name: Enable Cockpit service + become: true + systemd: + name: cockpit + enabled: yes + state: started + - name: Enable sshd (openssh-server) service + become: true + systemd: + name: sshd + enabled: yes + state: started + - name: Enable fail2ban service + become: true + systemd: + name: fail2ban + enabled: yes + state: started + - name: Reload Firewall + command: firewall-cmd --reload + become: true + - name: Update packages + command: yum update -y + become: true + - name: Add certbot autorenewal + become: true + cron: + name: "Certbot autorenew" + user: "root" + minute: "*" + hour: "7" + day: "19" + month: "*" + weekday: "*" + job: "certbot-3 -q renew" + - name: Install nginx config + become: true + copy: + dest: /etc/nginx/nginx.conf + mode: 0644 + owner: root + group: root + content: | + # For more information on configuration, see: + # * Official English Documentation: http://nginx.org/en/docs/ + # * Official Russian Documentation: http://nginx.org/ru/docs/ + + user nginx; + worker_processes auto; + error_log /var/log/nginx/error.log; + pid /run/nginx.pid; + + # Load dynamic modules. See /usr/share/nginx/README.dynamic. + include /usr/share/nginx/modules/*.conf; + + events { + worker_connections 1024; + } + http{ + server { + listen 80; + server_name server FQDN; + root /var/www/; + # Load configuration files for the default server block. + include /etc/nginx/default.d/*.conf; + location / { + autoindex on; + autoindex_exact_size off; + } + + error_page 404 /404.html; + location = /40x.html { + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + } + } + } + - name: Create webserver directories + become: true + file: + path: "{{ item }}" + owner: root + group: nginx + mode: 0755 + state: directory + with_items: + - /var/www/server_name/remix name/version/release/ + - /var/www/server_name/remix name/ + - /var/www/server_name/remix name/version/ + - /var/www/server_name/remix name/version/release/ + - /var/www/server_name/remix name/version/packages/ + - /var/www/server_name/remix name/version/packages/source/ + - /var/www/server_name/rewmix name/version/packages/x86_64/ diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc new file mode 100644 index 0000000..0725c42 --- /dev/null +++ b/modules/ROOT/nav.adoc @@ -0,0 +1 @@ +* xref:remix-ci.adoc[Automated Build System For Remixes Without Koji] diff --git a/modules/ROOT/pages/remix-ci.adoc b/modules/ROOT/pages/remix-ci.adoc new file mode 100644 index 0000000..8e1e5f6 --- /dev/null +++ b/modules/ROOT/pages/remix-ci.adoc @@ -0,0 +1,84 @@ +[automated-build-system-for-remixes-without-koji]] += Automated Build System For Remixes Without Koji + +This document outlines the process of creating an automated RPM and ISO building infrastructure for smaller https://fedoraproject.org/wiki/Remix[Fedora Remix] projects that do not make use of Fedora's Koji ecosystem. + +[[basic-setup]] +== Basic Setup + +It is best practice to keep the web server and builder separate. + +The web server is a CentOS system. +It's main purpose is to host the public ISO downloads and package repository. +The link:{attachmentsdir}/playbook-builder.yml[playbook-mirror.yml] Ansible playbook located in this repository automates the provisioning of the web server. +The choice of CentOS was to maximize support time and stay within the RHEL family. +It could just as easily be a Debian server though the playbook would need to be adjusted. + +The builder is a Fedora system provisioned using the link:{attachmentsdir}/playbook-mirror.yml[playbook-builder.yml] Ansible playbook. +The builder is a Jenkins CI server which rebuilds RPMs when changes are made in the version control. +The automation should be configured in Jenkins to trigger on a push to `master` for each repo housing package sources. + +[[RPMs]] +== RPMs + +The series of commands shown below illustrates the process of building RPM packages with Jenkins. + +.... +sudo rm -rf /home/$USER/to-sign/ +mkdir -p /home/$USER/to-sign/ +copr-rpmbuild scm --clone-url [URL of git repo with package source] --chroot \ +fedora-$(lsb_release -a | grep Release | cut -f2)-x86_64 +sudo cp /var/lib/copr-rpmbuild/results/*.rpm /home/$USER/to-sign +rm -rf /var/lib/copr-rpmbuild/results +.... + +Once the RPM build finishes, a responsible team member then needs to connect to the build server via SSH in order to sign the completed RPM package using: + +`sudo rpmsign --addsign /path/to/to-sign/directory/*rpm` + +A tool such as `rsync` should then be used to push the new packages to the mirror. After verifying the permissions are correct, run: + +`sudo createrepo_c --update /path/to/RPMs or SRPMs` + +on the mirror in order to update the proper RPM repository. + +[[ISOs]] +== ISOs + +ISOs should be built as needed. In order to build an ISO, you need two prerequisites: + +. A kickstart file to be used by the https://fedoraproject.org/wiki/Anaconda[Anaconda Installer] +. The `lorax-lmc-novirt` and `pykickstart` Fedora packages + +=== Initial ISO Building + +. Clone the Fedora Kickstarts repository: `git clone https://pagure.io/fedora-kickstarts.git` +. Enter the directory: `cd fedora-kickstarts/` +. Choose a kickstart to use as a base for your remix +. Flatten the kickstart: `ksflatten --config [name of kickstart].ks -o flat-[name of kickstart].ks --version [fedora version]` +. Edit the `%packages` section of the flat kickstart if you wish to add/remove base packages +. Set `SELinux` to permissive with: `sudo setenforce 0` +. Run `livemedia-creator`: + + sudo livemedia-creator --ks /path/to/flat/kickstart/file --no-virt \ + --resultdir /var/lmc --project [image name] --make-iso --volid [image name] \ + --iso-only --iso-name [image name].iso --releasever [fedora release] \ + --title [image name] --macboot + +. The resulting ISO will be in `/var/lib/lmc`. +. Finally, set `SELinux` back to enforcing: `sudo setenforce 1` + +=== General ISO Building + +After an initial ISO build, a new ISO may be created by running: + +.... +setenforce 0 +livemedia-creator --ks [kickstart-name].ks --no-virt --resultdir /var/lmc \ +--project [remix name]-Live --make-iso --volid [remix name] \ +--iso-only --iso-name [remix name].iso --releasever $vers \ +--title [remix name]-live --macboot +setenforce 1 +.... + +You may want to consider automating the ISO build with Jenkins. diff --git a/preview.sh b/preview.sh new file mode 100755 index 0000000..acab783 --- /dev/null +++ b/preview.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ "$(uname)" == "Darwin" ]; then + # Running on macOS. + # Let's assume that the user has the Docker CE installed + # which doesn't require a root password. + echo "The preview will be available at http://localhost:8080/" + docker run --rm -v $(pwd)/public:/usr/share/nginx/html:ro -p 8080:80 nginx + +elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then + # Running on Linux. + # Let's assume that it's running the Docker deamon + # which requires root. + echo "" + echo "This build script is using Docker to run the build in an isolated environment. You might be asked for a root password in order to start it." + echo "The preview will be available at http://localhost:8080/" + sudo docker run --rm -v $(pwd)/public:/usr/share/nginx/html:ro -p 8080:80 nginx +fi diff --git a/remix-docs/playbook-builder.yml b/remix-docs/playbook-builder.yml deleted file mode 100644 index 50cade4..0000000 --- a/remix-docs/playbook-builder.yml +++ /dev/null @@ -1,80 +0,0 @@ ---- -- hosts: 127.0.0.1 - tasks: - - name: Install packages - dnf: name="{{ item }}" state=present - become: true - with_items: - - copr-rpmbuild - - dnf-automatic - - fail2ban - - fail2ban-server - - git - - iptables - - jenkins - - openssh-server - - python-jenkins - - pungi - - mosh - - rpm-sign - - vim - # need to get anaconda install class for TigerOS possibly - - name: Allow SSH access - firewalld: - service: ssh - permanent: true - state: enabled - - name: Allow 8080 (Jenkins) - firewalld: - port: 8080/tcp - permanent: true - state: enabled - - name: Allow Cockpit - firewalld: - service: cockpit - permanent: true - state: enabled - - name: Enable Jenkins service - systemd: - name: jenkins - enabled: yes - state: started - - name: Enable Cockpit service - systemd: - name: cockpit - enabled: yes - state: started - - name: Enable sshd (openssh-server) service - systemd: - name: sshd - enabled: yes - state: started - - name: Enable fail2ban service - systemd: - name: fail2ban - enabled: yes - state: started - - name: Reload Firewall - command: firewall-cmd --reload - become: true - - name: Update packages - command: dnf update - become: true - - name: Allow Jenkins sudo access for devel - become: true - lineinfile: - path: /etc/sudoers - line: 'jenkins ALL=NOPASSWD: /path/to/jenkins/job/script' - state: present - - name: Allow Jenkins sudo access for master - become: true - lineinfile: - path: /etc/sudoers - line: 'jenkins ALL=NOPASSWD: /path/to/jenkins/job/script' - state: present -# - jenkins_job: -# name: TigerOS-Master -# state: present -# - jenkins_job: -# name: TigerOS-Devel -# state: present diff --git a/remix-docs/playbook-mirror.yml b/remix-docs/playbook-mirror.yml deleted file mode 100644 index 33fe898..0000000 --- a/remix-docs/playbook-mirror.yml +++ /dev/null @@ -1,169 +0,0 @@ ---- -- hosts: all - tasks: - - name: Create a login user - user: - name: mirror - # generated with python3 -c "from passlib.hash import sha512_crypt; import getpass; hash=sha512_crypt.using(rounds=5000).hash(getpass.getpass());print(hash)" - password: ' fill with a sha512 hash for your password' - groups: # Empty by default, here we give it some groups - - wheel - state: present - become: true - - name: Install EPEL - yum: name="https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm" state=present - become: true - - name: Install packages - yum: name="{{ item }}" state=present - become: true - with_items: - - certbot - - cockpit - - createrepo_c - - fail2ban - - fail2ban-server - - firewalld - - git - - iptables - - nginx - - openssh-server - - vim - - name: Install python-firewall - package: name=python-firewall - when: ansible_python_version|version_compare('3', '<') - become: true - - name: Install python3-firewall - package: name=python3-firewall - when: ansible_python_version|version_compare('3', '>=') - become: true - - name: Enable and start firewalld service - service: - name: firewalld - state: started - enabled: yes - become: true - - name: Allow HTTPS (nginx) - firewalld: - service: https - permanent: true - state: enabled - become: true - - name: Allow HTTP (nginx) - firewalld: - service: http - permanent: true - state: enabled - become: true - - name: Allow SSH access - firewalld: - service: ssh - permanent: true - state: enabled - become: true - - name: Allow Cockpit - firewalld: - service: cockpit - permanent: true - state: enabled - become: true - - name: Enable nginx service - systemd: - name: nginx - enabled: yes - state: started - become: true - - name: Enable Cockpit service - become: true - systemd: - name: cockpit - enabled: yes - state: started - - name: Enable sshd (openssh-server) service - become: true - systemd: - name: sshd - enabled: yes - state: started - - name: Enable fail2ban service - become: true - systemd: - name: fail2ban - enabled: yes - state: started - - name: Reload Firewall - command: firewall-cmd --reload - become: true - - name: Update packages - command: yum update -y - become: true - - name: Add certbot autorenewal - become: true - cron: - name: "Certbot autorenew" - user: "root" - minute: "*" - hour: "7" - day: "19" - month: "*" - weekday: "*" - job: "certbot-3 -q renew" - - name: Install nginx config - become: true - copy: - dest: /etc/nginx/nginx.conf - mode: 0644 - owner: root - group: root - content: | - # For more information on configuration, see: - # * Official English Documentation: http://nginx.org/en/docs/ - # * Official Russian Documentation: http://nginx.org/ru/docs/ - - user nginx; - worker_processes auto; - error_log /var/log/nginx/error.log; - pid /run/nginx.pid; - - # Load dynamic modules. See /usr/share/nginx/README.dynamic. - include /usr/share/nginx/modules/*.conf; - - events { - worker_connections 1024; - } - http{ - server { - listen 80; - server_name server FQDN; - root /var/www/; - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - location / { - autoindex on; - autoindex_exact_size off; - } - - error_page 404 /404.html; - location = /40x.html { - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - } - } - } - - name: Create webserver directories - become: true - file: - path: "{{ item }}" - owner: root - group: nginx - mode: 0755 - state: directory - with_items: - - /var/www/server_name/remix name/version/release/ - - /var/www/server_name/remix name/ - - /var/www/server_name/remix name/version/ - - /var/www/server_name/remix name/version/release/ - - /var/www/server_name/remix name/version/packages/ - - /var/www/server_name/remix name/version/packages/source/ - - /var/www/server_name/rewmix name/version/packages/x86_64/ diff --git a/remix-docs/remix-ci.adoc b/remix-docs/remix-ci.adoc deleted file mode 100644 index cd332e2..0000000 --- a/remix-docs/remix-ci.adoc +++ /dev/null @@ -1,84 +0,0 @@ -[automated-build-system-for-remixes-without-koji]] -= Automated Build System For Remixes Without Koji - -This document outlines the process of creating an automated RPM and ISO building infrastructure for smaller https://fedoraproject.org/wiki/Remix[Fedora Remix] projects that do not make use of Fedora's Koji ecosystem. - -[[basic-setup]] -== Basic Setup - -It is best practice to keep the web server and builder separate. - -The web server is a CentOS system. -It's main purpose is to host the public ISO downloads and package repository. -The https://pagure.io/fedora-docs/remix-building/blob/master/f/playbook-mirror.yml[playbook-mirror.yml] Ansible playbook located in this repository automates the provisioning of the web server. -The choice of CentOS was to maximize support time and stay within the RHEL family. -It could just as easily be a Debian server though the playbook would need to be adjusted. - -The builder is a Fedora system provisioned using the https://pagure.io/fedora-docs/remix-building/blob/master/f/playbook-builder.yml[playbook-builder.yml] Ansible playbook. -The builder is a Jenkins CI server which rebuilds RPMs when changes are made in the version control. -The automation should be configured in Jenkins to trigger on a push to `master` for each repo housing package sources. - -[[RPMs]] -== RPMs - -The series of commands shown below illustrates the process of building RPM packages with Jenkins. - -.... -sudo rm -rf /home/$USER/to-sign/ -mkdir -p /home/$USER/to-sign/ -copr-rpmbuild scm --clone-url [URL of git repo with package source] --chroot \ -fedora-$(lsb_release -a | grep Release | cut -f2)-x86_64 -sudo cp /var/lib/copr-rpmbuild/results/*.rpm /home/$USER/to-sign -rm -rf /var/lib/copr-rpmbuild/results -.... - -Once the RPM build finishes, a responsible team member then needs to connect to the build server via SSH in order to sign the completed RPM package using: - -`sudo rpmsign --addsign /path/to/to-sign/directory/*rpm` - -A tool such as `rsync` should then be used to push the new packages to the mirror. After verifying the permissions are correct, run: - -`sudo createrepo_c --update /path/to/RPMs or SRPMs` - -on the mirror in order to update the proper RPM repository. - -[[ISOs]] -== ISOs - -ISOs should be built as needed. In order to build an ISO, you need two prerequisites: - -. A kickstart file to be used by the https://fedoraproject.org/wiki/Anaconda[Anaconda Installer] -. The `lorax-lmc-novirt` and `pykickstart` Fedora packages - -=== Initial ISO Building - -. Clone the Fedora Kickstarts repository: `git clone https://pagure.io/fedora-kickstarts.git` -. Enter the directory: `cd fedora-kickstarts/` -. Choose a kickstart to use as a base for your remix -. Flatten the kickstart: `ksflatten --config [name of kickstart].ks -o flat-[name of kickstart].ks --version [fedora version]` -. Edit the `%packages` section of the flat kickstart if you wish to add/remove base packages -. Set `SELinux` to permissive with: `sudo setenforce 0` -. Run `livemedia-creator`: - - sudo livemedia-creator --ks /path/to/flat/kickstart/file --no-virt \ - --resultdir /var/lmc --project [image name] --make-iso --volid [image name] \ - --iso-only --iso-name [image name].iso --releasever [fedora release] \ - --title [image name] --macboot - -. The resulting ISO will be in `/var/lib/lmc`. -. Finally, set `SELinux` back to enforcing: `sudo setenforce 1` - -=== General ISO Building - -After an initial ISO build, a new ISO may be created by running: - -.... -setenforce 0 -livemedia-creator --ks [kickstart-name].ks --no-virt --resultdir /var/lmc \ ---project [remix name]-Live --make-iso --volid [remix name] \ ---iso-only --iso-name [remix name].iso --releasever $vers \ ---title [remix name]-live --macboot -setenforce 1 -.... - -You may want to consider automating the ISO build with Jenkins. diff --git a/site.yml b/site.yml new file mode 100644 index 0000000..2400d2d --- /dev/null +++ b/site.yml @@ -0,0 +1,20 @@ +site: + title: Remix Docs + start_page: remix-building::remix-ci +content: + sources: + - url: . + branches: HEAD +ui: + bundle: + url: https://asamalik.fedorapeople.org/ui-bundle.zip + snapshot: true + default_layout: with_menu +output: + clean: true + dir: ./public + destinations: + - provider: archive +runtime: + pull: true + cache_dir: ./cache