555 lines
21 KiB
HTML
555 lines
21 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||
<meta name="description" content="">
|
||
<meta name="author" content="Eelco Visser">
|
||
<meta name="generator" content="Jekyll v3.8.5">
|
||
<title>Lab 1(d): Git(Lab), CI, and Submissions</title>
|
||
<!-- <base href="/2021"> -->
|
||
|
||
<!--link rel="canonical" href="https://getbootstrap.com/docs/4.3/examples/starter-template/"-->
|
||
|
||
<link rel="icon" href="../img/logo/pl_ico2_2B3_icon.ico" type="image/x-icon">
|
||
|
||
<!-- Bootstrap core CSS -->
|
||
<!--link href="https://getbootstrap.com/docs/4.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"-->
|
||
|
||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
|
||
|
||
|
||
|
||
<style>
|
||
.bd-placeholder-img {
|
||
font-size: 1.125rem;
|
||
text-anchor: middle;
|
||
-webkit-user-select: none;
|
||
-moz-user-select: none;
|
||
-ms-user-select: none;
|
||
user-select: none;
|
||
}
|
||
|
||
@media (min-width: 768px) {
|
||
.bd-placeholder-img-lg {
|
||
font-size: 3.5rem;
|
||
}
|
||
}
|
||
</style>
|
||
<!-- Custom styles for this template -->
|
||
<link href="../css/main.css" rel="stylesheet">
|
||
<link href="../css/borders-responsive.css" rel="stylesheet">
|
||
|
||
<link rel="stylesheet" href="../css/pl.css">
|
||
</head>
|
||
<body>
|
||
|
||
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
||
|
||
<a class="navbar-brand" href="../index.html">
|
||
TU Delft | CS4200
|
||
</a>
|
||
|
||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
|
||
<span class="navbar-toggler-icon"></span>
|
||
</button>
|
||
|
||
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
||
<ul class="navbar-nav mr-auto">
|
||
|
||
|
||
|
||
|
||
|
||
<li class="nav-item active">
|
||
<a class="nav-link" href="../lectures/index.html" tabindex="-1" aria-disabled="true">Lectures</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="nav-item active">
|
||
<a class="nav-link" href="../homework/index.html" tabindex="-1" aria-disabled="true">Homework</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="nav-item active">
|
||
<a class="nav-link" href="../project/index.html" tabindex="-1" aria-disabled="true">Project</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="nav-item active">
|
||
<a class="nav-link" href="../news/index.html" tabindex="-1" aria-disabled="true">News</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="nav-item active">
|
||
<a class="nav-link" href="../blog/index.html" tabindex="-1" aria-disabled="true">Blog</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
</nav>
|
||
|
||
|
||
<div class="container">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="row">
|
||
<div class="col-sm-12 col-md-12 col-lg-12 col-xl-12">
|
||
|
||
|
||
<div class="mt-3 mb-3 pt-3 pb-3 text-dark border-top border-bottom border-grey">
|
||
<div class="text-dark font-weight-bold">
|
||
<h1>
|
||
|
||
Lab 1(d): Git(Lab), CI, and Submissions
|
||
|
||
</h1>
|
||
</div>
|
||
<div>
|
||
|
||
|
||
</div>
|
||
<div>
|
||
|
||
|
||
Project
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
<div>
|
||
September 07, 2021
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="row">
|
||
<div class="col-sm-12 col-md-12 col-lg-9 border-lg-right border-grey">
|
||
<p>We use the Git version control system with <a href="https://gitlab.ewi.tudelft.nl">gitlab.ewi.tudelft.nl</a> to manage submissions and grade assignments.</p>
|
||
|
||
<h3 id="git">Git</h3>
|
||
|
||
<p>Download and install Git from <a href="https://git-scm.com/downloads">this page</a>. We will be using the Git command-line, since it is more powerful and easier to troubleshoot than GUI clients. On Linux and macOS, installing Git should provide a <code class="language-plaintext highlighter-rouge">git</code> command on your shell. On Windows, Git installs <code class="language-plaintext highlighter-rouge">Git BASH</code> to provide a command-line shell, which you need to start to use Git from the command-line.</p>
|
||
|
||
<p>We will explain the steps needed to work on and submit assignments on this page. To learn the basics of git, read <a href="http://rogerdudler.github.io/git-guide/">git - the simple guide</a> and <a href="https://try.github.io/">try out the Git command-line</a>. If you’d like to learn more, <a href="https://help.github.com/articles/good-resources-for-learning-git-and-github/">have a look at these resources</a>.</p>
|
||
|
||
<h3 id="repository-structure">Repository Structure</h3>
|
||
|
||
<p>Let’s look at the repository structure first.</p>
|
||
|
||
<p>On GitLab, we will create a private git repository for you, which is owned by us, and is only visible to you and the compiler construction team. This repository will host assignment templates and your submissions in <strong>protected</strong> branches. Note that you <strong>do not</strong> have write access to protected branches. You can only read from it and submit assignments to it by opening merge requests. This is to ensure that you cannot mess with submitted assignments after the deadline. You <strong>do</strong> have access to non-protected branches, and this is where you can push your work frequently.</p>
|
||
|
||
<h3 id="getting-started">Getting started</h3>
|
||
|
||
<p>First, find your private repository in the <a href="https://gitlab.ewi.tudelft.nl/CS4200/2021-2022">CS4200/2021-2022</a> group on GitLab, it should be called <code class="language-plaintext highlighter-rouge">student-id</code> where <code class="language-plaintext highlighter-rouge">id</code> is your NetID.</p>
|
||
|
||
<p>To actually do work in the Git repository, you need to make a <em>local</em> clone of the repository on your computer. You can find the URL needed to clone on the bottom right of the page, be sure to use <code class="language-plaintext highlighter-rouge">HTTPS</code>.</p>
|
||
|
||
<p><img src="../project/2021/00-submissions/clone_url.png" alt="Clone URL" /></p>
|
||
|
||
<p>Open up the command line and make a local clone with your URL:</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://gitlab.ewi.tudelft.nl/CS4200/2021-2022/student-netid.git
|
||
</code></pre></div></div>
|
||
|
||
<p>Now cd into the local clone and confirm that it works:</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>student-netid
|
||
git status
|
||
</code></pre></div></div>
|
||
|
||
<p>which should output something like:</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>On branch master
|
||
Your branch is up-to-date with <span class="s1">'origin/master'</span><span class="nb">.</span>
|
||
nothing to commit, working directory clean
|
||
</code></pre></div></div>
|
||
|
||
<p>Your local repository is set up now! Follow the steps below to work on an assignment.</p>
|
||
|
||
<h3 id="starting-an-assignment">Starting an assignment</h3>
|
||
|
||
<p>You work on each assignment in its own development branch, named <code class="language-plaintext highlighter-rouge">milestone-0-develop</code>, <code class="language-plaintext highlighter-rouge">milestone-1-develop</code>, etc.
|
||
The correct assignment branch must be checked out in your local Git repository to be able to work on it.
|
||
The steps to check out a branch depend on whether we provide you with a template, or if you continue with work from a previous assignment.</p>
|
||
|
||
<h4 id="template">Template</h4>
|
||
|
||
<p>If the assignments asks you to check out a template, which for example <code class="language-plaintext highlighter-rouge">milestone-0-template</code> does, use the following steps:</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git fetch origin
|
||
git checkout <span class="nt">-b</span> milestone-0-develop origin/milestone-0-template
|
||
git push <span class="nt">-u</span> origin milestone-0-develop
|
||
</code></pre></div></div>
|
||
|
||
<p>This checks out a fresh branch from the remote repository. It does not contain any of your previous work.</p>
|
||
|
||
<h4 id="continue-from-previous-assignment">Continue from previous assignment</h4>
|
||
|
||
<p>If the assignment asks you to continue from the previous assignment, which for example milestone 2 does, use the following steps instead:</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout <span class="nt">-b</span> milestone-2-develop
|
||
git push <span class="nt">-u</span> origin milestone-2-develop
|
||
</code></pre></div></div>
|
||
|
||
<p>The new <code class="language-plaintext highlighter-rouge">milestone-2-develop</code> branch will be in an identical state to the <code class="language-plaintext highlighter-rouge">milestone-1-develop</code> branch, but changes will only be committed to the <code class="language-plaintext highlighter-rouge">milestone-2-develop</code> branch, leaving the <code class="language-plaintext highlighter-rouge">milestone-1-develop</code> branch as is.
|
||
Now you have the assignment branch checked out in your local repository and can start working.</p>
|
||
|
||
<h3 id="saving-work">Saving work</h3>
|
||
|
||
<p>Whenever you have changes that you’d like to save, such as after getting (a part of) the assignment working, you need to add, commit, and push your changes:</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add <span class="nt">--all</span>
|
||
git commit <span class="nt">-m</span> <span class="s2">"Message describing your changes"</span>
|
||
git push
|
||
</code></pre></div></div>
|
||
|
||
<h3 id="continuous-integration-ci">Continuous Integration (CI)</h3>
|
||
|
||
<p>The template contains a <code class="language-plaintext highlighter-rouge">.gitlab-ci.yml</code> file that configures continuous integration in GitLab.
|
||
It runs <code class="language-plaintext highlighter-rouge">gradle buildAll</code> on each push to <code class="language-plaintext highlighter-rouge">milestone-*-develop</code>. It also invokes the grader when the project is submitted using a merge request.</p>
|
||
|
||
<p>By default, both language projects used for milestones 0-2 are enabled in the gradle build. If, for some reason, building of a project needs to be disabled, the following lines should be commented out in the <code class="language-plaintext highlighter-rouge">settings.gradle.kts</code> file.</p>
|
||
|
||
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>includeLanguageIfExists("chocopy.syntax")
|
||
includeLanguageIfExists("chocopy.types")
|
||
</code></pre></div></div>
|
||
|
||
<p>Enabling the build of your <em>language</em> projects in CI is <strong>recommended</strong> but <strong>not required</strong> when submitting your work.</p>
|
||
|
||
<h3 id="submitting-a-milestone">Submitting a milestone</h3>
|
||
|
||
<p><a href="https://docs.gitlab.com/ee/gitlab-basics/add-merge-request.html">Merge requests</a> are used to submit a milestone from your <em>develop</em> branch to its corresponding <em>submission</em> branch.</p>
|
||
|
||
<p>Make sure you’ve pushed all your changes first, then go to your repository on GitLab.
|
||
Navigate to <strong>Merge Requests</strong> and click the <strong>New merge request</strong> button:</p>
|
||
|
||
<p><img src="../project/2021/00-submissions/new_merge_request.png" alt="New merge request" /></p>
|
||
|
||
<p>Select the <em>develop</em> branch as source and its corresponding <em>submission</em> branch as target.
|
||
Click <em>Compare branches and continue</em>.</p>
|
||
|
||
<p>If all is well, you can review your changes and you can press the <code class="language-plaintext highlighter-rouge">Submit merge request</code> button to submit your milestone. If not, check the troubleshooting section.</p>
|
||
|
||
<p><img src="../project/2021/00-submissions/merge_request.png" alt="Merge request" /></p>
|
||
|
||
<p>We will grade your milestone and post the results as an issue in your project, so check back later.</p>
|
||
|
||
<h3 id="switching-to-another-milestone">Switching to another milestone</h3>
|
||
|
||
<p>If you’d like to work on an another milestone, for example to fix things for a new submission, you can just check out the branch for that milestone.
|
||
Be sure to push any changes to your current branch first, then check out the branch for the milestone you wish to switch to:</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout milestone-1-develop
|
||
</code></pre></div></div>
|
||
|
||
<h3 id="pulling-in-changes-from-template">Pulling in changes from template</h3>
|
||
|
||
<p>If there’s something wrong in the template for a milestone, we fix it in the <em>template</em> branch, and you have to merge in those changes.
|
||
Use the following commands to merge in changes (use the correct branch!):</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git fetch origin
|
||
git merge origin/milestone-1-template
|
||
git push
|
||
</code></pre></div></div>
|
||
|
||
<p>In most cases, Git will automatically merge in any changes, but sometimes conflicts can occur. See <a href="https://help.github.com/articles/resolving-a-merge-conflict-from-the-command-line/">Resolving a merge conflict</a> on how to resolve conflicts.</p>
|
||
|
||
<h3 id="git-gui-clients">Git GUI clients</h3>
|
||
|
||
<p>This guide uses command-line Git commands, but if you’d rather use a GUI, use <a href="https://www.sourcetreeapp.com/">SourceTree</a>.</p>
|
||
|
||
<h3 id="troubleshooting">Troubleshooting</h3>
|
||
|
||
<h4 id="cannot-push">Cannot push</h4>
|
||
|
||
<p><strong>No access/rights</strong></p>
|
||
|
||
<p>When Git complains about not being able to push because you do not have access or rights to the repository, this probably means that you’re trying to push to a <em>template</em> or <em>submission</em> branch rather than a <em>develop</em> branch.</p>
|
||
|
||
<p><strong>Out of date branch</strong></p>
|
||
|
||
<p>You cannot push changes to a remote when that remote has changes that you haven’t yet pulled, you’ll get an error like:</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git push
|
||
To ...
|
||
<span class="o">!</span> <span class="o">[</span>rejected] milestone-1-develop -> milestone-1-develop <span class="o">(</span>non-fast-forward<span class="o">)</span>
|
||
error: failed to push some refs to <span class="s1">'...'</span>
|
||
hint: Updates were rejected because the tip of your current branch is behind
|
||
hint: its remote counterpart. Integrate the remote changes <span class="o">(</span>e.g.
|
||
hint: <span class="s1">'git pull ...'</span><span class="o">)</span> before pushing again.
|
||
hint: See the <span class="s1">'Note about fast-forwards'</span> <span class="k">in</span> <span class="s1">'git push --help'</span> <span class="k">for </span>details.
|
||
</code></pre></div></div>
|
||
|
||
<p>First pull changes with <code class="language-plaintext highlighter-rouge">git pull</code> and then push your changes.</p>
|
||
|
||
<h4 id="cannot-pull">Cannot pull</h4>
|
||
|
||
<p><strong>Local changes</strong></p>
|
||
|
||
<p>When you have changes in your local repository that you have not committed yet, and you try to pull, Git may complain about your changes being overwritten.
|
||
First add and commit your changes locally with:</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add <span class="nt">--all</span>
|
||
git commit <span class="nt">-m</span> <span class="s2">"Message describing your changes"</span>
|
||
</code></pre></div></div>
|
||
|
||
<p>and then pull changes with <code class="language-plaintext highlighter-rouge">git pull</code>.</p>
|
||
|
||
<h4 id="cannot-automatically-merge-merge-request">Cannot automatically merge merge request</h4>
|
||
|
||
<p>If a merge request cannot be automatically merged, your branch is out of date with the <em>template</em> branch.
|
||
Merge in changes from the template (use the correct branch!):</p>
|
||
|
||
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git fetch origin
|
||
git merge origin/milestone-1-template
|
||
git push
|
||
</code></pre></div></div>
|
||
|
||
<h4 id="resolving-merge-conflicts">Resolving merge conflicts</h4>
|
||
|
||
<p>See <a href="https://help.github.com/articles/resolving-a-merge-conflict-from-the-command-line/">Resolving a merge conflict</a> on how to resolve merge conflicts.
|
||
You can also try a GUI merge tool such as <a href="https://sourcegear.com/diffmerge/">DiffMerge</a> to resolve merge conflicts.</p>
|
||
|
||
|
||
</div>
|
||
<div class="col-sm-12 col-md-12 col-lg-3 col-xl-3 " >
|
||
<div class="sticky-top top70 d-none d-lg-block d-xl-block">
|
||
<div class="pb4 mb3 border-bottom border-grey ">
|
||
<nav>
|
||
<ul class="pagination justify-content-left">
|
||
|
||
<li class="page-item">
|
||
<a class="page-link" href="1c.html">
|
||
«
|
||
</a>
|
||
</li>
|
||
|
||
<li class="page-item">
|
||
<a class="page-link" href="../project/index.html">
|
||
^
|
||
</a>
|
||
</li>
|
||
|
||
<li class="page-item">
|
||
<a class="page-link" href="../milestone/0.html">»</a>
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
</div>
|
||
<ul id="my_toc" class="toc list-group list-group-flush d-none d-lg-block d-xl-block p-0 ml-0 mt-3">
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#git">Git</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#repository-structure">Repository Structure</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#getting-started">Getting started</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#starting-an-assignment">Starting an assignment</a>
|
||
<ul class="toc-sub pl-0">
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#template">Template</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#continue-from-previous-assignment">Continue from previous assignment</a></li>
|
||
</ul>
|
||
</li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#saving-work">Saving work</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#continuous-integration-ci">Continuous Integration (CI)</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#submitting-a-milestone">Submitting a milestone</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#switching-to-another-milestone">Switching to another milestone</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#pulling-in-changes-from-template">Pulling in changes from template</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#git-gui-clients">Git GUI clients</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#troubleshooting">Troubleshooting</a>
|
||
<ul class="toc-sub pl-0">
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#cannot-push">Cannot push</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#cannot-pull">Cannot pull</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#cannot-automatically-merge-merge-request">Cannot automatically merge merge request</a></li>
|
||
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="1d.html#resolving-merge-conflicts">Resolving merge conflicts</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="row">
|
||
<div class="col-12">
|
||
<div class="border-top border-bottom border-grey mt-3 pt-3">
|
||
<nav>
|
||
<ul class="pagination justify-content-center">
|
||
|
||
<li class="page-item">
|
||
<a class="page-link" href="1c.html">
|
||
Previous
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="page-item">
|
||
<a class="page-link" href="../milestone/0.html">Next</a>
|
||
</li>
|
||
|
||
<li class="page-item">
|
||
<a class="page-link" href="../project/index.html">
|
||
Index
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- Optional JavaScript -->
|
||
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
|
||
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
|
||
|
||
</body>
|
||
</html>
|